diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 44e595be44..c160eb4472 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -37,6 +37,32 @@ stages: - distribution - analysis +# GitLab "default:" is buggy so let's use extensions and references +.default: + # Caching support + variables: + CCACHE_BASEDIR: "$CI_PROJECT_DIR" + CCACHE_DIR: "$CI_PROJECT_DIR/_ccache" + CC: "ccache clang" + CXX: "ccache clang++" + cache: + key: $CI_JOB_NAME + paths: + - _ccache/ + # Universal variables (works in all OSes and archs) + before_script: + - export PATH="$GIMP_PREFIX/bin:$PATH" + - gcc -print-multi-os-directory | grep . && LIB_DIR=$(gcc -print-multi-os-directory | sed 's/\.\.\///g') || LIB_DIR="lib" + - gcc -print-multiarch | grep . && LIB_SUBDIR=$(echo $(gcc -print-multiarch)'/') + - export PKG_CONFIG_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" + - export LD_LIBRARY_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + - export XDG_DATA_DIRS="${GIMP_PREFIX}/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" + - export GI_TYPELIB_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}girepository-1.0${GI_TYPELIB_PATH:+:$GI_TYPELIB_PATH}" + # Common artifacts behavior + artifacts: + name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}" + when: always + variables: GIT_DEPTH: "1" ARTIFACTS_SUFFIX: "-x64" @@ -47,11 +73,6 @@ variables: image-debian-x64: rules: - # On commits and merge requests. - - if: '$CI_PIPELINE_SOURCE == "push"' - - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - # On releases. - - if: '$CI_COMMIT_TAG != null' # Custom builds though web GUI, API or schedules. - if: '$GIMP_CI_MESON_CLANG != null' - if: '$GIMP_CI_MESON_GCC != null' @@ -60,13 +81,18 @@ image-debian-x64: - if: '$GIMP_CI_CROSSROAD_WIN32 != null' - if: '$GIMP_CI_SOURCES != null' - if: '$GIMP_CI_FLATPAK != null' + # On merge requests and commits. + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + - if: '$CI_PIPELINE_SOURCE == "push"' + # On releases. + - if: '$CI_COMMIT_TAG != null' stage: prepare - variables: - GIT_STRATEGY: none - cache: {} image: name: gcr.io/kaniko-project/executor:debug entrypoint: [""] + variables: + GIT_STRATEGY: none + cache: {} script: - export container=docker - mkdir -p /kaniko/.docker @@ -81,6 +107,8 @@ image-debian-x64: - echo "appstream at-spi2-core build-essential + ccache + clang cpio desktop-file-utils ffmpeg @@ -154,37 +182,11 @@ image-debian-x64: ## GNU/Linux 64-bit CIs (Debian bookworm) ## -deps-debian-x64: - rules: - # On commits and merge requests. - - if: '$CI_PIPELINE_SOURCE == "push"' - - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - # On releases. - - if: '$CI_COMMIT_TAG != null' - # Custom builds though web GUI, API or schedules. - - if: '$GIMP_CI_MESON_CLANG != null' - - if: '$GIMP_CI_MESON_GCC != null' - - if: '$GIMP_CI_RASTER_ICONS != null' - - if: '$GIMP_CI_CROSSROAD_WIN64 != null' - - if: '$GIMP_CI_CROSSROAD_WIN32 != null' - - if: '$GIMP_CI_SOURCES != null' - - if: '$GIMP_CI_FLATPAK != null' - variables: - CC: "clang" - CXX: "clang++" +.deps-debian-base: + extends: .default + needs: ["image-debian-x64"] stage: dependencies image: $CI_REGISTRY_IMAGE:build-debian-latest - cache: - paths: - - apt-cache - artifacts: - name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}" - expire_in: 2 hours - when: always - paths: - - "_install${ARTIFACTS_SUFFIX}" - - _babl/_build${ARTIFACTS_SUFFIX} - - _gegl/_build${ARTIFACTS_SUFFIX} before_script: - if [ "$CI_COMMIT_TAG" != "" ]; then repo=https://gitlab.gnome.org/GNOME/babl.git; @@ -201,78 +203,92 @@ deps-debian-x64: fi - git clone $babl_branch --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/babl.git _babl - git clone $gegl_branch --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/gegl.git _gegl - - export PATH="$GIMP_PREFIX/bin:$PATH" - - gcc -print-multi-os-directory | grep . && LIB_DIR=$(gcc -print-multi-os-directory | sed 's/\.\.\///g') || LIB_DIR="lib" - - gcc -print-multiarch | grep . && LIB_SUBDIR=$(echo $(gcc -print-multiarch)'/') - - export PKG_CONFIG_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" - - export LD_LIBRARY_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" - - export XDG_DATA_DIRS="${GIMP_PREFIX}/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" - - export GI_TYPELIB_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}girepository-1.0${GI_TYPELIB_PATH:+:$GI_TYPELIB_PATH}" + # Universal variables + - !reference [.default, before_script] + - mkdir -p _ccache/ script: - - mkdir -p "$APT_CACHE" - - apt-get install -y --no-install-recommends -o dir::cache::archives="$APT_CACHE" - clang - mkdir _babl/_build${ARTIFACTS_SUFFIX} && cd _babl/_build${ARTIFACTS_SUFFIX} - meson setup .. -Dprefix="${GIMP_PREFIX}" - - ninja && ninja install + - ninja + - ninja install + - ccache --show-stats - mkdir ../../_gegl/_build${ARTIFACTS_SUFFIX} && cd ../../_gegl/_build${ARTIFACTS_SUFFIX} - meson setup .. -Dprefix="${GIMP_PREFIX}" - - ninja && ninja install - needs: ["image-debian-x64"] - -.gimp-debian-base: - stage: gimp - image: $CI_REGISTRY_IMAGE:build-debian-latest - dependencies: - - deps-debian-x64 - cache: - paths: - - apt-cache + - ninja + - ninja install + - ccache --show-stats artifacts: - expire_in: 1 days - when: always - name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}" + expire_in: 2 hours paths: - - "_build${ARTIFACTS_SUFFIX}" - - "_install${ARTIFACTS_SUFFIX}" - before_script: - - export PATH="$GIMP_PREFIX/bin:$PATH" - - gcc -print-multi-os-directory | grep . && LIB_DIR=$(gcc -print-multi-os-directory | sed 's/\.\.\///g') || LIB_DIR="lib" - - gcc -print-multiarch | grep . && LIB_SUBDIR=$(echo $(gcc -print-multiarch)'/') - - export PKG_CONFIG_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" - - export LD_LIBRARY_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" - - export XDG_DATA_DIRS="${GIMP_PREFIX}/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}" - - export GI_TYPELIB_PATH="${GIMP_PREFIX}/${LIB_DIR}/${LIB_SUBDIR}girepository-1.0${GI_TYPELIB_PATH:+:$GI_TYPELIB_PATH}" - - git submodule update --init - needs: ["deps-debian-x64"] + - _install${ARTIFACTS_SUFFIX} + - _babl/_build${ARTIFACTS_SUFFIX} + - _gegl/_build${ARTIFACTS_SUFFIX} -gimp-debian-x64: +deps-debian-x64: + extends: .deps-debian-base rules: - # On commits and merge requests. - - if: '$CI_PIPELINE_SOURCE == "push"' - - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # Custom builds though web GUI, API or schedules. + - if: '$GIMP_CI_MESON_CLANG != null' + - if: '$GIMP_CI_RASTER_ICONS != null' + - if: '$GIMP_CI_CROSSROAD_WIN64 != null' + - if: '$GIMP_CI_CROSSROAD_WIN32 != null' + - if: '$GIMP_CI_SOURCES != null' - if: '$GIMP_CI_FLATPAK != null' + # On merge requests and commits. + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + - if: '$CI_PIPELINE_SOURCE == "push"' # On releases. - if: '$CI_COMMIT_TAG != null' + +# GitLab "rules:variables:" is buggy so let's use jobs +deps-debian-gcc: + extends: .deps-debian-base + rules: + # Custom builds though web GUI, API or schedules. + - if: '$GIMP_CI_MESON_GCC != null' + variables: + CC: "ccache gcc" + CXX: "ccache gcc" + +.gimp-debian-base: + extends: .default + needs: ["deps-debian-x64"] + stage: gimp + image: $CI_REGISTRY_IMAGE:build-debian-latest + before_script: + # Universal variables + - !reference [.default, before_script] + - mkdir -p _ccache/ + - git submodule update --init + - mkdir -p _build${ARTIFACTS_SUFFIX} && cd _build${ARTIFACTS_SUFFIX} + after_script: + - ccache --show-stats + artifacts: + expire_in: 1 days + paths: + - "_install${ARTIFACTS_SUFFIX}" + - "_build${ARTIFACTS_SUFFIX}" + +gimp-debian-x64: + extends: .gimp-debian-base + rules: # Custom builds though web GUI, API or schedules. - if: '$GIMP_CI_MESON_CLANG != null' - if: '$GIMP_CI_CROSSROAD_WIN64 != null' - if: '$GIMP_CI_CROSSROAD_WIN32 != null' - if: '$GIMP_CI_SOURCES != null' - extends: .gimp-debian-base - variables: - CC: "clang" - CXX: "clang++" + - if: '$GIMP_CI_FLATPAK != null' + # On merge requests and commits. + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + - if: '$CI_PIPELINE_SOURCE == "push"' + # On releases. + - if: '$CI_COMMIT_TAG != null' script: - - mkdir -p "$APT_CACHE" - - apt-get install -y --no-install-recommends -o dir::cache::archives="$APT_CACHE" - clang - - mkdir -p "_build${ARTIFACTS_SUFFIX}" && cd "_build${ARTIFACTS_SUFFIX}" - meson setup .. -Dprefix="${GIMP_PREFIX}" -Dgi-docgen=enabled -Dg-ir-doc=true - - ninja && ninja test + - ninja + - ninja test # The src should not be changed by the build. If it is, something is # wrong. Let's print out the diff for debugging in such case, and # exit to fail the CI. @@ -280,40 +296,43 @@ gimp-debian-x64: git diff; exit 1; fi - - ninja dist && ninja install + - ninja dist + - ninja install artifacts: - name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}" - when: always + paths: + - _install${ARTIFACTS_SUFFIX}/ + - _build${ARTIFACTS_SUFFIX}/config.h + - _build${ARTIFACTS_SUFFIX}/meson-dist/ + - _build${ARTIFACTS_SUFFIX}/devel-docs/ + - _build${ARTIFACTS_SUFFIX}/build/flatpak/ + - _build${ARTIFACTS_SUFFIX}/meson-logs/ reports: junit: "_build${ARTIFACTS_SUFFIX}/meson-logs/testlog.junit.xml" - paths: - - "_build${ARTIFACTS_SUFFIX}/config.h" - - "_build${ARTIFACTS_SUFFIX}/meson-logs" - - "_build${ARTIFACTS_SUFFIX}/meson-dist" - - "_build${ARTIFACTS_SUFFIX}/devel-docs" - - "_build${ARTIFACTS_SUFFIX}/build/flatpak/" - - "_install${ARTIFACTS_SUFFIX}" gimp-debian-gcc: + extends: .gimp-debian-base rules: # Custom builds only (web GUI, API or schedules). - if: '$GIMP_CI_MESON_GCC != null' - extends: .gimp-debian-base + needs: ["deps-debian-gcc"] + variables: + CC: "ccache gcc" + CXX: "ccache gcc" script: - - mkdir -p _build${ARTIFACTS_SUFFIX} && cd _build${ARTIFACTS_SUFFIX} - meson setup .. -Dprefix="${GIMP_PREFIX}" - - ninja && ninja test + - ninja + - ninja test gimp-debian-raster-icons: + extends: .gimp-debian-base rules: # Custom builds only (web GUI, API or schedules). - if: '$GIMP_CI_RASTER_ICONS != null' - extends: .gimp-debian-base script: - - mkdir -p _build${ARTIFACTS_SUFFIX} && cd _build${ARTIFACTS_SUFFIX} - meson setup .. -Dprefix="${GIMP_PREFIX}" -Dvector-icons=false - - ninja && ninja test + - ninja + - ninja test packaging-flatpak-x64: # See: https://gitlab.gnome.org/GNOME/Initiatives/-/wikis/DevOps-with-Flatpak @@ -639,6 +658,7 @@ packaging-win-x86-nightly: ## WINDOWS Aarch64 CI (native MSYS2) ## .win: + extends: .default rules: # On releases. - if: '$CI_COMMIT_TAG != null' @@ -649,17 +669,8 @@ packaging-win-x86-nightly: variables: BUILD_TYPE: "CI_NATIVE" CHERE_INVOKING: "yes" - CCACHE_BASEDIR: "$CI_PROJECT_DIR" - CCACHE_DIR: "$CI_PROJECT_DIR/_ccache" - cache: - key: $CI_JOB_NAME - paths: - - _ccache/ before_script: - New-Item -Path .\_ccache -ItemType Directory -Force - artifacts: - name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}" - when: always .win-a64: extends: .win @@ -809,6 +820,8 @@ packaging-win-x64: - win32-ps variables: MSYSTEM: "MINGW32" + CC: "ccache cc" + CXX: "ccache c++" deps-win-x86: extends: .win-x86 @@ -923,8 +936,6 @@ dist-installer-weekly: - packaging-win-x64 - packaging-win-x86 artifacts: - name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}" - when: always expire_in: 1 week expose_as: 'Windows exe' paths: