To aid in debugging wierd CI failures we need greater information about the CI runner environment. It is usually container based and can have some unexpected characteristics that significantly differ from a developer's local environment. This captures the mount list, CPU model, memory information, device node lists, kernel info, user identity and all environment variables. Since this information can get quite large it is not emitted directly in the logs, rather it is exposed in job artifacts under the "ci-runner-env" directory. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> Link: https://lore.kernel.org/qemu-devel/20260624124657.2725376-7-berrange@redhat.com Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
185 lines
6.8 KiB
YAML
185 lines
6.8 KiB
YAML
|
|
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
|