spec: inputs: distribution_pipeline: description: 'Pipelines that creates installable GIMP' options: - GIMP_CI_APPIMAGE #trigger the appimage making. - GIMP_CI_FLATPAK #trigger the flatpak build and publishing (base but slow) - GIMP_CI_WIN_INSTALLER #trigger all native MSYS2 builds then creates Inno Windows installer (base but slow) - GIMP_CI_MS_STORE #trigger arm64 and x64 native MSYS2 builds then creates a .msixbundle (base but slow) - none default: 'none' test_pipeline: description: 'Pipelines used only for testing' options: - GIMP_CI_MESON_GCC #trigger the Debian GCC build (rare usefulness) - GIMP_CI_RASTER_ICONS #trigger the Debian Clang build without vector icons (rare usefulness) - GIMP_CI_CPPCHECK #trigger cppcheck (static code analysis) - none default: 'none' --- workflow: auto_cancel: on_new_commit: interruptible ################################################## # There are five "TYPES" of pipelines on our CI: # ################################################## ## 1. On MERGE REQUESTS, the following are triggered: ## - Abbreviated Linux Clang build (base & fast) ## - clang-format (static code analysis) ## - Execution tests (dynamic code analysis) .pipeline_merge: &CI_MERGE if: '$CI_PIPELINE_SOURCE == "merge_request_event"' interruptible: true variables: {} ## 2. LABELED MERGE REQUESTS (search for $CI_MERGE_REQUEST_LABELS =~ /.*Package). #'interruptible: true' needs to be hardcoded on job rules # GitLab is quite sensitive about rules 'if' order so be careful ## 3. On COMMITS except tags. ## - Linux Clang build (base & fast) ## - Execution tests (dynamic code analysis) ## - Source tarball (base & fast) ## - Developer documentation (base & fast) .pipeline_commit: &CI_COMMIT if: '$CI_PIPELINE_SOURCE == "push" && $CI_OPEN_MERGE_REQUESTS == null && $CI_COMMIT_TAG == null' interruptible: true variables: {} ## 4. RELEASES. ## - Source tarball (base & fast) ## - Developer documentation (base & fast) ## - Inno Windows installer (base but slow) ## - MS Store .msixupload (base but slow) .pipeline_release: &CI_RELEASE if: '$CI_COMMIT_TAG != null' interruptible: false variables: {} .default: ## 5. On CUSTOM builds though web GUI, API or schedules. ## Scheduled CI ($CI_PIPELINE_SOURCE == "schedule") will run regularly all ## the 'distribution_pipeline' and 'test_pipeline' above. To run them without ## waiting for schedules: https://gitlab.gnome.org/GNOME/gimp/-/pipelines/new interruptible: false # Common jobs behavior retry: max: 1 when: - 'runner_system_failure' - 'scheduler_failure' needs: [] # Default Docker image (unless otherwise defined) image: debian:${DEB_VERSION} variables: DEB_VERSION: "bookworm" # Common cloning procedure GIT_DEPTH: "1" GIT_SUBMODULE_STRATEGY: none # Enable colorful output when supported (e.g. ninja, cppcheck) CLICOLOR_FORCE: "1" # Common artifacts behavior artifacts: name: "${CI_JOB_NAME_SLUG}${VARIANT}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}" when: always stages: - dependencies - gimp - analysis - distribution ## AppImage CI (Debian) ## .debian: extends: .default rules: - if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:AppImage.*/' interruptible: true - if: '$GIMP_CI_APPIMAGE != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_APPIMAGE.*/' - <<: *CI_RELEASE parallel: matrix: - RUNNER: [aarch64, x86_64_v2] tags: - $RUNNER image: $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER} variables: CC: "clang" CXX: "clang++" CC_LD: lld CXX_LD: lld before_script: - export GIMP_PREFIX="${CI_PROJECT_DIR}/_install-${RUNNER}" timeout: 20m .debian_environ: &ENVIRON - echo -e "\e[0Ksection_start:`date +%s`:environ[collapsed=true]\r\e[0KPreparing build environment" - gcc -print-multi-os-directory 2>/dev/null | grep ./ && export LIB_DIR=$(gcc -print-multi-os-directory | sed 's/\.\.\///g') || export LIB_DIR="lib" - gcc -print-multiarch 2>/dev/null | grep . && export LIB_SUBDIR=$(echo $(gcc -print-multiarch)'/') ## Build-time vars - export PKG_CONFIG_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" - export XDG_DATA_DIRS="${GIMP_PREFIX}/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" ## Runtime vars - export PATH="${GIMP_PREFIX}/bin:$PATH" - export LD_LIBRARY_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" - export GI_TYPELIB_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}girepository-1.0${GI_TYPELIB_PATH:+:$GI_TYPELIB_PATH}" - echo -e "\e[0Ksection_end:`date +%s`:environ\r\e[0K" deps-debian: extends: .debian stage: dependencies image: name: gcr.io/kaniko-project/executor:debug entrypoint: [""] variables: GIT_STRATEGY: none UMFPACK: libumfpack5 PKGCONF_RELOCATABLE_OPTION: '-Dpkgconfig.relocatable=true' script: - export container=docker - mkdir -p /kaniko/.docker - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json # Install deps - echo "FROM debian:${DEB_VERSION}" > Dockerfile - echo "RUN echo -e \"\e[0Ksection_start:0000000001:deps_install[collapsed=true]\r\e[0KInstalling dependencies provided by Debian $DEB_VERSION\"" >> Dockerfile - echo "RUN apt-get update -qq" >> Dockerfile ## 'ca-certificates' is NOT a gimp dep, it is installed only to our Docker image work - echo "RUN apt-get install -qq -y --no-install-recommends ca-certificates" >> Dockerfile ## Build-time only dependencies - echo "RUN apt-get install -qq -y --no-install-recommends \\" >> Dockerfile - echo "appstream ccache clang desktop-file-utils gi-docgen git gobject-introspection libgtk-3-bin lld meson valac xauth xsltproc xvfb" >> Dockerfile ## Runtime dependencies - echo "RUN apt-get install -qq -y --no-install-recommends \\" >> Dockerfile - echo "at-spi2-core ffmpeg gettext gjs glib-networking graphviz graphviz-dev iso-codes libaa1-dev libappstream-glib-dev libarchive-dev libbz2-dev libcfitsio-dev libgexiv2-dev libgirepository1.0-dev libgs10 libgs-dev libgtk-3-dev libgudev-1.0-dev libheif-dev libjson-glib-dev libjxl-dev liblcms2-dev liblzma-dev libmaxflow-dev libmng-dev libmypaint-dev libomp-dev libopenexr-dev libopenjp2-7-dev libpoppler-glib-dev libqoi-dev libraw-dev librsvg2-dev libspiro-dev libsuitesparse-dev libtiff-dev $UMFPACK libunwind-dev libwebp-dev libwmf-dev libxmu-dev libxpm-dev mypaint-brushes poppler-data python3 python3-gi python3-gi-cairo" >> Dockerfile - echo "RUN echo -e \"\e[0Ksection_end:0000000002:deps_install\r\e[0K\"" >> Dockerfile # Prepare environ - echo "FROM $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER}" > Dockerfile2; - echo "RUN echo -e \"\e[0Ksection_start:`date +%s`:environ[collapsed=true]\r\e[0KPreparing build environment\"" >> Dockerfile2; - export LIB_DIR="lib"; - export LIB_SUBDIR=$([ "$(uname -m)" = 'aarch64' ] && echo "aarch64-linux-gnu/" || echo "x86_64-linux-gnu/"); - echo "ENV PKG_CONFIG_PATH=\"${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}\"" >> Dockerfile2; - echo "ENV XDG_DATA_DIRS=\"${GIMP_PREFIX}/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}\"" >> Dockerfile2; - echo "ENV CC=\"$CC\"" >> Dockerfile2; - echo "ENV CXX=\"$CXX\"" >> Dockerfile2; - echo "ENV CC_LD=\"$CC_LD\"" >> Dockerfile2; - echo "ENV CXX_LD=\"$CXX_LD\"" >> Dockerfile2; - echo "ENV CLICOLOR_FORCE=\"1\"" >> Dockerfile2; - echo "RUN echo -e \"\e[0Ksection_end:`date +%s`:environ\r\e[0K\"" >> Dockerfile2; # Build some dependencies ## Build babl - echo "RUN echo -e \"\e[0Ksection_start:`date +%s`:babl_build[collapsed=true]\r\e[0KBuilding babl\"" >> Dockerfile2; - echo "RUN git clone --branch \"\$([ \"$CI_COMMIT_TAG\" ] && echo \"\$(git ls-remote --tags --exit-code --refs https://gitlab.gnome.org/GNOME/babl.git | grep -oi \"BABL_[0-9]*_[0-9]*_[0-9]*\" | sort --version-sort | tail -1)\" || echo \"master\")\" --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/babl.git" $CI_PROJECT_DIR/babl >> Dockerfile2; - echo "RUN meson setup $CI_PROJECT_DIR/babl/_build-${RUNNER} $CI_PROJECT_DIR/babl -Dprefix=\"${GIMP_PREFIX}\" $PKGCONF_RELOCATABLE_OPTION" >> Dockerfile2; - echo "RUN ninja -C $CI_PROJECT_DIR/babl/_build-${RUNNER}" >> Dockerfile2; - echo "RUN ninja -C $CI_PROJECT_DIR/babl/_build-${RUNNER} install" >> Dockerfile2; - echo "RUN echo -e \"\e[0Ksection_end:`date +%s`:babl_build\r\e[0K\"" >> Dockerfile2; ## Build GEGL - echo "RUN echo -e \"\e[0Ksection_start:`date +%s`:gegl_build[collapsed=true]\r\e[0KBuilding gegl\"" >> Dockerfile2; - echo "RUN git clone --branch \"\$([ \"$CI_COMMIT_TAG\" ] && echo \"\$(git ls-remote --tags --exit-code --refs https://gitlab.gnome.org/GNOME/gegl.git | grep -oi \"GEGL_[0-9]*_[0-9]*_[0-9]*\" | sort --version-sort | tail -1)\" || echo \"master\")\" --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/gegl.git" $CI_PROJECT_DIR/gegl >> Dockerfile2; - echo "RUN meson setup $CI_PROJECT_DIR/gegl/_build-${RUNNER} $CI_PROJECT_DIR/gegl -Dprefix=\"${GIMP_PREFIX}\" $PKGCONF_RELOCATABLE_OPTION $WORKSHOP_OPTION" >> Dockerfile2; - echo "RUN ninja -C $CI_PROJECT_DIR/gegl/_build-${RUNNER}" >> Dockerfile2; - echo "RUN ninja -C $CI_PROJECT_DIR/gegl/_build-${RUNNER} install" >> Dockerfile2; - echo "RUN echo -e \"\e[0Ksection_end:`date +%s`:gegl_build\r\e[0K\"" >> Dockerfile2; - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER} --cache=true --cache-ttl=120h --image-fs-extract-retry 1 --verbosity=warn - if [ -f 'Dockerfile2' ]; then /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile2 --destination build-debian-${DEB_VERSION}-${RUNNER}-temp --cache=false --no-push --verbosity=warn; fi artifacts: paths: - _install-${RUNNER}/ - babl/_build-${RUNNER}/meson-logs/meson-log.txt - babl/_build-${RUNNER}/config.h - gegl/_build-${RUNNER}/meson-logs/meson-log.txt - gegl/_build-${RUNNER}/config.h expire_in: 2 hours gimp-debian: extends: .debian needs: ["deps-debian"] stage: gimp variables: GIT_SUBMODULE_STRATEGY: recursive script: - *ENVIRON # Build GIMP - echo -e "\e[0Ksection_start:`date +%s`:gimp_build[collapsed=true]\r\e[0KBuilding GIMP" - meson setup _build-${RUNNER} -Dprefix="${GIMP_PREFIX}" -Dpkgconfig.relocatable=true -Drelocatable-bundle=yes -Dcheck-update=yes -Dbuild-id=org.gimp.GIMP_official.AppImage.$(uname -m) - cd _build-${RUNNER} - ninja - echo -e "\e[0Ksection_end:`date +%s`:gimp_build\r\e[0K" # Create bundle - echo -e "\e[0Ksection_start:`date +%s`:gimp_bundle[collapsed=true]\r\e[0KCreating bundle" - ninja install &> ninja_install.log || cat ninja_install.log - cd .. - bash build/linux/appimage/3_dist-gimp-goappimage.sh --bundle-only &> goappimage.log || cat goappimage.log - echo -e "\e[0Ksection_end:`date +%s`:gimp_bundle\r\e[0K" artifacts: paths: - AppDir*/ - appimageignore* - _build-${RUNNER}/meson-logs/meson-log.txt - _build-${RUNNER}/config.h expire_in: 2 days ## GNU/Linux 64-bit CIs (Debian) ## .debian-x64: extends: .debian rules: - <<: *CI_MERGE - <<: *CI_COMMIT - if: '$GIMP_CI_MESON_CLANG != null' variables: {} - if: '$GIMP_CI_MESON_GCC != null || "$[[ inputs.test_pipeline ]]" =~ /.*GIMP_CI_MESON_GCC.*/' variables: CC: "cc" CXX: "c++" CC_LD: bfd CXX_LD: bfd VARIANT: "-gcc" - if: '$GIMP_CI_RASTER_ICONS != null || "$[[ inputs.test_pipeline ]]" =~ /.*GIMP_CI_RASTER_ICONS.*/' variables: MESON_OPTIONS: "-Dvector-icons=false" VARIANT: "-raster" - if: '$GIMP_CI_SOURCES != null' - <<: *CI_RELEASE parallel: matrix: - RUNNER: x86_64_v2 tags: [] deps-debian-x64: extends: .debian-x64 stage: !reference [deps-debian, stage] image: !reference [deps-debian, image] variables: GIT_STRATEGY: none WORKSHOP_OPTION: '-Dworkshop=true' script: - !reference [deps-debian, script] artifacts: !reference [deps-debian, artifacts] gimp-debian-x64: extends: .debian-x64 needs: ["deps-debian-x64"] stage: !reference [gimp-debian, stage] variables: !reference [gimp-debian, variables] script: - *ENVIRON # Check building - echo -e "\e[0Ksection_start:`date +%s`:gimp_build[collapsed=true]\r\e[0KBuilding GIMP" - meson setup _build-${RUNNER} -Dprefix="${GIMP_PREFIX}" -Dfile-plug-ins-test=true $MESON_OPTIONS - cd _build-${RUNNER} - ninja - echo -e "\e[0Ksection_end:`date +%s`:gimp_build\r\e[0K" # Check execution - echo -e "\e[0Ksection_start:`date +%s`:gimp_test[collapsed=true]\r\e[0KTesting GIMP execution" - ninja test - echo -e "\e[0Ksection_end:`date +%s`:gimp_test\r\e[0K" # Check source - echo -e "\e[0Ksection_start:`date +%s`:gimp_tar[collapsed=true]\r\e[0KChecking GIMP source" - if [ $(git diff |wc -l) -ne 0 ]; then echo "ERROR. A generated file was updated without the source:"; git diff; exit 1; fi - if [ "$VARIANT" != "-gcc" ] && [ "$VARIANT" != "-raster" ] && [ "$CI_PIPELINE_SOURCE" != "merge_request_event" ]; then ninja dist &> ninja_dist.txt || cat ninja_dist.txt; fi - echo -e "\e[0Ksection_end:`date +%s`:gimp_tar\r\e[0K" # Check install - echo -e "\e[0Ksection_start:`date +%s`:gimp_install[collapsed=true]\r\e[0KChecking GIMP installation" - ninja install &> ninja_install.txt || cat ninja_install.txt; - echo -e "\e[0Ksection_end:`date +%s`:gimp_install\r\e[0K" artifacts: paths: - _install-${RUNNER}/ - _build-${RUNNER}/meson-logs/meson-log.txt - _build-${RUNNER}/meson-dist/ - _build-${RUNNER}/config.h reports: junit: "_build-${RUNNER}/meson-logs/testlog.junit.xml" expire_in: 2 days ## Flatpak CI ## .flatpak-x64: extends: .default rules: - if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Flatpak.*/' interruptible: true - if: '$GIMP_CI_FLATPAK != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_FLATPAK.*/' tags: - flatpak image: 'quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master' before_script: - export GIMP_PREFIX="${CI_PROJECT_DIR}/_install" timeout: 40m deps-flatpak-x64: extends: .flatpak-x64 stage: dependencies #https://gitlab.gnome.org/Infrastructure/Infrastructure/-/issues/1502 #cache: #key: ${CI_JOB_NAME_SLUG} #paths: #- .flatpak-builder/ script: - bash build/linux/flatpak/1_build-deps-flatpak.sh artifacts: paths: - .flatpak-builder.tar - flatpak-builder.log - babl-meson-log.tar - gegl-meson-log.tar expire_in: 2 hours gimp-flatpak-x64: extends: .flatpak-x64 needs: ["deps-flatpak-x64"] stage: gimp variables: GIT_SUBMODULE_STRATEGY: recursive script: - bash build/linux/flatpak/2_build-gimp-flatpak.sh artifacts: paths: - repo.tar - gimp-meson-log.tar expire_in: 2 days ## WINDOWS pipelines (native MSYS2) ## .win: extends: .default rules: - if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Windows Installer.*/ && $CI_MERGE_REQUEST_LABELS =~ /.*Package:Microsoft Store.*/' interruptible: true variables: INSTALLER_OPTION: '-Dwindows-installer=true' STORE_OPTION: '-Dms-store=true' - if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Windows Installer.*/' interruptible: true variables: INSTALLER_OPTION: '-Dwindows-installer=true' - if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Microsoft Store.*/ && $CI_JOB_NAME =~ /.*64.*/ && $CI_JOB_NAME !~ /.*installer.*/' interruptible: true variables: STORE_OPTION: '-Dms-store=true' - if: '$GIMP_CI_WIN_INSTALLER != null && $GIMP_CI_MS_STORE != null' variables: INSTALLER_OPTION: '-Dwindows-installer=true' STORE_OPTION: '-Dms-store=true' - if: '$GIMP_CI_WIN_INSTALLER != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_WIN_INSTALLER.*/' variables: INSTALLER_OPTION: '-Dwindows-installer=true' - if: '$GIMP_CI_MS_STORE != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_MS_STORE.*/ && $CI_JOB_NAME =~ /.*64.*/ && $CI_JOB_NAME !~ /.*installer.*/' variables: STORE_OPTION: '-Dms-store=true' - <<: *CI_RELEASE variables: INSTALLER_OPTION: '-Dwindows-installer=true' STORE_OPTION: '-Dms-store=true' parallel: matrix: - RUNNER: windows-aarch64 MSYSTEM_PREFIX: clangarm64 - RUNNER: win32-ps MSYSTEM_PREFIX: clang64 tags: - $RUNNER variables: MSYS_ROOT: 'C:/msys64' CC: cc CXX: c++ #meson.build forces non-relocatable .pc. See: https://github.com/mesonbuild/meson/issues/14346 PKGCONF_RELOCATABLE_OPTION: '-Dpkgconfig.relocatable=true' before_script: # FIXME:'gimpenv' have buggy code about Windows paths. See: https://gitlab.gnome.org/GNOME/gimp/-/issues/12284 - $GIMP_PREFIX = "$PWD\_install-$MSYSTEM_PREFIX".Replace('\', '/') timeout: 40m .win_environ: &WIN_ENVIRON - Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):win_environ[collapsed=true]$([char]13)$([char]27)[0KPreparing build environment" ## Build-time vars - $env:PKG_CONFIG_PATH = "$GIMP_PREFIX/lib/pkgconfig;$MSYS_ROOT/$MSYSTEM_PREFIX/lib/pkgconfig;$MSYS_ROOT/$MSYSTEM_PREFIX/share/pkgconfig" - $env:XDG_DATA_DIRS = "$GIMP_PREFIX/share;$MSYS_ROOT/$MSYSTEM_PREFIX/share" ## Runtime vars - $env:PATH = "$GIMP_PREFIX/bin;$MSYS_ROOT/$MSYSTEM_PREFIX/bin;" + $env:PATH - $env:GI_TYPELIB_PATH = "$GIMP_PREFIX/lib/girepository-1.0;$MSYS_ROOT/$MSYSTEM_PREFIX/lib/girepository-1.0" - Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):win_environ$([char]13)$([char]27)[0K" deps-win: extends: .win stage: dependencies script: - build/windows/1_build-deps-msys2.ps1 artifacts: paths: - _install-$MSYSTEM_PREFIX/ - babl/_build-$MSYSTEM_PREFIX/meson-logs/meson-log.txt - gegl/_build-$MSYSTEM_PREFIX/meson-logs/meson-log.txt expire_in: 2 hours gimp-win: extends: .win needs: ["deps-win"] stage: gimp variables: GIT_SUBMODULE_STRATEGY: recursive script: - build/windows/2_build-gimp-msys2.ps1 artifacts: paths: - gimp-$MSYSTEM_PREFIX/ - _build-$MSYSTEM_PREFIX/meson-logs/meson-log.txt - _build-$MSYSTEM_PREFIX/done-dll.list # Needed by dist-installer-weekly and dist-store-weekly - _build-$MSYSTEM_PREFIX/config.h - _build-$MSYSTEM_PREFIX/build/windows/installer/ - _build-$MSYSTEM_PREFIX/build/windows/store/ expire_in: 2 days ## WINDOWS x86 legacy CI (native MSYS2) ## .win-x86: extends: .win rules: - !reference [.win, rules] - if: '$GIMP_CI_MSYS2_WIN32 != null' parallel: matrix: - RUNNER: win32-ps MSYSTEM_PREFIX: mingw32 variables: MINGW_PACKAGE_PREFIX: mingw-w64-i686 CC: cc CXX: c++ deps-win-x86: extends: .win-x86 stage: !reference [deps-win, stage] script: - !reference [deps-win, script] artifacts: !reference [deps-win, artifacts] gimp-win-x86: extends: .win-x86 needs: ["deps-win-x86"] stage: !reference [gimp-win, stage] variables: GIT_SUBMODULE_STRATEGY: recursive script: - $env:PATH = "C:/msys64/usr/bin;" + $env:PATH - !reference [gimp-win, script] artifacts: !reference [gimp-win, artifacts] ## Analysis ## file-plug-in-tests: # FIXME: Do we need another job testing this under Windows? MSYS2 usually has # the latest deps. It might be a good idea to test that too, maybe weekly? extends: .debian-x64 rules: # Don't run on release since the plug-in doesn't get installed in releases - <<: *CI_MERGE - <<: *CI_COMMIT needs: ["gimp-debian-x64"] stage: analysis variables: GIT_STRATEGY: none GIMP_TESTS_DATA_FOLDER: "$CI_PROJECT_DIR/_data/gimp-test-images/" GIMP_TESTS_LOG_FILE: "$CI_PROJECT_DIR/_log/import-tests.log" REGRESSION_STRING: "Total number of regressions: 0" cache: key: $CI_JOB_NAME paths: - _data script: - API_VER=$(grep GIMP_PKGCONFIG_VERSION _build*/config.h | head -1 | sed 's/^.*"\([^"]*\)"$/\1/') - APP_VER=$(grep GIMP_APP_VERSION _build*/config.h | head -1 | sed 's/^.*"\([^"]*\)"$/\1/') - *ENVIRON - pkg-config --variable=gimplibdir gimp-${API_VER} 2>/dev/null | grep . && PLUG_IN_DIR=$(echo $(pkg-config --variable=gimplibdir gimp-${API_VER})'/plug-ins/') - export PYTHONPATH="${PLUG_IN_DIR}test-file-plug-ins" - export GIMP_TESTS_CONFIG_FILE="${PLUG_IN_DIR}test-file-plug-ins/tests/batch-config.ini" - mkdir _log - mkdir _data && cd _data - git clone --depth=${GIT_DEPTH} https://gitlab.gnome.org/Infrastructure/gimp-test-images.git gimp-test-images - cd .. - cat ${PLUG_IN_DIR}test-file-plug-ins/batch-import-tests.py | gimp-console-${APP_VER} -idf --batch-interpreter python-fu-eval -b - --quit - if [ $(grep -c "${REGRESSION_STRING}" "${GIMP_TESTS_LOG_FILE}") -ne 1 ]; then echo "There are file import regressions. Check the log at ${GIMP_TESTS_LOG_FILE}!"; exit 1; fi # FIXME No export testing for now until it's more developed. A limited test # can be done from the plug-in for bmp export. artifacts: paths: - _log/ reports: junit: "_log/import-tests.xml" expire_in: 2 days meson-health: extends: .default rules: - <<: *CI_MERGE - <<: *CI_COMMIT stage: analysis script: - apt-get update - apt-get install -y git - bash .gitlab/run_meson_health_diff.sh clang-format: extends: .default rules: - <<: *CI_MERGE stage: analysis script: - apt-get update - apt-get install -y clang-format git - .gitlab/run_style_check_diff.sh allow_failure: true artifacts: when: on_failure paths: - fetch_upstream.log - fetch_origin.log expire_in: 2 days cppcheck: extends: .default rules: - if: '$GIMP_CI_CPPCHECK != null || "$[[ inputs.test_pipeline ]]" =~ /.*GIMP_CI_CPPCHECK.*/' stage: analysis script: - apt-get update - apt-get install -y cppcheck - cppcheck -q -j8 --enable=all --force --output-file=cppcheck.xml --xml --xml-version=2 -i _build -i babl -i gegl -i _install -i .local -i .cache -i gimp-x64 . - mkdir report - cppcheck-htmlreport --source-dir=. --title=gimp --file=cppcheck.xml --report-dir=report artifacts: paths: - report/ expire_in: 8 days ## Ready-to-distribute ## sources-debian: extends: .default rules: - <<: *CI_COMMIT - if: '$GIMP_CI_SOURCES != null' - <<: *CI_RELEASE needs: ["gimp-debian-x64"] stage: distribution variables: GIT_STRATEGY: none script: - mv _build*/meson-dist/gimp-*.tar.xz . - FILENAME=`ls gimp-*.tar.xz` && sha256sum gimp-*.tar.xz > ${FILENAME}.SHA256SUMS && sha512sum gimp-*.tar.xz > ${FILENAME}.SHA512SUMS artifacts: paths: - gimp-*.tar.xz - gimp-*.tar.xz.SHA256SUMS - gimp-*.tar.xz.SHA512SUMS expire_in: 2 days dev-docs: extends: .default rules: - <<: *CI_COMMIT - if: '$GIMP_CI_SOURCES != null' - <<: *CI_RELEASE needs: ["deps-debian-x64", "gimp-debian-x64"] stage: distribution variables: GIT_STRATEGY: none script: - apt-get update - apt-get install -y xz-utils - export GIMP_PREFIX=$(echo $PWD/_install*) - BABL_VER=$(grep BABL_VERSION babl/_build*/config.h | head -1 | sed 's/^.*"\([^"]*\)"$/\1/') && BABL_API_VER=$(grep BABL_API_VERSION babl/_build*/config.h | head -1 | sed 's/^.*"\([^"]*\)"$/\1/') && DIR_NAME=babl-api-docs-$BABL_VER && mkdir $DIR_NAME && mv "${GIMP_PREFIX}/share/doc/babl-$BABL_API_VER" $DIR_NAME/ && TAR_NAME="$DIR_NAME.tar.xz" && tar --dereference -cJf ${TAR_NAME} $DIR_NAME && sha256sum $TAR_NAME > ${TAR_NAME}.SHA256SUMS && sha512sum $TAR_NAME > ${TAR_NAME}.SHA512SUMS - GEGL_MAJ_VER=$(grep GEGL_MAJOR_VERSION gegl/_build*/config.h |head -1 |sed 's/^[^0-9]*\([0-9]*\).*$/\1/') && GEGL_MIN_VER=$(grep GEGL_MINOR_VERSION gegl/_build*/config.h |head -1 |sed 's/^[^0-9]*\([0-9]*\).*$/\1/') && GEGL_MIC_VER=$(grep GEGL_MICRO_VERSION gegl/_build*/config.h |head -1 |sed 's/^[^0-9]*\([0-9]*\).*$/\1/') && GEGL_VER="$GEGL_MAJ_VER.$GEGL_MIN_VER.$GEGL_MIC_VER" && GEGL_API_VER="$GEGL_MAJ_VER.$GEGL_MIN_VER" && DIR_NAME=gegl-api-docs-$GEGL_VER && mkdir $DIR_NAME && mv "${GIMP_PREFIX}/share/doc/gegl-$GEGL_API_VER" $DIR_NAME/ && TAR_NAME="$DIR_NAME.tar.xz" && tar --dereference -cJf ${TAR_NAME} $DIR_NAME && sha256sum $TAR_NAME > ${TAR_NAME}.SHA256SUMS && sha512sum $TAR_NAME > ${TAR_NAME}.SHA512SUMS - GIMP_VER=$(grep GIMP_VERSION _build*/config.h | head -1 | sed 's/^.*"\([^"]*\)"$/\1/') && APP_VER=$(echo $GIMP_VER | sed 's/\([0-9]\+\.[0-9]\+\)\..*/\1/') && DIR_NAME=gimp-api-docs-$GIMP_VER && mkdir $DIR_NAME && mv "${GIMP_PREFIX}/share/doc/gimp-$APP_VER" $DIR_NAME/reference && TAR_NAME="$DIR_NAME.tar.xz" && tar --dereference -cJf ${TAR_NAME} $DIR_NAME && sha256sum $TAR_NAME > ${TAR_NAME}.SHA256SUMS && sha512sum $TAR_NAME > ${TAR_NAME}.SHA512SUMS artifacts: paths: - babl-api-docs-*.tar.xz - babl-api-docs-*.tar.xz.SHA256SUMS - babl-api-docs-*.tar.xz.SHA512SUMS - gegl-api-docs-*.tar.xz - gegl-api-docs-*.tar.xz.SHA256SUMS - gegl-api-docs-*.tar.xz.SHA512SUMS - gimp-api-docs-*.tar.xz - gimp-api-docs-*.tar.xz.SHA256SUMS - gimp-api-docs-*.tar.xz.SHA512SUMS expire_in: 2 days dist-appimage-weekly: extends: .default rules: - !reference [.debian, rules] needs: ["gimp-debian"] stage: distribution script: - bash build/linux/appimage/3_dist-gimp-goappimage.sh artifacts: expose_as: 'Linux appimage' paths: - build/linux/appimage/_Output/ expire_in: 8 days include: project: 'GNOME/citemplates' file: 'flatpak/flatpak_ci_initiative.yml' dist-flatpak-weekly: extends: - .default - .publish_nightly rules: - if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Flatpak.*/' interruptible: true - if: '$GIMP_CI_FLATPAK != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_FLATPAK.*/' needs: ["gimp-flatpak-x64"] stage: distribution script: - bash build/linux/flatpak/3_dist-gimp-flatpak.sh artifacts: expose_as: 'Linux flatpak' paths: - build/linux/flatpak/_Output/ expire_in: 8 days dist-installer-weekly: extends: .default rules: - !reference [.win, rules] needs: ["gimp-win", "gimp-win-x86"] stage: distribution tags: - windows-aarch64 variables: MSYS_ROOT: 'C:/msys64' script: - build/windows/installer/3_dist-gimp-inno.ps1 artifacts: expose_as: 'Windows exe' paths: - build/windows/installer/_Output/ - inno.log expire_in: 8 days dist-store-weekly: extends: .default rules: - if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Microsoft Store.*/' interruptible: true - if: '$GIMP_CI_MS_STORE != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_MS_STORE.*/' - <<: *CI_RELEASE needs: ["gimp-win"] stage: distribution tags: - win32-ps script: - build\windows\store\3_dist-gimp-winsdk.ps1 artifacts: expose_as: 'Windows msix' paths: - build/windows/store/_Output/ - winsdk.log expire_in: 8 days