include: - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/145b1bc7ef1702d2bd71584010d7113c6786a506/templates/fedora.yml' - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/34f4ade99434043f88e164933f570301fd18b125/templates/ci-fairy.yml' - project: 'Infrastructure/openshift-images/gnome-release-service' file: '/ci-templates/release-module.yml' - component: gitlab.gnome.org/GNOME/citemplates/gnomeos-build-sysext@1.0.0-alpha.1 inputs: meson-options: -Dxwayland_initfd=enabled -Dprofiler=true build-sysext: before_script: - .gitlab-ci/install-gnomeos-sysext-dependencies.sh $CI_PROJECT_DIR/extension # x86_64_v2 runners hang on pulling the docker image. This should be removed # when the runners are all updated. # https://gitlab.gnome.org/Infrastructure/Infrastructure/-/issues/1665 tags: - x86_64_v3 stages: - review - prepare - code-review - build - test - analyze - docs - deploy variables: FDO_UPSTREAM_REPO: GNOME/mutter .skip-git-clone: variables: GIT_STRATEGY: none .mutter.git-clone: extends: - .skip-git-clone variables: MUTTER_CLONE_PATH: $CI_BUILDS_DIR/$CI_PROJECT_PATH MUTTER_CLONE_DEPTH: 1 before_script: | if [ -n "$MUTTER_CLONE_PATH" ]; then set -x uri="$CI_REPOSITORY_URL" if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" ]; then uri="$CI_MERGE_REQUEST_SOURCE_PROJECT_URL.git" branch="$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" elif [ -n "$CI_COMMIT_TAG" ]; then branch="$CI_COMMIT_TAG" elif [ -n "$CI_COMMIT_BRANCH" ]; then branch="$CI_COMMIT_BRANCH" else branch="$CI_DEFAULT_BRANCH" fi if [ ! -d "$MUTTER_CLONE_PATH" ] || [ -z "$(ls -A "$MUTTER_CLONE_PATH")" ]; then git clone --depth $MUTTER_CLONE_DEPTH "$uri" "$MUTTER_CLONE_PATH" -b "$branch" elif [ ! -d "$MUTTER_CLONE_PATH/.git" ]; then git clone --bare --depth $MUTTER_CLONE_DEPTH "$uri" "$MUTTER_CLONE_PATH/.git" -b "$branch" if git -C "$MUTTER_CLONE_PATH" config --unset core.bare; then git -C "$MUTTER_CLONE_PATH" checkout else # For some weird reasons sometimes the fast-path could fail with # "fatal: not in a git directory" error, so handle it manually tmpdir=$(mktemp --directory --tmpdir mutter-XXXXXX) mkdir "$tmpdir/repo" mv "$MUTTER_CLONE_PATH/.git" "$tmpdir/repo/" git clone "$tmpdir/repo" "$tmpdir/src" mv "$tmpdir"/src/* "$tmpdir"/src/.* "$MUTTER_CLONE_PATH" rm -r "$tmpdir/repo" rm -rv "$tmpdir" fi fi set +x fi .mutter.skip-git-clone: extends: - .skip-git-clone variables: MUTTER_CLONE_PATH: '' .mutter.run-as-user: image: name: ${FDO_DISTRIBUTION_IMAGE} entrypoint: - 'runuser' - '-u' - !reference [.mutter.fedora@common, variables, MUTTER_USER] - '--' .mutter.distribution-image: extends: - .fdo.distribution-image@fedora - .mutter.run-as-user .mutter.fedora@common: extends: - .skip-git-clone variables: FDO_DISTRIBUTION_VERSION: 41 BASE_TAG: '2024-09-20.2' MUTTER_USER: 'meta-user' FDO_DISTRIBUTION_PACKAGES: clang gcovr gdm gnome-shell python3-docutils sassc uncrustify xorg-x11-server-Xvfb mesa-dri-drivers mesa-vulkan-drivers xorg-x11-proto-devel qemu-system-x86-core busybox zenity python3-dbusmock gnome-desktop-testing FDO_DISTRIBUTION_EXEC: | set -e # Create $MUTTER_USER useradd -u 9999 -b /opt/mutter -ms /bin/bash $MUTTER_USER # Enable sudo for $MUTTER_USER echo "%$MUTTER_USER ALL = (ALL) NOPASSWD: ALL" > /etc/sudoers.d/99_mutter-user # Drop problematic vulkan driver that interferes with CI; # see https://gitlab.gnome.org/GNOME/gtk/-/commit/7814d1fd75911 rm /usr/share/vulkan/icd.d/powervr_mesa_icd.x86_64.json dnf install -y 'dnf-command(builddep)' dnf builddep -y mutter --setopt=install_weak_deps=False dnf builddep -y gnome-shell --setopt=install_weak_deps=False dnf builddep -y kernel --setopt=install_weak_deps=False dnf builddep -y gi-docgen --setopt=install_weak_deps=False dnf builddep -y wayland --setopt=install_weak_deps=False ./.gitlab-ci/install-meson-project.sh \ https://gitlab.gnome.org/jadahl/catch.git \ main ./.gitlab-ci/install-meson-project.sh \ https://gitlab.gnome.org/GNOME/gi-docgen.git \ main ./.gitlab-ci/install-common-dependencies.sh rpm -e --nodeps gnome-bluetooth-libs-devel \ mutter mutter-devel \ gnome-shell \ $(NULL) # Work-around for podman-push aborting on permission issue # https://gitlab.gnome.org/Infrastructure/Infrastructure/-/issues/1247 rm -rf /etc/pki/pesign/ chmod -R a+rX /opt/mutter/$MUTTER_USER chmod -R a+rX /var/lib/gdm # Ensure that we mark the project clone dir as safe directory git config --system --add safe.directory "$CI_PROJECT_DIR" if [[ x"$(uname -m )" = "xx86_64" ]] ; then # deprecated header no longer included in openssl-devel dnf install -y openssl-devel-engine if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" ]; then git clone --depth $MUTTER_CLONE_DEPTH \ $CI_MERGE_REQUEST_SOURCE_PROJECT_URL.git mutter-src \ -b "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" elif [ -n "$CI_COMMIT_BRANCH" ]; then git clone --depth $MUTTER_CLONE_DEPTH \ $CI_REPOSITORY_URL mutter-src -b "$CI_COMMIT_BRANCH" else git clone --depth $MUTTER_CLONE_DEPTH $CI_REPOSITORY_URL mutter-src fi meson setup build mutter-src -Dkvm_tests=true ninja -C build src/tests/kvm/bzImage mkdir -p /opt/mutter cp build/src/tests/kvm/bzImage /opt/mutter/bzImage dnf install -y python3-argcomplete git clone https://github.com/arighi/virtme-ng.git cd virtme-ng git fetch --tags git checkout v1.8 ./setup.py install --prefix=/usr cd .. rm -rf virtme-ng rm -rf build mutter-src fi retry: max: 2 when: - 'always' default: # Cancel jobs if newer commits are pushed to the branch interruptible: true # Auto-retry jobs in case of infra failures retry: max: 1 when: - 'runner_system_failure' - 'stuck_or_timeout_failure' - 'scheduler_failure' - 'api_failure' .mutter.fedora@x86_64: extends: - .mutter.fedora@common - .mutter.git-clone variables: FDO_DISTRIBUTION_TAG: "x86_64-${BASE_TAG}" .mutter.fedora@aarch64: extends: - .mutter.fedora@common - .mutter.git-clone variables: FDO_DISTRIBUTION_TAG: "aarch64-${BASE_TAG}" tags: - aarch64 workflow: rules: # Allow to switch from branch pipelines to MR pipelines seamlessly # https://docs.gitlab.com/ee/ci/jobs/job_control.html#avoid-duplicate-pipelines - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push" when: never - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Don't trigger a branch pipeline if there is an open MR - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS when: never - if: '$CI_COMMIT_BRANCH' - if: '$CI_COMMIT_TAG' .pipeline-guard: rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_TAG' - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' - if: '$CI_COMMIT_BRANCH =~ /^gnome-[0-9-]+$/' # Avoid catchall `when: manual` rule which might # cause duplicate pipelines to be triggered. # https://docs.gitlab.com/ee/ci/jobs/job_control.html#avoid-duplicate-pipelines # # Also make it so pipelines without MR need to be started # manually, since their state will most likely be WIP - if: '$CI_COMMIT_BRANCH' when: 'manual' .only-merge-requests: rules: - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^$/' when: never - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME when: on_success repo-sanity: extends: - .fdo.ci-fairy stage: review variables: GIT_DEPTH: "1" script: - > if [[ -z "$CI_REGISTRY_IMAGE" ]] ; then .gitlab-ci/simple-junit-report.sh check-junit-report.xml \ repo-sanity "The container registry should be enabled in the project general settings panel at $CI_PROJECT_URL/edit" ; exit 1 ; fi artifacts: expire_in: 1 week paths: - check-junit-report.xml reports: junit: check-junit-report.xml rules: - !reference [.only-merge-requests, rules] check-commit-log: extends: - .fdo.ci-fairy stage: review variables: GIT_DEPTH: "100" script: ci-fairy check-commits --junit-xml=commit-message-junit-report.xml artifacts: expire_in: 1 week paths: - commit-message-junit-report.xml reports: junit: commit-message-junit-report.xml rules: - !reference [.only-merge-requests, rules] check-merge-request: extends: - .fdo.ci-fairy - .skip-git-clone stage: review script: ci-fairy check-merge-request --require-allow-collaboration --junit-xml=check-merge-request-report.xml artifacts: expire_in: 1 week paths: - check-merge-request-report.xml reports: junit: check-merge-request-report.xml rules: - !reference [.only-merge-requests, rules] build-fedora-container@x86_64: extends: - .fdo.container-build@fedora@x86_64 - .mutter.fedora@x86_64 - .mutter.skip-git-clone stage: prepare rules: - !reference [.pipeline-guard, rules] build-fedora-container@aarch64: extends: - .fdo.container-build@fedora@aarch64 - .mutter.fedora@aarch64 - .mutter.skip-git-clone stage: prepare rules: - !reference [.pipeline-guard, rules] when: manual check-code-style: extends: - .mutter.distribution-image - .mutter.fedora@x86_64 variables: MUTTER_CLONE_DEPTH: 200 stage: code-review needs: - job: build-fedora-container@x86_64 artifacts: false script: git config --global --add safe.directory $CI_PROJECT_DIR ; git remote add target $CI_MERGE_REQUEST_PROJECT_URL.git ; git fetch target $CI_MERGE_REQUEST_TARGET_BRANCH_NAME ; export common_parent_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "target/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME") <(git rev-list --first-parent HEAD) | head -1) ; python3 -u ./check-style.py --dry-run --sha $common_parent_sha ; allow_failure: true rules: - !reference [.only-merge-requests, rules] .build-mutter-base: variables: BASE_MESON_OPTIONS: -Degl_device=true -Dwayland_eglstream=true -Dcatch=true .build-mutter: extends: - .mutter.distribution-image - .build-mutter-base stage: build script: - meson setup . build --prefix /usr --werror --fatal-meson-warnings --warnlevel 2 -Dbuildtype=debugoptimized -Db_coverage=true -Ddocs=true $BASE_MESON_OPTIONS $EXTRA_MESON_OPTIONS - meson compile -C build - sudo meson install --dry-run -C build artifacts: expire_in: 1 day paths: - build build-mutter@x86_64: variables: EXTRA_MESON_OPTIONS: -Dkvm_tests=true -Dkvm_kernel_image=/opt/mutter/bzImage extends: - .build-mutter - .mutter.fedora@x86_64 needs: - job: build-fedora-container@x86_64 artifacts: false build-mutter@aarch64: extends: - .build-mutter - .mutter.fedora@aarch64 needs: - job: build-fedora-container@aarch64 artifacts: false when: manual build-without-opengl-and-glx@x86_64: extends: - .mutter.distribution-image - .mutter.fedora@x86_64 stage: build needs: - job: build-fedora-container@x86_64 artifacts: false script: - meson setup . build --werror --prefix /usr -Dbuildtype=debugoptimized -Dopengl=false -Dglx=false -Degl_device=true -Dwayland_eglstream=true -Dintrospection=false - meson compile -C build - sudo meson install --no-rebuild -C build artifacts: paths: - build/meson-logs build-without-native-backend-and-wayland@x86_64: extends: - .mutter.distribution-image - .mutter.fedora@x86_64 stage: build needs: - job: build-fedora-container@x86_64 artifacts: false script: - meson setup . build --werror --prefix /usr -Dbuildtype=debugoptimized -Dnative_backend=false -Dudev=false -Dwayland=false -Dxwayland=false -Dtests=disabled -Dintrospection=false - meson compile -C build - sudo meson install --no-rebuild -C build artifacts: paths: - build/meson-logs build-wayland-xwayland@x86_64: extends: - .mutter.distribution-image - .mutter.fedora@x86_64 stage: build needs: - job: build-fedora-container@x86_64 artifacts: false script: - meson setup . build --werror --prefix /usr -Dbuildtype=debugoptimized -Dwayland=true -Dxwayland=true -Dx11=false -Dtests=disabled -Dintrospection=false - meson compile -C build - sudo meson install --no-rebuild -C build artifacts: paths: - build/meson-logs build-wayland-only@x86_64: extends: - .mutter.distribution-image - .mutter.fedora@x86_64 stage: build needs: - job: build-fedora-container@x86_64 artifacts: false script: - meson setup . build --werror --prefix /usr -Dbuildtype=debugoptimized -Dwayland=true -Dxwayland=false -Dx11=false -Dtests=disabled -Dintrospection=false - meson compile -C build - sudo meson install --no-rebuild -C build artifacts: paths: - build/meson-logs .test-setup: variables: GSETTINGS_SCHEMA_DIR: "$CI_PROJECT_DIR/build/data" MUTTER_DEBUG_DUMMY_MODE_SPECS: "800x600@10.0" PIPEWIRE_DEBUG: 2 PIPEWIRE_LOG: "$CI_PROJECT_DIR/build/meson-logs/pipewire.log" XVFB_SERVER_ARGS: "+iglx -noreset" G_SLICE: "always-malloc" MALLOC_CHECK_: "3" NO_AT_BRIDGE: "1" GTK_A11Y: "none" before_script: - !reference [.mutter.git-clone, before_script] .test-mutter-base: extends: - .mutter.distribution-image - .test-setup stage: test after_script: - pushd build - gcovr --root=.. --filter='\.\./src/' --filter='\.\./subprojects/' --filter='\.\./clutter/' --filter='\.\./cogl/' --filter='\.\./mtk/' --gcov-ignore-errors=no_working_dir_found --exclude='\.\./build/.*\.[ch]$' --exclude='.*/tests/.*\.[ch]$' --json --output=../coverage-${CI_JOB_NAME}.json - popd artifacts: expire_in: 1 day name: "mutter-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" when: always paths: - build - coverage-*.json .test-mutter: extends: - .mutter.distribution-image - .test-mutter-base script: - glib-compile-schemas $GSETTINGS_SCHEMA_DIR - mkdir -m 1777 /tmp/.X11-unix - ./src/tests/meta-dbus-runner.py -- meson test -C build --setup plain --no-suite 'mutter/kvm' --no-suite 'gvdb' --no-rebuild --timeout-multiplier 10 --print-errorlogs artifacts: reports: junit: "build/meson-logs/testlog-plain.junit.xml" test-mutter@x86_64: extends: - .mutter.fedora@x86_64 - .test-mutter tags: - asan needs: - build-mutter@x86_64 test-mutter-kvm@x86_64: extends: - .mutter.fedora@x86_64 - .test-mutter-base tags: - kvm script: - meson test -C build --no-rebuild --timeout-multiplier 10 --setup plain --suite 'mutter/kvm' --print-errorlogs needs: - build-mutter@x86_64 artifacts: reports: junit: "build/meson-logs/testlog-plain.junit.xml" test-mutter@aarch64: extends: - .mutter.fedora@aarch64 - .test-mutter tags: - asan-aarch64 needs: - build-mutter@aarch64 when: manual coverage: extends: - .mutter.distribution-image - .mutter.fedora@x86_64 stage: analyze script: - mkdir coveragereport - gcovr --add-tracefile 'coverage-*.json' --html-details --print-summary --output coveragereport/index.html - gcovr --add-tracefile 'coverage-*.json' --xml --output coveragereport/coverage.xml artifacts: expose_as: 'Coverage Report' paths: - coveragereport - coveragereport/index.html reports: coverage_report: coverage_format: cobertura # TODO: we may need to split this file once it will reach the # gitlab limit size of 10M, or it will stop working: # https://gitlab.com/gitlab-org/gitlab/-/issues/328772 path: coveragereport/coverage.xml coverage: '/^lines: (\d+\.\d+\%)/' needs: - test-mutter@x86_64 # - test-mutter@aarch64 - test-mutter-kvm@x86_64 can-run-gnome-shell@x86_64: extends: - .mutter.distribution-image - .mutter.fedora@x86_64 - .test-setup stage: test needs: - build-mutter@x86_64 before_script: - !reference [.mutter.fedora@x86_64, before_script] - sudo meson install --no-rebuild -C build script: - .gitlab-ci/checkout-gnome-shell.sh - meson setup gnome-shell gnome-shell/build --prefix /usr -Dbuildtype=debugoptimized -Dman=false --werror --fatal-meson-warnings - sudo meson install -C gnome-shell/build - mkdir -m 1777 /tmp/.X11-unix - dbus-run-session -- meson test -C gnome-shell/build --no-rebuild --timeout-multiplier 5 artifacts: expire_in: 7 day name: "mutter-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" when: on_failure paths: - gnome-shell/build/meson-logs test-mutter-coverity: rules: - if: '$CI_PIPELINE_SOURCE == "schedule" && $MUTTER_SCHEDULED_JOB == "coverity"' when: on_success - if: '$CI_COMMIT_BRANCH' when: 'manual' extends: - .mutter.distribution-image - .mutter.fedora@x86_64 needs: - job: build-fedora-container@x86_64 artifacts: false stage: analyze allow_failure: true script: - .gitlab-ci/download-coverity-tarball.sh - CC=clang meson setup coverity-build -Dprofiler=false - ./coverity/cov-analysis-linux64-*/bin/cov-build --dir cov-int meson compile -C coverity-build - tar czf cov-int.tar.gz cov-int - curl https://scan.coverity.com/builds?project=mutter --form token=$COVERITY_TOKEN --form email=carlosg@gnome.org --form file=@cov-int.tar.gz --form version="`git describe --tags`" --form description="GitLab CI build" cache: key: coverity-tarball paths: - coverity distinfo: extends: - .fdo.distribution-image@fedora - .mutter.fedora@x86_64 - .build-mutter-base - .test-setup stage: deploy needs: - job: build-fedora-container@x86_64 artifacts: false script: - meson setup . build - .gitlab-ci/export-artifact-path build > dist.env artifacts: reports: dotenv: dist.env paths: - dist.env rules: - if: '$CI_COMMIT_TAG' dist-mutter: extends: - .fdo.distribution-image@fedora - .mutter.fedora@x86_64 - .build-mutter-base - .test-setup stage: deploy needs: - job: build-fedora-container@x86_64 artifacts: false script: - meson setup . build --werror --prefix /usr -Dbuildtype=debugoptimized - glib-compile-schemas $GSETTINGS_SCHEMA_DIR - mkdir -m 1777 /tmp/.X11-unix - ./src/tests/meta-dbus-runner.py -- meson dist -C build --include-subprojects artifacts: expire_in: 7 day name: "mutter-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" when: always paths: - build/meson-private/dist-build/meson-logs rules: - if: '$CI_PIPELINE_SOURCE != "merge_request_event"' when: manual - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' changes: - "**/meson.build" - meson/* when: on_success - if: '$GITLAB_USER_LOGIN == "marge-bot"' when: on_success - if: '$CI_MERGE_REQUEST_ASSIGNEES == "marge-bot"' when: on_success installed-tests-mutter@x86_64: extends: - .fdo.distribution-image@fedora - .mutter.fedora@x86_64 - .build-mutter-base - .test-setup stage: deploy needs: - build-mutter@x86_64 script: - meson install -C build --no-rebuild - mkdir -m 1777 /tmp/.X11-unix - mkdir installed-tests-logs - gnome-desktop-testing-runner -L installed-tests-logs mutter artifacts: expire_in: 7 day name: "mutter-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" when: always paths: - installed-tests-logs rules: - if: '$CI_PIPELINE_SOURCE != "merge_request_event"' when: manual - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' changes: - "**/meson.build" - meson/* when: on_success - if: '$GITLAB_USER_LOGIN == "marge-bot"' when: on_success - if: '$CI_MERGE_REQUEST_ASSIGNEES == "marge-bot"' when: on_success dist-mutter-tarball: extends: dist-mutter needs: - distinfo artifacts: expose_as: 'Get tarball here' paths: - $TARBALL_ARTIFACT_PATH reports: dotenv: dist.env rules: - if: '$CI_COMMIT_TAG' release-module: stage: deploy needs: - dist-mutter-tarball extends: .release-module rules: - if: '$CI_COMMIT_TAG' reference: extends: - .mutter.distribution-image - .mutter.fedora@x86_64 stage: docs needs: - build-mutter@x86_64 script: - mkdir references - cp -r doc/website/* ./references - mv build/doc/reference/{clutter/clutter,cogl/cogl,meta/meta,mtk/mtk} references/ artifacts: expire_in: 1 week expose_as: 'Documentation' paths: - references/ pages: stage: deploy needs: ['reference'] extends: - .skip-git-clone script: - mv references public/ artifacts: paths: - public rules: - if: ($CI_DEFAULT_BRANCH == $CI_COMMIT_BRANCH && $CI_PROJECT_NAMESPACE == "GNOME")