| |
| variables: |
| # On stable branches this is changed by later rules. Should also |
| # be overridden per pipeline if running pipelines concurrently |
| # for different branches in contributor forks. |
| QEMU_CI_CONTAINER_TAG: latest |
| |
| # For purposes of CI rules, upstream is the gitlab.com/qemu-project |
| # namespace. When testing CI, it might be usefult to override this |
| # to point to a fork repo |
| QEMU_CI_UPSTREAM: qemu-project |
| |
| # The order of rules defined here is critically important. |
| # They are evaluated in order and first match wins. |
| # |
| # Thus we group them into a number of stages, ordered from |
| # most restrictive to least restrictive |
| # |
| # For pipelines running for stable "staging-X.Y" branches |
| # we must override QEMU_CI_CONTAINER_TAG |
| # |
| .base_job_template: |
| variables: |
| # Each script line from will be in a collapsible section in the job output |
| # and show the duration of each line. |
| FF_SCRIPT_SECTIONS: 1 |
| # The project has a fairly fat GIT repo so we try and avoid bringing in things |
| # we don't need. The --filter options avoid blobs and tree references we aren't going to use |
| # and we also avoid fetching tags. |
| GIT_FETCH_EXTRA_FLAGS: --filter=blob:none --filter=tree:0 --no-tags --prune --quiet |
| # Ensure docker.py / tests/docker/Makefile.include always displays stdout |
| # from any docker commands to aid debugging of failures |
| DOCKER_V: 1 |
| |
| interruptible: true |
| |
| rules: |
| ############################################################# |
| # Stage 1: exclude scenarios where we definitely don't |
| # want jobs to run |
| ############################################################# |
| |
| # Never run jobs upstream on stable branch, staging branch jobs already ran |
| - if: '$CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH =~ /^stable-/' |
| when: never |
| |
| # Never run jobs upstream on tags, staging branch jobs already ran |
| - if: '$CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_TAG' |
| when: never |
| |
| # Scheduled jobs should explicitly enable the run in their job rules |
| - if: '$CI_PIPELINE_SOURCE == "schedule"' |
| when: never |
| |
| # macOS jobs can't run in forks until gitlab opens up runner availability |
| # to all tiers https://gitlab.com/groups/gitlab-org/-/work_items/8267 |
| - if: '$QEMU_JOB_MACOS == "1" && $CI_PROJECT_NAMESPACE != $QEMU_CI_UPSTREAM' |
| when: never |
| |
| # Publishing jobs should only run on the default branch in upstream |
| - if: '$QEMU_JOB_PUBLISH == "1" && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH' |
| when: never |
| |
| # Non-publishing jobs should only run on staging branches in upstream |
| - if: '$QEMU_JOB_PUBLISH != "1" && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH !~ /staging/' |
| when: never |
| |
| # Jobs only intended for forks should always be skipped on upstream |
| - if: '$QEMU_JOB_ONLY_FORKS == "1" && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM' |
| when: never |
| |
| # Forks don't get pipelines unless QEMU_CI=1 or QEMU_CI=2 is set |
| - if: '$QEMU_CI != "1" && $QEMU_CI != "2" && $CI_PROJECT_NAMESPACE != $QEMU_CI_UPSTREAM' |
| when: never |
| |
| |
| ############################################################# |
| # Stage 2: fine tune execution of jobs in specific scenarios |
| # where the catch all logic is inappropriate |
| ############################################################# |
| |
| # Optional jobs should not be run unless manually triggered |
| - if: '$QEMU_JOB_OPTIONAL && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH =~ /staging-[[:digit:]]+\.[[:digit:]]/' |
| when: manual |
| allow_failure: true |
| variables: |
| QEMU_CI_CONTAINER_TAG: $CI_COMMIT_REF_SLUG |
| |
| - if: '$QEMU_JOB_OPTIONAL' |
| when: manual |
| allow_failure: true |
| |
| # Skipped jobs should not be run unless manually triggered |
| - if: '$QEMU_JOB_SKIPPED && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH =~ /staging-[[:digit:]]+\.[[:digit:]]/' |
| when: manual |
| allow_failure: true |
| variables: |
| QEMU_CI_CONTAINER_TAG: $CI_COMMIT_REF_SLUG |
| |
| - if: '$QEMU_JOB_SKIPPED' |
| when: manual |
| allow_failure: true |
| |
| # Functional jobs can be manually started in forks |
| - if: '$QEMU_JOB_FUNCTIONAL && $QEMU_CI_FUNCTIONAL != "1" && $CI_PROJECT_NAMESPACE != $QEMU_CI_UPSTREAM' |
| when: manual |
| allow_failure: true |
| |
| |
| ############################################################# |
| # Stage 3: catch all logic applying to any job not matching |
| # an earlier criteria |
| ############################################################# |
| |
| # Forks pipeline jobs don't start automatically unless |
| # QEMU_CI=2 is set |
| - if: '$QEMU_CI != "2" && $CI_PROJECT_NAMESPACE != $QEMU_CI_UPSTREAM' |
| when: manual |
| |
| # Upstream pipeline jobs start automatically unless told not to |
| # by setting QEMU_CI=1 |
| - if: '$QEMU_CI == "1" && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH =~ /staging-[[:digit:]]+\.[[:digit:]]/' |
| when: manual |
| variables: |
| QEMU_CI_CONTAINER_TAG: $CI_COMMIT_REF_SLUG |
| |
| - if: '$QEMU_CI == "1" && $CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM' |
| when: manual |
| |
| # Jobs can run if any jobs they depend on were successful |
| - if: '$CI_PROJECT_NAMESPACE == $QEMU_CI_UPSTREAM && $CI_COMMIT_BRANCH =~ /staging-[[:digit:]]+\.[[:digit:]]/' |
| when: on_success |
| variables: |
| QEMU_CI_CONTAINER_TAG: $CI_COMMIT_REF_SLUG |
| |
| - when: on_success |
| |
| # Any job running meson should capture meson logs |
| # by default. Some jobs might override the artifacts |
| # to capture further files |
| .base_meson_job_template: |
| extends: .base_job_template |
| artifacts: |
| name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" |
| when: always |
| expire_in: 7 days |
| paths: |
| - build/meson-logs |
| - ci-runner-env |
| reports: |
| junit: build/meson-logs/*.junit.xml |
| before_script: |
| - source scripts/ci/gitlab-ci-section |
| - section_start setup "Pre-script setup" |
| - JOBS=$(expr $(nproc) + 1) |
| # Prevent logs (if any) from prior build job artifacts |
| # from being duplicated in the new job artifacts |
| - rm -f build/meson-logs/* |
| - mkdir -p ci-runner-env |
| - test -f /packages.txt && cp /packages.txt ci-runner-env/packages.txt |
| - cp /proc/mounts ci-runner-env/mounts.txt |
| - cp /proc/cpuinfo ci-runner-env/cpuinfo.txt |
| - cp /proc/meminfo ci-runner-env/meminfo.txt |
| - ls -l /dev > ci-runner-env/devices.txt |
| - uname -a > ci-runner-env/kernel.txt |
| - id -a > ci-runner-env/user.txt |
| - printenv | sort > ci-runner-env/environ.txt |
| - section_end setup |
| |
| .base_meson_ccache_job_template: |
| extends: .base_meson_job_template |
| cache: |
| paths: |
| - ccache |
| key: "$CI_JOB_NAME" |
| when: always |
| script: |
| - export CCACHE_BASEDIR="$(pwd)" |
| - export CCACHE_DIR="$CCACHE_BASEDIR/ccache" |
| - export CCACHE_MAXSIZE="500M" |
| - export PATH="$CCACHE_WRAPPERSDIR:$PATH" |
| - ccache --zero-stats |
| after_script: |
| - ccache --show-stats |