Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  .gitlab-ci.yml  Sprache: unbekannt

 
Spracherkennung für: .yml vermutete Sprache: Apollo {Apollo[48] Postscript[48] Python[48]} [Methode: maximale Elemente, drei Dimensionen]

spec:
  inputs:
    distribution_pipeline:
      description: 'Pipelines that creates installable GIMP'
      options:
        - GIMP_CI_APPIMAGE #trigger the appimage making (base & fast).
        - GIMP_CI_FLATPAK #trigger the flatpak build and publishing (base but slow)
        - GIMP_CI_SNAP #trigger the snap build (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)
        - GIMP_CI_MACOS #trigger arm64 native macOS build then create a .dmg installer (base but slow)
        - none
      default: 'none'
    test_pipeline:
      description: 'Pipelines used only for testing'
      options:
        - GIMP_CI_MESON_CLANG #trigger the Debian Clang build (rare usefulness)
        - GIMP_CI_MESON_MSVC #trigger the Windows Clang-CL/MSVC build (rare usefulness)
        - GIMP_CI_MESON_APPLECLANG #trigger the Apple Clang build with Homebrew packages (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 build
## - Building quality tests (static code analysis)
## - 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 build
## - Building quality tests (static code analysis)
## - Execution tests (dynamic code analysis)
## - Source tarball
## - Developer documentation
.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
## - Developer documentation
## - Linux .appimage
## - Inno Windows installer
## - MS Store .msixupload
.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:
      - 'scheduler_failure'
  needs: []
  # Default Docker image (keep variables: DEB_VERSION: consistent with devel-docs/os-support.txt)
  image: $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER}
  variables:
    DEB_VERSION: "bookworm"
    UMFPACK: libumfpack5
    RUNNER: "x86_64_v3"
    # Common cloning procedure
    GIT_DEPTH: "1"
    GIT_SUBMODULE_STRATEGY: none
    # Enable colorful output when supported (e.g. ninja, cppcheck)
    CLICOLOR_FORCE: "1"
    # Disable timestamps on CI logs
    FF_TIMESTAMPS: false
  # Common artifacts behavior
  artifacts:
    name: "${CI_JOB_NAME_SLUG}${VARIANT}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
    when: always


stages:
  - dependencies
  - build
  - analysis
  - distribution


## Common GNU/Linux 64-bit CI (Debian) ##
.debian-nonreloc:
  extends: .default
  rules:
    - <<: *CI_MERGE
    - <<: *CI_COMMIT
      variables: {}
    - if: '$GIMP_CI_MESON_CLANG != null || "$[[ inputs.test_pipeline ]]" =~ /.*GIMP_CI_MESON_CLANG.*/'
      variables:
        CC: clang
        CXX: clang++
        CC_LD: lld
        CXX_LD: lld
        TOOLCHAIN: "clang lld"
        WARN_AS_ERROR_ON_CI: '-Dwerror=true'
        VARIANT: -clang
    - if: '$GIMP_CI_RASTER_ICONS != null || "$[[ inputs.test_pipeline ]]" =~ /.*GIMP_CI_RASTER_ICONS.*/'
      variables:
        MESON_OPTIONS: "-Dvector-icons=false"
        VARIANT: "-raster"
    - <<: *CI_RELEASE
  before_script:
    - export GIMP_PREFIX="${CI_PROJECT_DIR}/_install-${RUNNER}"
  timeout: 30m

.debian_environ: &ENVIRON
# See: https://testing.developer.gimp.org/core/setup/build/#preparing-for-building
- printf "\e[0Ksection_start:`date +%s`:environ[collapsed=true]\r\e[0KPreparing build environment\n"
- gcc -print-multi-os-directory 2>/dev/null | grep -q ./ && export LIB_DIR=$(gcc -print-multi-os-directory | sed 's/\.\.\///g') || export LIB_DIR="lib"
- gcc -print-multiarch 2>/dev/null | grep -q . && export LIB_SUBDIR=$(echo $(gcc -print-multiarch)'/') || export LIB_SUBDIR=
## 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}"
- printf "\e[0Ksection_end:`date +%s`:environ\r\e[0K\n"

