include: - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/34f4ade99434043f88e164933f570301fd18b125/templates/fedora.yml' - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/34f4ade99434043f88e164933f570301fd18b125/templates/ci-fairy.yml' stages: - review - prepare - code-review - build - test - analyze - docs - deploy variables: FDO_UPSTREAM_REPO: GNOME/mutter .mutter.fedora@common: variables: FDO_DISTRIBUTION_VERSION: 37 BASE_TAG: '2023-02-22.0' FDO_DISTRIBUTION_PACKAGES: asciidoc clang gcovr gdm gnome-shell sassc uncrustify xorg-x11-server-Xvfb mesa-dri-drivers xorg-x11-proto-devel qemu-system-x86-core busybox gi-docgen python3-pip pkgconfig(libgcrypt) pkgconfig(colord) pkgconfig(gnome-desktop-4) pkgconfig(lcms2) pkgconfig(libnma-gtk4) FDO_DISTRIBUTION_EXEC: | 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 wayland --setopt=install_weak_deps=False && dnf builddep -y wayland-protocols --setopt=install_weak_deps=False && dnf builddep -y kernel --setopt=install_weak_deps=False && ./.gitlab-ci/install-meson-project.sh \ https://gitlab.gnome.org/jadahl/catch.git \ main . 29ad36e2b1d28ac9d8b2bc44af46296cb1db5d66 && ./.gitlab-ci/install-meson-project.sh \ https://gitlab.gnome.org/GNOME/glib.git \ 2.75.1 . && pip install git+https://github.com/martinpitt/python-dbusmock.git@743da675c37bfc469ec385b88c3b4ad4838cfa48 && rpm -e --nodeps gnome-bluetooth-libs-devel \ mutter mutter-devel \ gnome-shell && dnf clean all && if [[ x"$(uname -m )" = "xx86_64" ]] ; then meson build -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-pyelftools && git clone https://github.com/jadahl/virtme.git && cd virtme && git checkout 87bcebe63f61e2a3ccd418b0903eab90113a47ae && ./setup.py install --prefix=/usr && cd .. && rm -rf virtme 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 variables: FDO_DISTRIBUTION_TAG: "x86_64-${BASE_TAG}" .mutter.fedora@aarch64: extends: .mutter.fedora@common 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' check-commit-log: extends: - .fdo.ci-fairy stage: review variables: GIT_DEPTH: "100" script: - if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ; then ci-fairy check-commits --junit-xml=commit-message-junit-report.xml ; else echo "Not a merge request" ; fi artifacts: expire_in: 1 week paths: - commit-message-junit-report.xml reports: junit: commit-message-junit-report.xml rules: - !reference [.pipeline-guard, rules] check-merge-request: extends: - .fdo.ci-fairy stage: review variables: GIT_STRATEGY: none script: - if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ; then ci-fairy check-merge-request --require-allow-collaboration --junit-xml=check-merge-request-report.xml ; else echo "Not a merge request" ; fi artifacts: expire_in: 1 week paths: - check-merge-request-report.xml reports: junit: check-merge-request-report.xml rules: - !reference [.pipeline-guard, rules] build-fedora-container@x86_64: extends: - .fdo.container-build@fedora@x86_64 - .mutter.fedora@x86_64 stage: prepare needs: - check-commit-log - check-merge-request variables: GIT_STRATEGY: none build-fedora-container@aarch64: extends: - .fdo.container-build@fedora@aarch64 - .mutter.fedora@aarch64 stage: prepare needs: - check-commit-log - check-merge-request variables: GIT_STRATEGY: none check-code-style: extends: - .fdo.distribution-image@fedora - .mutter.fedora@x86_64 stage: code-review needs: - build-fedora-container@x86_64 script: - if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ; then 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 ; else echo "Not a merge request" ; fi allow_failure: true .build-mutter-base: variables: BASE_MESON_OPTIONS: -Degl_device=true -Dwayland_eglstream=true -Dcatch=true .build-mutter: extends: - .fdo.distribution-image@fedora - .build-mutter-base stage: build script: - meson . build --prefix /usr --werror --fatal-meson-warnings --warnlevel 2 -Dbuildtype=debugoptimized -Db_coverage=true $BASE_MESON_OPTIONS $EXTRA_MESON_OPTIONS - meson compile -C build - meson install -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: - build-fedora-container@x86_64 build-mutter@aarch64: extends: - .build-mutter - .mutter.fedora@aarch64 needs: - build-fedora-container@aarch64 build-without-opengl-and-glx@x86_64: extends: - .fdo.distribution-image@fedora - .mutter.fedora@x86_64 stage: build needs: - build-fedora-container@x86_64 script: - meson . build --werror --prefix /usr -Dbuildtype=debugoptimized -Dopengl=false -Dglx=false -Degl_device=true -Dwayland_eglstream=true - meson compile -C build - meson install -C build artifacts: paths: - build/meson-logs build-without-native-backend-and-wayland@x86_64: extends: - .fdo.distribution-image@fedora - .mutter.fedora@x86_64 stage: build needs: - build-fedora-container@x86_64 script: - meson . build --werror --prefix /usr -Dbuildtype=debugoptimized -Dnative_backend=false -Dudev=false -Dwayland=false -Dxwayland=false -Dcore_tests=false -Dnative_tests=false - meson compile -C build - meson install -C build artifacts: paths: - build/meson-logs build-wayland-only@x86_64: extends: - .fdo.distribution-image@fedora - .mutter.fedora@x86_64 stage: build needs: - build-fedora-container@x86_64 script: - meson . build --werror --prefix /usr -Dbuildtype=debugoptimized -Dwayland=true -Dxwayland=false -Dcore_tests=false -Dnative_tests=false - meson compile -C build - meson install -C build artifacts: paths: - build/meson-logs .test-setup: &test-setup variables: XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir" 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: # Disable e.g. audio support to not dead lock screen cast tests - mkdir -m 700 $XDG_RUNTIME_DIR - pipewire & sleep 2 .test-mutter-base: extends: - .fdo.distribution-image@fedora <<: *test-setup stage: test after_script: - pushd build - gcovr --root=.. --filter='\.\./src/' --filter='\.\./clutter/' --filter='\.\./cogl/' --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: - .fdo.distribution-image@fedora - .test-mutter-base script: - glib-compile-schemas $GSETTINGS_SCHEMA_DIR - xvfb-run -a -s "$XVFB_SERVER_ARGS" ./src/tests/meta-dbus-runner.py --launch=wireplumber meson test -C build --setup plain --no-suite 'mutter/kvm' --no-rebuild --timeout-multiplier 10 artifacts: reports: junit: "build/meson-logs/testlog-plain.junit.xml" test-mutter@x86_64: extends: - .test-mutter - .mutter.fedora@x86_64 tags: - asan needs: - build-mutter@x86_64 test-mutter-kvm@x86_64: extends: - .test-mutter-base - .mutter.fedora@x86_64 tags: - kvm script: meson test -C build --no-rebuild --timeout-multiplier 10 --setup plain --suite 'mutter/kvm' needs: - build-mutter@x86_64 artifacts: reports: junit: "build/meson-logs/testlog-plain.junit.xml" test-mutter@aarch64: extends: - .test-mutter - .mutter.fedora@aarch64 tags: - asan-aarch64 needs: - build-mutter@aarch64 coverage: extends: - .fdo.distribution-image@fedora - .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-build-gnome-shell@x86_64: extends: - .fdo.distribution-image@fedora - .mutter.fedora@x86_64 stage: test needs: - build-mutter@x86_64 before_script: - meson install --no-rebuild -C build script: - .gitlab-ci/checkout-gnome-shell.sh - meson gnome-shell gnome-shell/build --prefix /usr -Dman=false - meson install -C gnome-shell/build test-mutter-coverity: rules: - if: '$CI_PIPELINE_SOURCE == "schedule" && $MUTTER_SCHEDULED_JOB == "coverity"' when: always - if: '$CI_COMMIT_BRANCH' when: 'manual' extends: - .fdo.distribution-image@fedora - .mutter.fedora@x86_64 needs: - build-fedora-container@x86_64 stage: analyze allow_failure: true script: - .gitlab-ci/download-coverity-tarball.sh - CC=clang meson 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 dist-mutter: extends: - .fdo.distribution-image@fedora - .mutter.fedora@x86_64 - .build-mutter-base <<: *test-setup stage: deploy needs: - build-fedora-container@x86_64 script: - meson . build --werror --prefix /usr -Dbuildtype=debugoptimized - glib-compile-schemas $GSETTINGS_SCHEMA_DIR - xvfb-run -a -s "$XVFB_SERVER_ARGS" ./src/tests/meta-dbus-runner.py --launch=wireplumber meson dist -C build rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' changes: - "**/meson.build" - meson/* dist-mutter-tarball: extends: dist-mutter artifacts: expose_as: 'Get tarball here' paths: - build/meson-dist/$CI_PROJECT_NAME-$CI_COMMIT_TAG.tar.xz rules: - if: '$CI_COMMIT_TAG' reference: extends: - .fdo.distribution-image@fedora - .mutter.fedora@x86_64 stage: docs needs: - job: build-fedora-container@x86_64 artifacts: false script: - meson . build --werror -Ddocs=true -Dtests=false - ninja -C build - mkdir references - mv build/doc/reference/{cally/cally,clutter/clutter,cogl/cogl,cogl-pango/cogl-pango,meta/meta} references/ artifacts: expire_in: 1 week expose_as: 'Documentation' paths: - references/ pages: stage: deploy needs: ['reference'] script: - mv references public/ artifacts: paths: - public rules: - if: ($CI_DEFAULT_BRANCH == $CI_COMMIT_BRANCH && $CI_PROJECT_NAMESPACE == "GNOME")