CI: Re-enable Windows builds
[platform/upstream/mesa.git] / .gitlab-ci / container / gitlab-ci.yml
1 # Docker image tag helper templates
2
3 .incorporate-templates-commit:
4   variables:
5     FDO_DISTRIBUTION_TAG: "${MESA_IMAGE_TAG}--${MESA_TEMPLATES_COMMIT}"
6
7 .incorporate-base-tag+templates-commit:
8   variables:
9     FDO_BASE_IMAGE: "${CI_REGISTRY_IMAGE}/${MESA_BASE_IMAGE}:${MESA_BASE_TAG}--${MESA_TEMPLATES_COMMIT}"
10     FDO_DISTRIBUTION_TAG: "${MESA_IMAGE_TAG}--${MESA_BASE_TAG}--${MESA_TEMPLATES_COMMIT}"
11
12 .set-image:
13   extends:
14     - .incorporate-templates-commit
15   variables:
16     MESA_IMAGE: "$CI_REGISTRY_IMAGE/${MESA_IMAGE_PATH}:${FDO_DISTRIBUTION_TAG}"
17   image: "$MESA_IMAGE"
18
19 .set-image-base-tag:
20   extends:
21     - .set-image
22     - .incorporate-base-tag+templates-commit
23   variables:
24     MESA_IMAGE: "$CI_REGISTRY_IMAGE/${MESA_IMAGE_PATH}:${FDO_DISTRIBUTION_TAG}"
25
26
27 # Build the CI docker images.
28 #
29 # MESA_IMAGE_TAG is the tag of the docker image used by later stage jobs. If the
30 # image doesn't exist yet, the container stage job generates it.
31 #
32 # In order to generate a new image, one should generally change the tag.
33 # While removing the image from the registry would also work, that's not
34 # recommended except for ephemeral images during development: Replacing
35 # an image after a significant amount of time might pull in newer
36 # versions of gcc/clang or other packages, which might break the build
37 # with older commits using the same tag.
38 #
39 # After merging a change resulting in generating a new image to the
40 # main repository, it's recommended to remove the image from the source
41 # repository's container registry, so that the image from the main
42 # repository's registry will be used there as well.
43
44 .container:
45   stage: container
46   extends:
47     - .container-rules
48     - .incorporate-templates-commit
49   variables:
50     FDO_DISTRIBUTION_VERSION: bullseye-slim
51     FDO_REPO_SUFFIX: $CI_JOB_NAME
52     FDO_DISTRIBUTION_EXEC: 'env FDO_CI_CONCURRENT=${FDO_CI_CONCURRENT} bash .gitlab-ci/container/${CI_JOB_NAME}.sh'
53     # no need to pull the whole repo to build the container image
54     GIT_STRATEGY: none
55
56 .use-base-image:
57   extends:
58     - .container
59     - .incorporate-base-tag+templates-commit
60     # Don't want the .container rules
61     - .ci-run-policy
62
63 # Debian 11 based x86 build image base
64 debian/x86_build-base:
65   extends:
66     - .fdo.container-build@debian
67     - .container
68   variables:
69     MESA_IMAGE_TAG: &debian-x86_build-base ${DEBIAN_BASE_TAG}
70
71 .use-debian/x86_build-base:
72   extends:
73     - .fdo.container-build@debian
74     - .use-base-image
75   variables:
76     MESA_BASE_IMAGE: ${DEBIAN_X86_BUILD_BASE_IMAGE}
77     MESA_BASE_TAG: *debian-x86_build-base
78     MESA_ARTIFACTS_BASE_TAG: *debian-x86_build-base
79   needs:
80     - debian/x86_build-base
81
82 # Debian 11 based x86 main build image
83 debian/x86_build:
84   extends:
85     - .use-debian/x86_build-base
86   variables:
87     MESA_IMAGE_TAG: &debian-x86_build ${DEBIAN_BUILD_TAG}
88
89 .use-debian/x86_build:
90   extends:
91     - .set-image-base-tag
92   variables:
93     MESA_BASE_TAG: *debian-x86_build-base
94     MESA_IMAGE_PATH: ${DEBIAN_X86_BUILD_IMAGE_PATH}
95     MESA_IMAGE_TAG: *debian-x86_build
96   needs:
97     - debian/x86_build
98
99 # Debian 11 based i386 cross-build image
100 debian/i386_build:
101   extends:
102     - .use-debian/x86_build-base
103   variables:
104     MESA_IMAGE_TAG: &debian-i386_build ${DEBIAN_BUILD_TAG}
105
106 .use-debian/i386_build:
107   extends:
108     - .set-image-base-tag
109   variables:
110     MESA_BASE_TAG: *debian-x86_build-base
111     MESA_IMAGE_PATH: "debian/i386_build"
112     MESA_IMAGE_TAG: *debian-i386_build
113   needs:
114     - debian/i386_build
115
116 # Debian 11 based ppc64el cross-build image
117 debian/ppc64el_build:
118   extends:
119     - .use-debian/x86_build-base
120   variables:
121     MESA_IMAGE_TAG: &debian-ppc64el_build ${DEBIAN_BUILD_TAG}
122
123 .use-debian/ppc64el_build:
124   extends:
125     - .set-image-base-tag
126   variables:
127     MESA_BASE_TAG: *debian-x86_build-base
128     MESA_IMAGE_PATH: "debian/ppc64el_build"
129     MESA_IMAGE_TAG: *debian-ppc64el_build
130   needs:
131     - debian/ppc64el_build
132
133 # Debian 11 based s390x cross-build image
134 debian/s390x_build:
135   extends:
136     - .use-debian/x86_build-base
137   variables:
138     MESA_IMAGE_TAG: &debian-s390x_build ${DEBIAN_BUILD_TAG}
139
140 .use-debian/s390x_build:
141   extends:
142     - .set-image-base-tag
143   variables:
144     MESA_BASE_TAG: *debian-x86_build-base
145     MESA_IMAGE_PATH: "debian/s390x_build"
146     MESA_IMAGE_TAG: *debian-s390x_build
147   needs:
148     - debian/s390x_build
149
150 # Android NDK cross-build image
151 debian/android_build:
152   extends:
153     - .use-debian/x86_build-base
154   variables:
155     MESA_IMAGE_TAG: &debian-android_build ${DEBIAN_BUILD_TAG}
156
157 .use-debian/android_build:
158   extends:
159     - .set-image-base-tag
160   variables:
161     MESA_BASE_TAG: *debian-x86_build-base
162     MESA_IMAGE_PATH: "debian/android_build"
163     MESA_IMAGE_TAG: *debian-android_build
164   needs:
165     - debian/android_build
166
167 # Debian 11 based x86 test image base
168 debian/x86_test-base:
169   extends: debian/x86_build-base
170   variables:
171     MESA_IMAGE_TAG: &debian-x86_test-base ${DEBIAN_BASE_TAG}
172
173 .use-debian/x86_test-base:
174   extends:
175     - .fdo.container-build@debian
176     - .use-base-image
177   variables:
178     MESA_BASE_IMAGE: ${DEBIAN_X86_TEST_BASE_IMAGE}
179     MESA_BASE_TAG: *debian-x86_test-base
180   needs:
181     - debian/x86_test-base
182
183 # Debian 11 based x86 test image for GL
184 debian/x86_test-gl:
185   extends: .use-debian/x86_test-base
186   variables:
187     FDO_DISTRIBUTION_EXEC: 'env KERNEL_URL=${KERNEL_URL} FDO_CI_CONCURRENT=${FDO_CI_CONCURRENT} bash .gitlab-ci/container/${CI_JOB_NAME}.sh'
188     KERNEL_URL: &kernel-rootfs-url "https://gitlab.freedesktop.org/gfx-ci/linux/-/archive/v5.17-for-mesa-ci-b78f7870d97b/linux-v5.17-for-mesa-ci-b78f7870d97b.tar.bz2"
189     MESA_IMAGE_TAG: &debian-x86_test-gl ${DEBIAN_X86_TEST_GL_TAG}
190
191 .use-debian/x86_test-gl:
192   extends:
193     - .set-image-base-tag
194   variables:
195     MESA_BASE_TAG: *debian-x86_test-base
196     MESA_IMAGE_PATH: ${DEBIAN_X86_TEST_IMAGE_PATH}
197     MESA_IMAGE_TAG: *debian-x86_test-gl
198   needs:
199     - debian/x86_test-gl
200
201 # Debian 11 based x86 test image for VK
202 debian/x86_test-vk:
203   extends: .use-debian/x86_test-base
204   variables:
205     MESA_IMAGE_TAG: &debian-x86_test-vk ${DEBIAN_X86_TEST_VK_TAG}
206
207 .use-debian/x86_test-vk:
208   extends:
209     - .set-image-base-tag
210   variables:
211     MESA_BASE_TAG: *debian-x86_test-base
212     MESA_IMAGE_PATH: "debian/x86_test-vk"
213     MESA_IMAGE_TAG: *debian-x86_test-vk
214   needs:
215     - debian/x86_test-vk
216
217 # Debian 11 based ARM build image
218 debian/arm_build:
219   extends:
220     - .fdo.container-build@debian
221     - .container
222   tags:
223     - aarch64
224   variables:
225     MESA_IMAGE_TAG: &debian-arm_build ${DEBIAN_BASE_TAG}
226
227 .use-debian/arm_build:
228   extends:
229     - .set-image
230   variables:
231     MESA_IMAGE_PATH: "debian/arm_build"
232     MESA_IMAGE_TAG: *debian-arm_build
233     MESA_ARTIFACTS_TAG: *debian-arm_build
234   needs:
235     - debian/arm_build
236
237
238 # Fedora 34 based x86 build image
239 fedora/x86_build:
240   extends:
241     - .fdo.container-build@fedora
242     - .container
243   variables:
244     FDO_DISTRIBUTION_VERSION: 34
245     MESA_IMAGE_TAG: &fedora-x86_build ${FEDORA_X86_BUILD_TAG}
246
247 .use-fedora/x86_build:
248   extends:
249     - .set-image
250   variables:
251     MESA_IMAGE_PATH: "fedora/x86_build"
252     MESA_IMAGE_TAG: *fedora-x86_build
253   needs:
254     - fedora/x86_build
255
256
257 .kernel+rootfs:
258   extends:
259     - .ci-run-policy
260   stage: container
261   variables:
262     GIT_STRATEGY: fetch
263     KERNEL_URL: *kernel-rootfs-url
264     MESA_ROOTFS_TAG: &kernel-rootfs ${KERNEL_ROOTFS_TAG}
265     DISTRIBUTION_TAG: &distribution-tag-arm "${MESA_ROOTFS_TAG}--${MESA_ARTIFACTS_TAG}--${MESA_TEMPLATES_COMMIT}"
266   script:
267     - .gitlab-ci/container/lava_build.sh
268
269 kernel+rootfs_amd64:
270   extends:
271     - .use-debian/x86_build-base
272     - .kernel+rootfs
273   image: "$FDO_BASE_IMAGE"
274   variables:
275     DEBIAN_ARCH: "amd64"
276     DISTRIBUTION_TAG: &distribution-tag-amd64 "${MESA_ROOTFS_TAG}--${MESA_ARTIFACTS_BASE_TAG}--${MESA_TEMPLATES_COMMIT}"
277
278 kernel+rootfs_arm64:
279   extends:
280     - .use-debian/arm_build
281     - .kernel+rootfs
282   tags:
283     - aarch64
284   variables:
285     DEBIAN_ARCH: "arm64"
286
287 kernel+rootfs_armhf:
288   extends:
289     - kernel+rootfs_arm64
290   variables:
291     DEBIAN_ARCH: "armhf"
292
293 # Cannot use anchors defined here from included files, so use extends: instead
294 .use-kernel+rootfs-arm:
295   variables:
296     DISTRIBUTION_TAG: *distribution-tag-arm
297     MESA_ROOTFS_TAG: *kernel-rootfs
298
299 .use-kernel+rootfs-amd64:
300   variables:
301     DISTRIBUTION_TAG: *distribution-tag-amd64
302     MESA_ROOTFS_TAG: *kernel-rootfs
303
304 # x86 image with ARM64 & armhf kernel & rootfs for baremetal testing
305 debian/arm_test:
306   extends:
307     - .fdo.container-build@debian
308     - .container
309     # Don't want the .container rules
310     - .ci-run-policy
311   needs:
312     - kernel+rootfs_arm64
313     - kernel+rootfs_armhf
314   variables:
315     FDO_DISTRIBUTION_EXEC: 'env ARTIFACTS_PREFIX=https://${MINIO_HOST}/mesa-lava ARTIFACTS_SUFFIX=${MESA_ROOTFS_TAG}--${MESA_ARM_BUILD_TAG}--${MESA_TEMPLATES_COMMIT} CI_PROJECT_PATH=${CI_PROJECT_PATH} FDO_CI_CONCURRENT=${FDO_CI_CONCURRENT} FDO_UPSTREAM_REPO=${FDO_UPSTREAM_REPO} bash .gitlab-ci/container/${CI_JOB_NAME}.sh'
316     FDO_DISTRIBUTION_TAG: "${MESA_IMAGE_TAG}--${MESA_ROOTFS_TAG}--${MESA_ARM_BUILD_TAG}--${MESA_TEMPLATES_COMMIT}"
317     MESA_ARM_BUILD_TAG: *debian-arm_build
318     MESA_IMAGE_TAG: &debian-arm_test ${DEBIAN_BASE_TAG}
319     MESA_ROOTFS_TAG: *kernel-rootfs
320
321 .use-debian/arm_test:
322   image: "$CI_REGISTRY_IMAGE/${MESA_IMAGE_PATH}:${MESA_IMAGE_TAG}--${MESA_ROOTFS_TAG}--${MESA_ARM_BUILD_TAG}--${MESA_TEMPLATES_COMMIT}"
323   variables:
324     MESA_ARM_BUILD_TAG: *debian-arm_build
325     MESA_IMAGE_PATH: "debian/arm_test"
326     MESA_IMAGE_TAG: *debian-arm_test
327     MESA_ROOTFS_TAG: *kernel-rootfs
328   needs:
329     - debian/arm_test
330
331 # Native Windows docker builds
332 #
333 # Unlike the above Linux-based builds - including MinGW builds which
334 # cross-compile for Windows - which use the freedesktop ci-templates, we
335 # cannot use the same scheme here. As Windows lacks support for
336 # Docker-in-Docker, and Podman does not run natively on Windows, we have
337 # to open-code much of the same ourselves.
338 #
339 # This is achieved by first running in a native Windows shell instance
340 # (host PowerShell) in the container stage to build and push the image,
341 # then in the build stage by executing inside Docker.
342
343 .windows-docker-vs2019:
344   variables:
345     MESA_IMAGE: "$CI_REGISTRY_IMAGE/${MESA_IMAGE_PATH}:${MESA_IMAGE_TAG}"
346     MESA_UPSTREAM_IMAGE: "$CI_REGISTRY/$FDO_UPSTREAM_REPO/$MESA_IMAGE_PATH:${MESA_IMAGE_TAG}"
347
348 .windows_container_build:
349   inherit:
350     default: false
351   extends:
352     - .container
353     - .windows-docker-vs2019
354   rules:
355     - if: '$MICROSOFT_FARM == "offline"'
356       when: never
357     - !reference [.container-rules, rules]
358   variables:
359     GIT_STRATEGY: fetch # we do actually need the full repository though
360     MESA_BASE_IMAGE: None
361   tags:
362     - windows
363     - shell
364     - "2022"
365     - mesa
366   script:
367     - .\.gitlab-ci\windows\mesa_container.ps1 $CI_REGISTRY $CI_REGISTRY_USER $CI_REGISTRY_PASSWORD $MESA_IMAGE $MESA_UPSTREAM_IMAGE ${DOCKERFILE} ${MESA_BASE_IMAGE}
368
369 windows_build_vs2019:
370   inherit:
371     default: false
372   extends:
373     - .windows_container_build
374   variables:
375     MESA_IMAGE_PATH: &windows_build_image_path ${WINDOWS_X64_BUILD_PATH}
376     MESA_IMAGE_TAG: &windows_build_image_tag ${WINDOWS_X64_BUILD_TAG}
377     DOCKERFILE: Dockerfile_build
378   timeout: 2h 30m # LLVM takes ages
379
380 windows_test_vs2019:
381   inherit:
382     default: false
383   extends:
384     - .windows_container_build
385   rules:
386     - if: '$MICROSOFT_FARM == "offline"'
387       when: never
388     - !reference [.ci-run-policy, rules]
389   variables:
390     MESA_IMAGE_PATH: &windows_test_image_path ${WINDOWS_X64_TEST_PATH}
391     MESA_IMAGE_TAG: &windows_test_image_tag ${WINDOWS_X64_BUILD_TAG}--${WINDOWS_X64_TEST_TAG}
392     DOCKERFILE: Dockerfile_test
393     # Right now this only needs the VS install to get DXIL.dll. Maybe see about decoupling this at some point
394     MESA_BASE_IMAGE_PATH: *windows_build_image_path
395     MESA_BASE_IMAGE_TAG: *windows_build_image_tag
396     MESA_BASE_IMAGE: "$CI_REGISTRY_IMAGE/${MESA_BASE_IMAGE_PATH}:${MESA_BASE_IMAGE_TAG}"
397   needs:
398     - windows_build_vs2019
399
400 .use-windows_build_vs2019:
401   inherit:
402     default: false
403   extends: .windows-docker-vs2019
404   image: "$MESA_IMAGE"
405   variables:
406     MESA_IMAGE_PATH: *windows_build_image_path
407     MESA_IMAGE_TAG: *windows_build_image_tag
408   needs:
409     - windows_build_vs2019
410
411 .use-windows_test_vs2019:
412   inherit:
413     default: false
414   extends: .windows-docker-vs2019
415   image: "$MESA_IMAGE"
416   variables:
417     MESA_IMAGE_PATH: *windows_test_image_path
418     MESA_IMAGE_TAG: *windows_test_image_tag