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