deps-debian-nonreloc:
  extends: .debian-nonreloc
  stage: dependencies
  image: quay.io/containers/aio:latest
  variables:
    GIT_STRATEGY: none
  script:
    - export BUILDAH_FORMAT=docker
    - export BUILDAH_ISOLATION=chroot
    - export STORAGE_DRIVER=vfs
    - echo "$CI_REGISTRY_PASSWORD" | buildah login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY
    # Install deps
    - echo "FROM debian:${DEB_VERSION}" > Dockerfile
    - echo "WORKDIR $CI_PROJECT_DIR" >> Dockerfile
    ## 'ca-certificates' is NOT a gimp dep, it is installed only to our Docker image work
    - echo "RUN apt-get update -qq && apt-get install -qq -y --no-install-recommends ca-certificates \\" >> Dockerfile
    ## Build-time only dependencies
    - echo "${TOOLCHAIN:-build-essential}
            appstream
            bison
            desktop-file-utils
            flex
            gi-docgen
            git
            gobject-introspection
            libgtk-3-bin
            meson
            valac
            xsltproc \\" >> Dockerfile
    ## Runtime dependencies
    - echo "at-spi2-core
            ffmpeg
            gettext
            gjs
            glib-networking
            graphviz
            graphviz-dev
            gvfs
            iso-codes
            libaa1-dev
            libappstream-dev
            libarchive-dev
            libasound2-dev
            libbz2-dev
            libcfitsio-dev
            libgexiv2-dev
            libgirepository1.0-dev
            libgs10
            libgs-dev
            libgtk-3-dev
            libgudev-1.0-dev
            libheif-dev
            $LIBHEIF_PLUGINS
            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
            librsvg2-dev
            libsuitesparse-dev
            libtiff-dev
            $UMFPACK
            libunwind-dev
            libwebp-dev
            libwmf-dev
            libxmu-dev
            libxpm-dev
            locales
            mypaint-brushes
            poppler-data
            python3
            python3-gi
            python3-gi-cairo" >> Dockerfile
    - echo "RUN echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen && locale-gen" >> Dockerfile
    # Prepare environ
    - echo "FROM $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER}" > Dockerfile2;
    - echo "RUN printf \"\e[0Ksection_start:\`date +%s\`:environ[collapsed=true]\r\e[0KPreparing build environment\n\"" >> Dockerfile2;
    - echo "ENV PKG_CONFIG_PATH=\"${GIMP_PREFIX}/lib/$([ "$(uname -m)" = 'aarch64' ] && echo "aarch64-linux-gnu/" || echo "x86_64-linux-gnu/")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;
    - if [ "$VARIANT" = "-clang" ]; then
        echo "ENV CC=\"$CC\"" >> Dockerfile2;
        echo "ENV CXX=\"$CXX\"" >> Dockerfile2;
        echo "ENV CC_LD=\"$CC_LD\"" >> Dockerfile2;
        echo "ENV CXX_LD=\"$CXX_LD\"" >> Dockerfile2;
      fi
    - echo "ENV CLICOLOR_FORCE=\"1\"" >> Dockerfile2;
    - echo "RUN printf \"\e[0Ksection_end:\`date +%s\`:environ\r\e[0K\n\"" >> Dockerfile2;
    # Build some dependencies
    ## Build babl
    - echo "RUN printf \"\e[0Ksection_start:\`date +%s\`:babl_build[collapsed=true]\r\e[0KBuilding babl\n\"" >> 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" babl >> Dockerfile2;
    - echo "RUN meson setup babl/_build-${RUNNER} babl -Dprefix=\"${GIMP_PREFIX}\" $RELOCATABLE_OPTION $PKGCONF_RELOCATABLE_OPTION $WARN_AS_ERROR_ON_CI" >> Dockerfile2;
    - echo "RUN ninja -C babl/_build-${RUNNER}" >> Dockerfile2;
    - echo "RUN ninja -C babl/_build-${RUNNER} install" >> Dockerfile2;
    - echo "RUN printf \"\e[0Ksection_end:\`date +%s\`:babl_build\r\e[0K\n\"" >> Dockerfile2;
    ## Build GEGL
    - echo "RUN printf \"\e[0Ksection_start:\`date +%s\`:gegl_build[collapsed=true]\r\e[0KBuilding gegl\n\"" >> 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" gegl >> Dockerfile2;
    - echo "RUN meson setup gegl/_build-${RUNNER} gegl -Dprefix=\"${GIMP_PREFIX}\" $RELOCATABLE_OPTION $PKGCONF_RELOCATABLE_OPTION $WARN_AS_ERROR_ON_CI" >> Dockerfile2;
    - echo "RUN ninja -C gegl/_build-${RUNNER}" >> Dockerfile2;
    - echo "RUN ninja -C gegl/_build-${RUNNER} install" >> Dockerfile2;
    - echo "RUN printf \"\e[0Ksection_end:\`date +%s\`:gegl_build\r\e[0K\n\"" >> Dockerfile2;
    #FIXME: '2>&1 | grep -v STEP' since buildah is too verbose. See: https://github.com/containers/buildah/issues/6362
    - printf "\e[0Ksection_start:`date +%s`:deps_install[collapsed=true]\r\e[0KInstalling dependencies provided by Debian $DEB_VERSION\n"
    - buildah build --log-level error --volume $CI_PROJECT_DIR:$CI_PROJECT_DIR:Z --file $CI_PROJECT_DIR/Dockerfile --tag $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER} --layers --cache-from $CI_REGISTRY_IMAGE/cache --cache-to $CI_REGISTRY_IMAGE/cache --cache-ttl=120h --iidfile new_image_id.txt 2>&1 | grep -v STEP
    - if [ "$(skopeo inspect --config "docker://$CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER}" 2>/dev/null | sed -n '/"diff_ids"/,/\]/p' | grep -o 'sha256:[a-f0-9]*' | tr '\n' ',' || echo "none")" != "$(buildah inspect --format '{{if .OCIv1.RootFS}}{{range .OCIv1.RootFS.DiffIDs}}{{.}},{{end}}{{else}}{{range .Docker.RootFS.DiffIDs}}{{.}},{{end}}{{end}}' "$(cat new_image_id.txt)")" ]; then buildah push --log-level error --compression-format zstd --compression-level 3 --force-compression $CI_REGISTRY_IMAGE:build-debian-${DEB_VERSION}-${RUNNER} 2>&1 | grep -v STEP; fi
    - printf "\e[0Ksection_end:`date +%s`:deps_install\r\e[0K\n"
    - buildah build --log-level error --volume $CI_PROJECT_DIR:$CI_PROJECT_DIR:Z --file $CI_PROJECT_DIR/Dockerfile2 --no-cache 2>&1 | grep -v STEP
  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-nonreloc:
  extends: .debian-nonreloc
  needs: ["deps-debian-nonreloc"]
  stage: build
  variables:
    GIT_SUBMODULE_STRATEGY: recursive
  script:
    - *ENVIRON
    # Check building
    - printf "\e[0Ksection_start:`date +%s`:gimp_build[collapsed=true]\r\e[0KBuilding GIMP\n"
    - meson setup _build-${RUNNER} -Dprefix="${GIMP_PREFIX}"
                                   -Dfile-plug-ins-test=true
                                   $MESON_OPTIONS
    - cd _build-${RUNNER}
    - ninja
    - printf "\e[0Ksection_end:`date +%s`:gimp_build\r\e[0K\n"
    # Check execution
    - printf "\e[0Ksection_start:`date +%s`:gimp_test[collapsed=true]\r\e[0KTesting GIMP execution\n"
    - ninja test
    - printf "\e[0Ksection_end:`date +%s`:gimp_test\r\e[0K\n"
    # Check source
    - printf "\e[0Ksection_start:`date +%s`:gimp_tar[collapsed=true]\r\e[0KChecking GIMP source\n"
    - if [ $(git diff |wc -l) -ne 0 ]; then
        printf "ERROR. A generated file was updated without the source:\n";
        git diff;
        exit 1;
      fi
    - if [ "$VARIANT" != "-clang" ] && [ "$VARIANT" != "-raster" ] && [ "$CI_PIPELINE_SOURCE" != "merge_request_event" ]; then
        ninja dist > ninja_dist.log 2>&1 || { cat ninja_dist.log; exit 1; };
      fi
    - printf "\e[0Ksection_end:`date +%s`:gimp_tar\r\e[0K\n"
    # Check install
    - printf "\e[0Ksection_start:`date +%s`:gimp_install[collapsed=true]\r\e[0KChecking non-relocatable GIMP installation\n"
    - ninja install > ninja_install.log 2>&1 || { cat ninja_install.log; exit 1; };
    - printf "\e[0Ksection_end:`date +%s`:gimp_install\r\e[0K\n"
  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


## AppImage CI (Debian) ##
.debian:
  extends: .debian-nonreloc
  rules:
    - if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:AppImage.*/ || $CI_MERGE_REQUEST_DESCRIPTION =~ /.*Package:AppImage.*/'
      interruptible: true
    - if: '$GIMP_CI_APPIMAGE != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_APPIMAGE.*/'
    - <<: *CI_RELEASE
  parallel:
    matrix:
      - RUNNER: [aarch64, x86_64_v3]
  tags:
    - $RUNNER
  variables:
    #FIXME: remove this variables: key and go back to relying on .default DEB_VERSION on GIMP 3.3/3.4
    DEB_VERSION: "trixie"
    UMFPACK: libumfpack6
    LIBHEIF_PLUGINS: "libheif-plugin-dav1d libheif-plugin-aomenc libheif-plugin-libde265 libheif-plugin-x265 libheif-plugin-j2kdec libheif-plugin-j2kenc"

deps-debian:
  extends: .debian
  stage: !reference [deps-debian-nonreloc, stage]
  image: !reference [deps-debian-nonreloc, image]
  variables:
    GIT_STRATEGY: none
    RELOCATABLE_OPTION: '-Drelocatable=enabled'
    PKGCONF_RELOCATABLE_OPTION: '-Dpkgconfig.relocatable=true'
  script:
    - !reference [deps-debian-nonreloc, script]
  artifacts: !reference [deps-debian-nonreloc, artifacts]

gimp-debian:
  extends: .debian
  needs: ["deps-debian"]
  stage: !reference [gimp-debian-nonreloc, stage]
  variables:
    #FIXME: remove this variables: key and go back to relying on gimp-debian-nonreloc variables: on GIMP 3.3/3.4
    GIT_SUBMODULE_STRATEGY: recursive
  script:
    - *ENVIRON
    # Build GIMP
    - printf "\e[0Ksection_start:`date +%s`:gimp_build[collapsed=true]\r\e[0KBuilding GIMP\n"
    - meson setup _build-${RUNNER} -Dprefix="${GIMP_PREFIX}"
                                   -Drelocatable-bundle=yes
                                   -Dpkgconfig.relocatable=true
                                   -Dgi-docgen=disabled
                                   -Dcheck-update=yes
                                   -Dbuild-id=org.gimp.GIMP_official.AppImage.$(uname -m)
    - cd _build-${RUNNER}
    - ninja
    - printf "\e[0Ksection_end:`date +%s`:gimp_build\r\e[0K\n"
    # Create bundle
    - printf "\e[0Ksection_start:`date +%s`:gimp_bundle[collapsed=true]\r\e[0KCreating AppDir bundle\n"
    - ninja install > ninja_install.log 2>&1 || { cat ninja_install.log; exit 1; }
    - cd ..
    - sh build/linux/appimage/3_dist-gimp-goappimage.sh --bundle-only > goappimage.log 2>&n style='color: green'>1 || { cat goappimage.log; exit 1; }
    - printf "\e[0Ksection_end:`date +%s`:gimp_bundle\r\e[0K\n"
  artifacts:
    paths:
      - AppDir*/
      - appimageignore*
      - _build-${RUNNER}/meson-logs/meson-log.txt
      - _build-${RUNNER}/config.h
    expire_in: 2 days


## Flatpak CI (Fedora) ##
.flatpak:
  extends: .default
  #We need to specify this since .flatpak from flatpak_ci_initiative.yml sets to true
  interruptible: false
  rules:
    - if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Flatpak.*/ || $CI_MERGE_REQUEST_DESCRIPTION =~ /.*Package:Flatpak.*/'
      interruptible: true
    - if: '$GIMP_CI_FLATPAK != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_FLATPAK.*/'
  parallel:
    matrix:
      - RUNNER: [flatpak-aarch64, flatpak-x86_64]
  tags:
    - $RUNNER
  image: quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master
  variables:
    RUN_TESTS: 0
    MESON_DIST: 0
  before_script:
    - export GIMP_PREFIX="${CI_PROJECT_DIR}/_install"
  #30min is enough only if no module was updated/rebuilt, we need more time in case of module bumps
  timeout: 90m

deps-flatpak:
  extends: .flatpak
  stage: dependencies
  script:
    - sh build/linux/flatpak/1_build-deps-flatpakbuilder.sh
  artifacts:
    paths:
      - _build-$RUNNER
      - flatpak-builder.log
      - babl-meson-log.txt
      - gegl-meson-log.txt
    expire_in: 2 hours

gimp-flatpak:
  extends: .flatpak
  needs: ["deps-flatpak"]
  stage: build
  variables:
    GIT_SUBMODULE_STRATEGY: recursive
  script:
    - sh build/linux/flatpak/2_build-gimp-flatpakbuilder.sh
  artifacts:
    paths:
      - temp*.flatpak
      - repo*.tar
      - gimp-flatpak-builder.log
      - gimp-meson-log.txt
    expire_in: 2 days


## Snap CI (Ubuntu) ##
.snap:
  extends: .default
  rules:
    - if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Snap.*/ || $CI_MERGE_REQUEST_DESCRIPTION =~ /.*Package:Snap.*/'
      interruptible: true
    - if: '$GIMP_CI_SNAP != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_SNAP.*/'
    - <<: *CI_RELEASE
  parallel:
    matrix:
      - RUNNER: [aarch64, x86_64_v3]
  tags:
    - $RUNNER
  image: $CI_REGISTRY_IMAGE:build-snap-${SNAPCRAFT_BASE_VERSION}-${RUNNER}
  variables:
    SNAPCRAFT_BASE_VERSION: "8_core24"
    RUNNER: x86_64_v3
  timeout: 30m

deps-snap:
  extends: .snap
  stage: dependencies
  image: quay.io/containers/aio:latest
  script:
    - export BUILDAH_FORMAT=docker
    - export BUILDAH_ISOLATION=chroot
    - export STORAGE_DRIVER=vfs
    - echo "$CI_REGISTRY_PASSWORD" | buildah login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY
    # Install deps
    - echo "FROM ghcr.io/canonical/snapcraft:${SNAPCRAFT_BASE_VERSION}" > Dockerfile
    - echo "ENTRYPOINT [\"\"]" >> Dockerfile
    - echo "WORKDIR $CI_PROJECT_DIR" >> Dockerfile
    - echo "ENV GITLAB_CI=1" >> Dockerfile
    - echo "ENV RUNNER=$RUNNER" >> Dockerfile
    - echo "RUN apt-get update -y && apt-get install -y curl jq squashfs-tools sudo git locales" >> Dockerfile
    - echo "RUN echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen && locale-gen" >> Dockerfile
    #FIXME: https://github.com/canonical/snapcraft-rocks/issues/37 and https://github.com/canonical/snapcraft-rocks/issues/33
    - echo "RUN cp -r /usr/lib/python3.*/site-packages/extensions/* /usr/share/snapcraft/extensions/ && ln -s /usr/libexec/snapcraft/craftctl /usr/bin/craftctl" >> Dockerfile
    - echo "RUN sh build/linux/snap/1_build-deps-snapcraft.sh --install-snaps" >> Dockerfile;
    # Build babl and GEGL
    - echo "FROM $CI_REGISTRY_IMAGE:build-snap-${SNAPCRAFT_BASE_VERSION}-${RUNNER}" > Dockerfile2;
    - if [ "$CI_COMMIT_TAG" ]; then
        echo "ENV CI_COMMIT_TAG=\"$CI_COMMIT_TAG\"" >> Dockerfile2;
      fi
    - echo "RUN sh build/linux/snap/1_build-deps-snapcraft.sh" >> Dockerfile2;
    #FIXME: '2>&1 | grep -v STEP' since buildah is too verbose. See: https://github.com/containers/buildah/issues/6362
    - buildah build --log-level error --volume $CI_PROJECT_DIR:$CI_PROJECT_DIR:Z --file $CI_PROJECT_DIR/Dockerfile --tag $CI_REGISTRY_IMAGE:build-snap-${SNAPCRAFT_BASE_VERSION}-${RUNNER} --layers --cache-from $CI_REGISTRY_IMAGE/cache --cache-to $CI_REGISTRY_IMAGE/cache --cache-ttl=120h --iidfile new_image_id.txt 2>&1 | grep -v STEP
    - if [ "$(skopeo inspect --config "docker://$CI_REGISTRY_IMAGE:build-snap-${SNAPCRAFT_BASE_VERSION}-${RUNNER}" 2>/dev/null | sed -n '/"diff_ids"/,/\]/p' | grep -o 'sha256:[a-f0-9]*' | tr '\n' ',' || echo "none")" != "$(buildah inspect --format '{{if .OCIv1.RootFS}}{{range .OCIv1.RootFS.DiffIDs}}{{.}},{{end}}{{else}}{{range .Docker.RootFS.DiffIDs}}{{.}},{{end}}{{end}}' "$(cat new_image_id.txt)")" ]; then buildah push --log-level error --compression-format zstd --compression-level 3 --force-compression $CI_REGISTRY_IMAGE:build-snap-${SNAPCRAFT_BASE_VERSION}-${RUNNER} 2>&1 | grep -v STEP; fi
    - buildah build --log-level error --volume $CI_PROJECT_DIR:$CI_PROJECT_DIR:Z --file $CI_PROJECT_DIR/Dockerfile2 --no-cache 2>&1 | grep -v STEP
  artifacts:
    paths:
      - _install-$RUNNER.tar
      - _build-$RUNNER.tar
      - babl-meson-log.tar
      - gegl-meson-log.tar
    expire_in: 2 hours

gimp-snap:
  extends: .snap
  needs: ["deps-snap"]
  stage: build
  variables:
    GIT_SUBMODULE_STRATEGY: recursive
  script:
    - sh build/linux/snap/2_build-gimp-snapcraft.sh
  artifacts:
    paths:
      - temp*.snap
      - gimp-snapcraft.log
      - gimp-meson-log.tar
    expire_in: 2 days


## WINDOWS pipelines (native MSYS2) ##
.win:
  extends: .default
  rules:
    #Developers (on GNOME/gimp namespace) can create multi-arch installers (.exe or .msixbundle)
    #Non developers (e.g. on MRs), however, can create x64-only installers (.exe or .msix)
    - if: '$RUNNER == "windows-aarch64" && $CI_PROJECT_NAMESPACE != "GNOME"'
      when: never
    - if: '($CI_MERGE_REQUEST_LABELS =~ /.*Package:Windows Installer.*/ && $CI_MERGE_REQUEST_LABELS =~ /.*Package:Microsoft Store.*/) || ($CI_MERGE_REQUEST_DESCRIPTION =~ /.*Package:Windows Installer.*/ && $CI_MERGE_REQUEST_DESCRIPTION =~ /.*Package:Microsoft Store.*/)'
      interruptible: true
      variables:
        INSTALLER_OPTION: '-Dwindows-installer=true'
        STORE_OPTION: '-Dms-store=true'
    - if: '($CI_MERGE_REQUEST_LABELS =~ /.*Package:Windows Installer.*/ || $CI_MERGE_REQUEST_DESCRIPTION =~ /.*Package:Windows Installer.*/) && $CI_JOB_NAME !~ /.*store.*/'
      interruptible: true
      variables:
        INSTALLER_OPTION: '-Dwindows-installer=true'
    - if: '($CI_MERGE_REQUEST_LABELS =~ /.*Package:Microsoft Store.*/ || $CI_MERGE_REQUEST_DESCRIPTION =~ /.*Package:Microsoft Store.*/) && $CI_JOB_NAME !~ /.*eol.*/ && $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.*/) && $CI_JOB_NAME !~ /.*store.*/'
      variables:
        INSTALLER_OPTION: '-Dwindows-installer=true'
    - if: '($GIMP_CI_MS_STORE != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_MS_STORE.*/) && $CI_JOB_NAME !~ /.*eol.*/ && $CI_JOB_NAME !~ /.*installer.*/'
      variables:
        STORE_OPTION: '-Dms-store=true'
    - if: '($GIMP_CI_MESON_MSVC != null || "$[[ inputs.test_pipeline ]]" =~ /.*GIMP_CI_MESON_MSVC.*/) && $CI_JOB_NAME !~ /.*installer.*/ && $CI_JOB_NAME !~ /.*store.*/ && $CI_JOB_NAME !~ /.*eol.*/ && $CI_JOB_NAME !~ /.*aarch64.*/'
      variables:
        VCPKG_ROOT: "$CI_PROJECT_DIR/vcpkg"
        WARN_AS_ERROR_ON_CI: '-Dwerror=true'
        VARIANT: "-msvc"
    - <<: *CI_RELEASE
      variables:
        INSTALLER_OPTION: '-Dwindows-installer=true'
        STORE_OPTION: '-Dms-store=true'
  parallel:
    matrix:
      - RUNNER: [windows-aarch64, win32-ps]
  tags:
    - $RUNNER
  variables:
    MSYS_ROOT: 'C:/msys64'
    #See: https://gitlab.gnome.org/creiter/gitlab-ci-win32-runner-v2/-/commit/5bb796c37b212b592f0c7432de44ca0ad0c41707
    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:
    - $GIMP_PREFIX = "$PWD\_install-$(if (-not $env:MSYSTEM_PREFIX) { $(((Get-WmiObject Win32_ComputerSystem).SystemType).Split('-')[0].Trim().ToLower()) } else { $env:MSYSTEM_PREFIX })"
    - if ("$VARIANT" -eq '-msvc') { if (-not (Test-Path $env:VCPKG_ROOT)) { git clone --depth 1 https://github.com/microsoft/vcpkg; .\vcpkg\bootstrap-vcpkg.bat }; pip install meson }
    - if ("$VARIANT" -eq '-msvc') { $VSINSTALLDIR = $(vswhere -products * -latest -property installationPath); Import-Module "$VSINSTALLDIR\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"; Enter-VsDevShell -VsInstallPath "$VSINSTALLDIR" -SkipAutomaticLocation -DevCmdArguments "-arch=$(((Get-WmiObject Win32_ComputerSystem).SystemType).Split('-')[0].Trim().ToLower())" }
  #30min is enough only on msys2 or if no vcpkg port was updated/rebuilt, we need more time in case of port bumps
  timeout: 150m

.win_environ: &WIN_ENVIRON
# See: https://testing.developer.gimp.org/core/setup/build/windows/#prepare-for-building
- 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;$env:VCPKG_ROOT/installed/$env:VCPKG_DEFAULT_TRIPLET/lib/pkgconfig;$env:VCPKG_ROOT/installed/$env:VCPKG_DEFAULT_TRIPLET/share/pkgconfig;$env:MSYS_ROOT/$env:MSYSTEM_PREFIX/lib/pkgconfig;$env:MSYS_ROOT/$env:MSYSTEM_PREFIX/share/pkgconfig"
- $env:XDG_DATA_DIRS = "$GIMP_PREFIX/share;$env:VCPKG_ROOT/installed/$env:VCPKG_DEFAULT_TRIPLET/share;$env:MSYS_ROOT/$env:MSYSTEM_PREFIX/share"
## Runtime vars
- $env:PATH = "$GIMP_PREFIX/bin;$env:VCPKG_ROOT/installed/$env:VCPKG_DEFAULT_TRIPLET/bin;$env:MSYS_ROOT/$env:MSYSTEM_PREFIX/bin;$env:PATH"
- $env:GI_TYPELIB_PATH = "$GIMP_PREFIX/lib/girepository-1.0;$env:VCPKG_ROOT/installed/$env:VCPKG_DEFAULT_TRIPLET/lib/girepository-1.0;$env:MSYS_ROOT/$env:MSYSTEM_PREFIX/lib/girepository-1.0"
## MSVC-specific vars
- if ($env:VCPKG_ROOT) { $env:CC='clang-cl'; $env:CXX='clang-cl'; $env:PKG_CONFIG="$env:VCPKG_ROOT\installed\$env:VCPKG_DEFAULT_TRIPLET\tools\pkgconf\pkgconf.exe"; $env:PATH="$env:VCPKG_ROOT\installed\$env:VCPKG_DEFAULT_TRIPLET\tools\glib;$env:VCPKG_ROOT\installed\$env:VCPKG_DEFAULT_TRIPLET\tools\gdk-pixbuf;$env:VCPKG_ROOT\installed\$env:VCPKG_DEFAULT_TRIPLET\tools\gettext\bin;$(Resolve-Path $env:VCPKG_ROOT\downloads\tools\perl\*.*\perl\bin -ErrorAction SilentlyContinue);$env:VCPKG_ROOT\installed\$env:VCPKG_DEFAULT_TRIPLET\tools\libxml2;$env:VCPKG_ROOT\installed\$env:VCPKG_DEFAULT_TRIPLET\tools\libxslt;$env:PATH"; $env:GIO_MODULE_DIR="$env:VCPKG_ROOT\installed\$env:VCPKG_DEFAULT_TRIPLET\plugins\glib-networking" }
- 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-*/
      - babl/_build-*/meson-logs/meson-log.txt
      - gegl/_build-*/meson-logs/meson-log.txt
    expire_in: 2 hours

gimp-win:
  extends: .win
  needs:
    - job: deps-win
      #to allow running outside 'GNOME/gimp' namespace (on MRs)
      optional: true
  stage: build
  variables:
    GIT_SUBMODULE_STRATEGY: recursive
  script:
    - build\windows\2_build-gimp-msys2.ps1
  artifacts:
    paths:
      - gimp-*n*/
      - _build-*/meson-logs/meson-log.txt
      - _build-*/done-dll.list
      # Needed by dist-installer-weekly and dist-store-weekly
      - _build-*/config.h
      - _build-*/plug-ins/file_associations.list
      - _build-*/build/windows/installer/
      - _build-*/build/windows/store/
    expire_in: 2 days


## WINDOWS x86 legacy CI (native MSYS2) ##
.win-eol:
  extends: .win
  parallel:
    matrix:
      - RUNNER: [win32-ps]
  variables:
    MSYSTEM_PREFIX: mingw32
    MINGW_PACKAGE_PREFIX: mingw-w64-i686

deps-win-eol:
  extends: .win-eol
  stage: !reference [deps-win, stage]
  script:
    - !reference [deps-win, script]
  artifacts: !reference [deps-win, artifacts]

gimp-win-eol:
  extends: .win-eol
  needs: ["deps-win-eol"]
  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]


## macOS pipelines (MacPorts) ##
.macos-inhouse:
  extends: .default
  rules:
    - if: '$CI_MERGE_REQUEST_LABELS =~ /.*Package:Macos Dmg.*/ || $CI_MERGE_REQUEST_DESCRIPTION =~ /.*Package:Macos Dmg.*/'
      interruptible: true
      variables:
        OPT_PREFIX: /opt/macports
        DMG_OPTION: '-Ddmg=true'
    - if: '$GIMP_CI_MACOS != null || "$[[ inputs.distribution_pipeline ]]" =~ /.*GIMP_CI_MACOS.*/'
      variables:
        OPT_PREFIX: /opt/macports
        DMG_OPTION: '-Ddmg=true'
    - if: '($GIMP_CI_MESON_APPLECLANG != null || "$[[ inputs.test_pipeline ]]" =~ /.*GIMP_CI_MESON_APPLECLANG.*/) && $CI_JOB_NAME !~ /.*-part.*/ && $CI_JOB_NAME !~ /.*dist-mac-.*/'
      variables:
        OPT_PREFIX: /opt/homebrew
        WARN_AS_ERROR_ON_CI: '-Dwerror=true'
        VARIANT: -homebrew
  tags:
    - macos
    - marathon
  variables:
    ARCH: arm64
    ORKA_RUNNER: tahoe-1
    PKGCONF_RELOCATABLE_OPTION: '-Dpkgconfig.relocatable=true'
  before_script:
    - export GIMP_PREFIX="$PWD/_install-$(uname -m)"
    - export PATH="$OPT_PREFIX/bin:$PATH"
  timeout: 4h

.macos_environ: &MAC_ENVIRON
- printf "\e[0Ksection_start:`date +%s`:macos_environ[collapsed=true]\r\e[0KPreparing build environment\n"
## Build-time vars
- export PKG_CONFIG_PATH="${GIMP_PREFIX}/lib/pkgconfig:${OPT_PREFIX}/lib/pkgconfig:${OPT_PREFIX}/opt/libarchive/lib/pkgconfig"
- export XDG_DATA_DIRS="${GIMP_PREFIX}/share:${OPT_PREFIX}/share"
## Runtime vars
- export PATH="${GIMP_PREFIX}/bin:${OPT_PREFIX}/bin:$PATH"
- export GI_TYPELIB_PATH="${GIMP_PREFIX}/lib/girepository-1.0:${OPT_PREFIX}/lib/girepository-1.0"
- printf "\e[0Ksection_end:`date +%s`:macos_environ\r\e[0K\n"

deps-macos-inhouse:
  extends: .macos-inhouse
  stage: dependencies
  cache:
    - key: $CI_PROJECT_NAMESPACE-$ARCH
      unprotect: true
      paths:
        - macports-cached-$ARCH
  script:
    # Do not call sh since it is old bash on macOS, not the default zsh
    - zsh build/macos/1_build-deps-macports.sh
  artifacts:
    paths:
      - _install-*
      # The full build dir is needed due to its .o for .dSYM creation on next job
      - babl/_build-*
      - gegl/_build-*
    expire_in: 2 hours

gimp-macos-inhouse:
  extends: .macos-inhouse
  needs: ["deps-macos-inhouse"]
  stage: build
  variables:
    GIT_SUBMODULE_STRATEGY: recursive
  cache:
    - key: $CI_PROJECT_NAMESPACE-$ARCH
      unprotect: true
      paths:
        - macports-cached-$ARCH
      policy: pull
  script:
    # Do not call sh since it is old bash on macOS, not the default zsh
    - zsh build/macos/2_build-gimp-macports.sh
  artifacts:
    paths:
      - gimp-*.app
      - _build*/meson-logs/meson-log.txt
      - _build*/done-dylib.list
      # Needed by dist-mac-weekly
      - _build-*/config.h
      - _build-*/plug-ins/file_associations_mac.list
      - _build-*/gimp-data/images/logo/gimp-dmg.png
      - _build-*/build/macos/.VolumeIcon.icns
    expire_in: 2 days


## 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-nonreloc
  rules:
    # Don't run on release since the plug-in doesn't get installed in releases
    - <<: *CI_MERGE
    - <<: *CI_COMMIT
  needs: ["gimp-debian-nonreloc"]
  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"
  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
        printf "There are file import regressions. Check the log at ${GIMP_TESTS_LOG_FILE}!\n";
        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
  timeout: 30m

meson-health:
  extends: .default
  rules:
    - <<: *CI_MERGE
    - <<: *CI_COMMIT
  stage: analysis
  variables:
    GIT_SUBMODULE_STRATEGY: recursive
  script:
    - apt-get update -qq
    - apt-get install -qq -y --no-install-recommends git shellcheck devscripts
    - sh .gitlab/run_meson_health_diff.sh
  allow_failure: true

clang-format:
  extends: .default
  rules:
    - <<: *CI_MERGE
  stage: analysis
  script:
    - apt-get update
    - apt-get install -y clang-format
                         git
    - sh .gitlab/run_style_check_diff.sh
  allow_failure: true
  artifacts:
    when: on_failure
    paths:
      - fetch_upstream.log
      - fetch_origin.log
    expire_in: 2 days

branches-check:
  extends: .default
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_OPEN_MERGE_REQUESTS == null && $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH'
  stage: analysis
  variables:
    GIT_DEPTH: "0"
  script:
    - apt-get update -qq
    - apt-get install -qq -y --no-install-recommends git
    - sh .gitlab/check_dead_branches.sh
  allow_failure: true

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 .
    - 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:
    # Don't run on MRs since non-merged/non-upstream code can't be distributed by us
    - <<: *CI_COMMIT
    - <<: *CI_RELEASE
  needs: ["gimp-debian-nonreloc"]
  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:
    # Don't run on MRs since non-merged/non-upstream code can't be distributed by us
    - <<: *CI_COMMIT
    - <<: *CI_RELEASE
  needs: ["deps-debian-nonreloc", "gimp-debian-nonreloc"]
  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/')          &&
      API_VER=$(grep GIMP_PKGCONFIG_VERSION _build*/config.h | head -1 | sed 's/^.*"\([^"]*\)"$/\1/') &&
      DIR_NAME=gimp-api-docs-$GIMP_VER                                                                &&
      mkdir $DIR_NAME                                                                                 &&
      mv "${GIMP_PREFIX}/share/doc/gimp-$API_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:
    - sh 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
  #flatpak_ci_initiative.yml is extremely pervasive. See: https://gitlab.gnome.org/GNOME/citemplates/-/issues/35
  ref: 42fbc2526a7680b6a4f284a210e63e3973ea6dae

dist-flatpak-weekly:
  extends:
    - .default
    - .publish_nightly
  rules:
    - !reference [.flatpak, rules]
  needs: ["gimp-flatpak"]
  stage: distribution
  image:
    name: "ghcr.io/flathub/flatpak-builder-lint:latest"
    entrypoint: [""]
  script:
    - sh build/linux/flatpak/3_dist-gimp-flatpakbuilder.sh
  artifacts:
    expose_as: 'Linux flatpak'
    paths:
      - build/linux/flatpak/_Output/
    expire_in: 8 days

dist-snap-weekly:
  extends: .default
  rules:
    - !reference [.snap, rules]
  needs: ["gimp-snap"]
  stage: distribution
  image: !reference [.snap, image]
  variables: !reference [.snap, variables]
  script:
    - sh build/linux/snap/3_dist-gimp-snapcraft.sh
  artifacts:
    expose_as: 'Linux snap'
    paths:
      - build/linux/snap/_Output/
    expire_in: 8 days

dist-installer-weekly:
  extends: .default
  rules:
    - !reference [.win, rules]
  needs:
    - job: gimp-win
      #to allow running outside 'GNOME/gimp' namespace (on MRs)
      optional: true
    - job: gimp-win-eol
  stage: distribution
  tags:
    - win32-ps
  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:
    - !reference [.win, rules]
  needs:
    - job: gimp-win
      #to allow running outside 'GNOME/gimp' namespace (on MRs)
      optional: true
  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

dist-mac-weekly:
  extends: .default
  rules:
    - !reference [.macos-inhouse, rules]
  needs: ["gimp-macos-inhouse"]
  stage: distribution
  tags:
    - macos
  script:
    # Do not call sh since it is old bash on macOS, not the default zsh
    - zsh build/macos/dmg/3_dist-gimp-apple.sh
  artifacts:
    expose_as: 'macOS dmg'
    paths:
      - build/macos/dmg/_Output/
    expire_in: 8 days

[Dauer der Verarbeitung: 0.7 Sekunden, vorverarbeitet 2026-10-27]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1104838
#Domains=499011