summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/ci/gitlab-ci.yml
blob: f04aabe8327c6bfbb923b1ceb06f8252d18081c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
variables:
  DRM_CI_PROJECT_PATH: &drm-ci-project-path mesa/mesa
  DRM_CI_COMMIT_SHA: &drm-ci-commit-sha 7d3062470f3ccc6cb40540e772e902c7e2248024

  UPSTREAM_REPO: https://gitlab.freedesktop.org/drm/kernel.git
  TARGET_BRANCH: drm-next

  IGT_VERSION: 33adea9ebafd059ac88a5ccfec60536394f36c7c

  DEQP_RUNNER_GIT_URL: https://gitlab.freedesktop.org/mesa/deqp-runner.git
  DEQP_RUNNER_GIT_TAG: v0.20.0

  FDO_UPSTREAM_REPO: helen.fornazier/linux   # The repo where the git-archive daily runs
  MESA_TEMPLATES_COMMIT: &ci-templates-commit d5aa3941aa03c2f716595116354fb81eb8012acb
  DRM_CI_PROJECT_URL: https://gitlab.freedesktop.org/${DRM_CI_PROJECT_PATH}
  CI_PRE_CLONE_SCRIPT: |-
          set -o xtrace
          curl -L --retry 4 -f --retry-all-errors --retry-delay 60 -s ${DRM_CI_PROJECT_URL}/-/raw/${DRM_CI_COMMIT_SHA}/.gitlab-ci/download-git-cache.sh -o download-git-cache.sh
          bash download-git-cache.sh
          rm download-git-cache.sh
          set +o xtrace
  S3_JWT_FILE: /s3_jwt
  S3_JWT_FILE_SCRIPT: |-
      echo -n '${S3_JWT}' > '${S3_JWT_FILE}' &&
      unset CI_JOB_JWT S3_JWT  # Unsetting vulnerable env variables
  S3_HOST: s3.freedesktop.org
  # This bucket is used to fetch the kernel image
  S3_KERNEL_BUCKET: mesa-rootfs
  # Bucket for git cache
  S3_GITCACHE_BUCKET: git-cache
  # Bucket for the pipeline artifacts pushed to S3
  S3_ARTIFACTS_BUCKET: artifacts
  # per-pipeline artifact storage on MinIO
  PIPELINE_ARTIFACTS_BASE: ${S3_HOST}/${S3_ARTIFACTS_BUCKET}/${CI_PROJECT_PATH}/${CI_PIPELINE_ID}
  # per-job artifact storage on MinIO
  JOB_ARTIFACTS_BASE: ${PIPELINE_ARTIFACTS_BASE}/${CI_JOB_ID}
  KERNEL_IMAGE_BASE: https://${S3_HOST}/${S3_KERNEL_BUCKET}/${KERNEL_REPO}/${KERNEL_TAG}
  LAVA_TAGS: subset-1-gfx
  LAVA_JOB_PRIORITY: 30
  ARTIFACTS_BASE_URL: https://${CI_PROJECT_ROOT_NAMESPACE}.${CI_PAGES_DOMAIN}/-/${CI_PROJECT_NAME}/-/jobs/${CI_JOB_ID}/artifacts
  # Python scripts for structured logger
  PYTHONPATH: "$PYTHONPATH:$CI_PROJECT_DIR/install"


default:
  id_tokens:
    S3_JWT:
      aud: https://s3.freedesktop.org
  before_script:
    - export SCRIPTS_DIR=$(mktemp -d)
    - curl -L -s --retry 4 -f --retry-all-errors --retry-delay 60 -O --output-dir "${SCRIPTS_DIR}" "${DRM_CI_PROJECT_URL}/-/raw/${DRM_CI_COMMIT_SHA}/.gitlab-ci/setup-test-env.sh"
    - source ${SCRIPTS_DIR}/setup-test-env.sh
    - eval "$S3_JWT_FILE_SCRIPT"

    - echo -e "\e[0Ksection_start:$(date +%s):drm_ci_download_section[collapsed=true]\r\e[0KDownloading mesa from $DRM_CI_PROJECT_URL/-/archive/$DRM_CI_COMMIT_SHA/mesa-$DRM_CI_COMMIT_SHA.tar.gz"
    - cd $CI_PROJECT_DIR
    - curl --output - $DRM_CI_PROJECT_URL/-/archive/$DRM_CI_COMMIT_SHA/mesa-$DRM_CI_COMMIT_SHA.tar.gz | tar -xz
    - mv mesa-$DRM_CI_COMMIT_SHA/.gitlab-ci* .
    - mv mesa-$DRM_CI_COMMIT_SHA/bin .
    - rm -rf mesa-$DRM_CI_COMMIT_SHA/
    - echo -e "\e[0Ksection_end:$(date +%s):drm_ci_download_section\r\e[0K"

  after_script:
    - >
      set +x

      test -e "${S3_JWT_FILE}" &&
      export S3_JWT="$(<${S3_JWT_FILE})" &&
      rm "${S3_JWT_FILE}"


