| 1 | |
| 2 | variables: |
| 3 | # On stable branches this is changed by later rules. Should also |
| 4 | # be overridden per pipeline if running pipelines concurrently |
| 5 | # for different branches in contributor forks. |
| 6 | QEMU_CI_CONTAINER_TAG: latest |
| 7 | |
| 8 | # For purposes of CI rules, upstream is the gitlab.com/qemu-project |
| 9 | # namespace. When testing CI, it might be usefult to override this |
| 10 | # to point to a fork repo |
| 11 | QEMU_CI_UPSTREAM: qemu-project |
| 12 | |
| 13 | # The order of rules defined here is critically important. |
| 14 | # They are evaluated in order and first match wins. |
| 15 | # |
| 16 | # Thus we group them into a number of stages, ordered from |
| 17 | # most restrictive to least restrictive |
| 18 | # |
| 19 | # For pipelines running for stable "staging-X.Y" branches |
| 20 | # we must override QEMU_CI_CONTAINER_TAG |
| 21 | # |
| 22 | .base_job_template: |
| 23 | variables: |
| 24 | # Each script line from will be in a collapsible section in the job output |
| 25 | # and show the duration of each line. |
| 26 | FF_SCRIPT_SECTIONS: 1 |
| 27 | # The project has a fairly fat GIT repo so we try and avoid bringing in things |
| 28 | # we don't need. The --filter options avoid blobs and tree references we aren't going to use |
| 29 | # and we also avoid fetching tags. |
| 30 | GIT_FETCH_EXTRA_FLAGS: --filter=blob:none --filter=tree:0 --no-tags --prune --quiet |
| 31 | # Ensure docker.py / tests/docker/Makefile.include always displays stdout |
| 32 | # from any docker commands to aid debugging of failures |
| 33 | DOCKER_V: 1 |
| 34 | |
| 35 | interruptible: true |
| 36 | |
| 37 | rules: |
| 38 | ############################################################# |
| 39 | # Stage 1: exclude scenarios where we definitely don't |
| 40 | # want jobs to run |
| 41 | ############################################################# |
| 42 | |
| 43 | # Never run jobs upstream on stable branch, staging branch jobs already ran |
| 44 | - if: '$CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH =~ /^stable-/' |
| 45 | when: never |
| 46 | |
| 47 | # Never run jobs upstream on tags, staging branch jobs already ran |
| 48 | - if: '$CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_TAG' |
| 49 | when: never |
| 50 | |
| 51 | # Scheduled jobs should explicitly enable the run in their job rules |
| 52 | - if: '$CI_PIPELINE_SOURCE == "schedule"' |
| 53 | when: never |
| 54 | |
| 55 | # macOS jobs can't run in forks until gitlab opens up runner availability |
| 56 | # to all tiers https://gitlab.com/groups/gitlab-org/-/work_items/8267 |
| 57 | - if: '$QEMU_JOB_MACOS == "1" && $CI_PROJECT_NAMESPACE != $QEMU_CI_UPSTREAM' |
| 58 | when: never |
| 59 | |
| 60 | # Publishing jobs should only run on the default branch in upstream |
| 61 | - if: '$QEMU_JOB_PUBLISH == "1" && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH' |
| 62 | when: never |
| 63 | |
| 64 | # Non-publishing jobs should only run on staging branches in upstream |
| 65 | - if: '$QEMU_JOB_PUBLISH != "1" && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH !~ /staging/' |
| 66 | when: never |
| 67 | |
| 68 | # Jobs only intended for forks should always be skipped on upstream |
| 69 | - if: '$QEMU_JOB_ONLY_FORKS == "1" && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM' |
| 70 | when: never |
| 71 | |
| 72 | # Forks don't get pipelines unless QEMU_CI=1 or QEMU_CI=2 is set |
| 73 | - if: '$QEMU_CI != "1" && $QEMU_CI != "2" && $CI_PROJECT_NAMESPACE != $QEMU_CI_UPSTREAM' |
| 74 | when: never |
| 75 | |
| 76 | |
| 77 | ############################################################# |
| 78 | # Stage 2: fine tune execution of jobs in specific scenarios |
| 79 | # where the catch all logic is inappropriate |
| 80 | ############################################################# |
| 81 | |
| 82 | # Optional jobs should not be run unless manually triggered |
| 83 | - if: '$QEMU_JOB_OPTIONAL && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH =~ /staging-[[:digit:]]+\.[[:digit:]]/' |
| 84 | when: manual |
| 85 | allow_failure: true |
| 86 | variables: |
| 87 | QEMU_CI_CONTAINER_TAG: $CI_COMMIT_REF_SLUG |
| 88 | |
| 89 | - if: '$QEMU_JOB_OPTIONAL' |
| 90 | when: manual |
| 91 | allow_failure: true |
| 92 | |
| 93 | # Skipped jobs should not be run unless manually triggered |
| 94 | - if: '$QEMU_JOB_SKIPPED && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH =~ /staging-[[:digit:]]+\.[[:digit:]]/' |
| 95 | when: manual |
| 96 | allow_failure: true |
| 97 | variables: |
| 98 | QEMU_CI_CONTAINER_TAG: $CI_COMMIT_REF_SLUG |
| 99 | |
| 100 | - if: '$QEMU_JOB_SKIPPED' |
| 101 | when: manual |
| 102 | allow_failure: true |
| 103 | |
| 104 | # Functional jobs can be manually started in forks |
| 105 | - if: '$QEMU_JOB_FUNCTIONAL && $QEMU_CI_FUNCTIONAL != "1" && $CI_PROJECT_NAMESPACE != $QEMU_CI_UPSTREAM' |
| 106 | when: manual |
| 107 | allow_failure: true |
| 108 | |
| 109 | |
| 110 | ############################################################# |
| 111 | # Stage 3: catch all logic applying to any job not matching |
| 112 | # an earlier criteria |
| 113 | ############################################################# |
| 114 | |
| 115 | # Forks pipeline jobs don't start automatically unless |
| 116 | # QEMU_CI=2 is set |
| 117 | - if: '$QEMU_CI != "2" && $CI_PROJECT_NAMESPACE != $QEMU_CI_UPSTREAM' |
| 118 | when: manual |
| 119 | |
| 120 | # Upstream pipeline jobs start automatically unless told not to |
| 121 | # by setting QEMU_CI=1 |
| 122 | - if: '$QEMU_CI == "1" && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH =~ /staging-[[:digit:]]+\.[[:digit:]]/' |
| 123 | when: manual |
| 124 | variables: |
| 125 | QEMU_CI_CONTAINER_TAG: $CI_COMMIT_REF_SLUG |
| 126 | |
| 127 | - if: '$QEMU_CI == "1" && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM' |
| 128 | when: manual |
| 129 | |
| 130 | # Jobs can run if any jobs they depend on were successful |
| 131 | - if: '$CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH =~ /staging-[[:digit:]]+\.[[:digit:]]/' |
| 132 | when: on_success |
| 133 | variables: |
| 134 | QEMU_CI_CONTAINER_TAG: $CI_COMMIT_REF_SLUG |
| 135 | |
| 136 | - when: on_success |
| 137 | |
| 138 | # Any job running meson should capture meson logs |
| 139 | # by default. Some jobs might override the artifacts |
| 140 | # to capture further files |
| 141 | .base_meson_job_template: |
| 142 | extends: .base_job_template |
| 143 | artifacts: |
| 144 | name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" |
| 145 | when: always |
| 146 | expire_in: 7 days |
| 147 | paths: |
| 148 | - build/meson-logs |
| 149 | - ci-runner-env |
| 150 | reports: |
| 151 | junit: build/meson-logs/*.junit.xml |
| 152 | before_script: |
| 153 | - source scripts/ci/gitlab-ci-section |
| 154 | - section_start setup "Pre-script setup" |
| 155 | - JOBS=$(expr $(nproc) + 1) |
| 156 | # Prevent logs (if any) from prior build job artifacts |
| 157 | # from being duplicated in the new job artifacts |
| 158 | - rm -f build/meson-logs/* |
| 159 | - mkdir -p ci-runner-env |
| 160 | - test -f /packages.txt && cp /packages.txt ci-runner-env/packages.txt |
| 161 | - cp /proc/mounts ci-runner-env/mounts.txt |
| 162 | - cp /proc/cpuinfo ci-runner-env/cpuinfo.txt |
| 163 | - cp /proc/meminfo ci-runner-env/meminfo.txt |
| 164 | - ls -l /dev > ci-runner-env/devices.txt |
| 165 | - uname -a > ci-runner-env/kernel.txt |
| 166 | - id -a > ci-runner-env/user.txt |
| 167 | - printenv | sort > ci-runner-env/environ.txt |
| 168 | - section_end setup |
| 169 | |
| 170 | .base_meson_ccache_job_template: |
| 171 | extends: .base_meson_job_template |
| 172 | cache: |
| 173 | paths: |
| 174 | - ccache |
| 175 | key: "$CI_JOB_NAME" |
| 176 | when: always |
| 177 | script: |
| 178 | - export CCACHE_BASEDIR="$(pwd)" |
| 179 | - export CCACHE_DIR="$CCACHE_BASEDIR/ccache" |
| 180 | - export CCACHE_MAXSIZE="500M" |
| 181 | - export PATH="$CCACHE_WRAPPERSDIR:$PATH" |
| 182 | - ccache --zero-stats |
| 183 | after_script: |
| 184 | - ccache --show-stats |