include:
  - project: 'freedesktop/ci-templates'
    ref: 16bc29078de5e0a067ff84a1a199a3760d3b3811
    file:
      - '/templates/ci-fairy.yml'
  - project: 'freedesktop/ci-templates'
    ref: *ci-templates-commit
    file:
      - '/templates/alpine.yml'
      - '/templates/debian.yml'
      - '/templates/fedora.yml'
  - project: *drm-ci-project-path
    ref: *drm-ci-commit-sha
    file:
      - '/.gitlab-ci/build/gitlab-ci.yml'
      - '/.gitlab-ci/container/gitlab-ci.yml'
      - '/.gitlab-ci/farm-rules.yml'
      - '/.gitlab-ci/lava/lava-gitlab-ci.yml'
      - '/.gitlab-ci/test-source-dep.yml'
      - '/.gitlab-ci/test/gitlab-ci.yml'
      - '/src/amd/ci/gitlab-ci-inc.yml'
      - '/src/freedreno/ci/gitlab-ci-inc.yml'
      - '/src/gallium/drivers/crocus/ci/gitlab-ci-inc.yml'
      - '/src/gallium/drivers/llvmpipe/ci/gitlab-ci-inc.yml'
      - '/src/gallium/drivers/nouveau/ci/gitlab-ci-inc.yml'
      - '/src/gallium/drivers/softpipe/ci/gitlab-ci-inc.yml'
      - '/src/gallium/drivers/virgl/ci/gitlab-ci-inc.yml'
      - '/src/gallium/drivers/zink/ci/gitlab-ci-inc.yml'
      - '/src/gallium/frontends/lavapipe/ci/gitlab-ci-inc.yml'
      - '/src/gallium/frontends/rusticl/ci/gitlab-ci.yml'
      - '/src/intel/ci/gitlab-ci-inc.yml'
      - '/src/microsoft/ci/gitlab-ci-inc.yml'
      - '/src/nouveau/ci/gitlab-ci-inc.yml'
      - '/src/virtio/ci/gitlab-ci-inc.yml'
  - drivers/gpu/drm/ci/image-tags.yml
  - drivers/gpu/drm/ci/container.yml
  - drivers/gpu/drm/ci/static-checks.yml
  - drivers/gpu/drm/ci/build.yml
  - drivers/gpu/drm/ci/test.yml
  - 'https://gitlab.freedesktop.org/gfx-ci/lab-status/-/raw/main/lab-status.yml'


stages:
  - sanity
  - container
  - git-archive
  - build-for-tests
  - build-only
  - code-validation
  - amdgpu
  - i915
  - mediatek
  - meson
  - msm
  - panfrost
  - powervr
  - rockchip
  - software-driver


# YAML anchors for rule conditions
# --------------------------------
.rules-anchors:
  rules:
    # do not duplicate pipelines on merge pipelines
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
      when: never
    # merge pipeline
    - if: &is-merge-attempt $GITLAB_USER_LOGIN == "marge-bot" && $CI_PIPELINE_SOURCE == "merge_request_event"
    # post-merge pipeline
    - if: &is-post-merge $GITLAB_USER_LOGIN == "marge-bot" && $CI_PIPELINE_SOURCE == "push"
    # Pre-merge pipeline
    - if: &is-pre-merge $CI_PIPELINE_SOURCE == "merge_request_event"
    # Push to a branch on a fork
    - if: &is-fork-push $CI_PROJECT_NAMESPACE != "mesa" && $CI_PIPELINE_SOURCE == "push"
    # nightly pipeline
    - if: &is-scheduled-pipeline $CI_PIPELINE_SOURCE == "schedule"
    # pipeline for direct pushes that bypassed the CI
    - if: &is-direct-push $CI_PROJECT_NAMESPACE == "mesa" && $CI_PIPELINE_SOURCE == "push" && $GITLAB_USER_LOGIN != "marge-bot"


# Rules applied to every job in the pipeline
.common-rules:
  rules:
    - if: *is-fork-push
      when: manual


.never-post-merge-rules:
  rules:
    - if: *is-post-merge
      when: never


.container+build-rules:
  rules:
    - !reference [.common-rules, rules]
    # Run when re-enabling a disabled farm, but not when disabling it
    - !reference [.disable-farm-mr-rules, rules]
    # Never run immediately after merging, as we just ran everything
    - !reference [.never-post-merge-rules, rules]
    # Build everything in merge pipelines, if any files affecting the pipeline
    # were changed
    - if: *is-merge-attempt
      changes: &all_paths
      - drivers/gpu/drm/ci/**/*
      when: on_success
    # Same as above, but for pre-merge pipelines
    - if: *is-pre-merge
      changes:
        *all_paths
      when: manual
    # Skip everything for pre-merge and merge pipelines which don't change
    # anything in the build
    - if: *is-merge-attempt
      when: never
    - if: *is-pre-merge
      when: never
    # Build everything after someone bypassed the CI
    - if: *is-direct-push
      when: on_success
    # Build everything in scheduled pipelines
    - if: *is-scheduled-pipeline
      when: on_success
    # Allow building everything in fork pipelines, but build nothing unless
    # manually triggered
    - when: manual


.ci-deqp-artifacts:
  artifacts:
    name: "${CI_PROJECT_NAME}_${CI_JOB_NAME}"
    when: always
    untracked: false
    paths:
      # Watch out!  Artifacts are relative to the build dir.
      # https://gitlab.com/gitlab-org/gitlab-ce/commit/8788fb925706cad594adf6917a6c5f6587dd1521
      - artifacts
      - _build/meson-logs/*.txt
      - _build/meson-logs/strace


# Git archive
make git archive:
  extends:
    - .fdo.ci-fairy
  stage: git-archive
  rules:
    - !reference [.scheduled_pipeline-rules, rules]
  # ensure we are running on packet
  tags:
    - packet.net
  script:
    # Remove drm-ci files we just added
    - rm -rf .gitlab-ci.*
    - rm -rf ci

    # Compactify the .git directory
    - git gc --aggressive
    # compress the current folder
    - tar -cvzf ../$CI_PROJECT_NAME.tar.gz .

    # Use id_tokens for JWT auth
    - ci-fairy s3cp --token-file "${S3_JWT_FILE}" ../$CI_PROJECT_NAME.tar.gz https://$S3_HOST/${S3_GITCACHE_BUCKET}/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/$CI_PROJECT_NAME.tar.gz


# Sanity checks of MR settings and commit logs
sanity:
  extends:
    - .fdo.ci-fairy
  stage: sanity
  rules:
    - if: *is-pre-merge
      when: on_success
    - when: never
  variables:
    GIT_STRATEGY: none
  script:
    # ci-fairy check-commits --junit-xml=check-commits.xml
    - ci-fairy check-merge-request --require-allow-collaboration --junit-xml=check-merge-request.xml
    - |
      set -eu
      image_tags=(
        ALPINE_X86_64_LAVA_SSH_TAG
        CONTAINER_TAG
        DEBIAN_BASE_TAG
        DEBIAN_BUILD_TAG
        DEBIAN_PYUTILS_TAG
        DEBIAN_TEST_GL_TAG
        KERNEL_ROOTFS_TAG
        KERNEL_TAG
        PKG_REPO_REV
      )
      for var in "${image_tags[@]}"
      do
        if [ "$(echo -n "${!var}" | wc -c)" -gt 20 ]
        then
          echo "$var is too long; please make sure it is at most 20 chars."
          exit 1
        fi
      done
  artifacts:
    when: on_failure
    reports:
      junit: check-*.xml
  tags:
    - placeholder-job


mr-label-maker-test:
  extends:
    - .fdo.ci-fairy
  stage: sanity
  rules:
    - !reference [.mr-label-maker-rules, rules]
  variables:
    GIT_STRATEGY: fetch
  timeout: 10m
  script:
    - set -eu
    - python3 -m venv .venv
    - source .venv/bin/activate
    - pip install git+https://gitlab.freedesktop.org/freedesktop/mr-label-maker
    - mr-label-maker --dry-run --mr $CI_MERGE_REQUEST_IID


# Jobs that need to pass before spending hardware resources on further testing
.required-for-hardware-jobs:
  needs:
    - job: clang-format
      optional: true
    - job: rustfmt
      optional: true
    - job: toml-lint
      optional: true