Gimp/.gitlab-ci.yml
Bruno Lopes 107887f929 build/flatpak: Drop 'gimp_app_version' hardcoding
Now, the script reads the major.minor version automatically from the main
meson.build file, reducing maintenance work, which is already especially
high regarding flatpak because of the natural hashes updates etc.

Also, a small organization made to make the code more humanly readable.
2024-01-18 15:59:45 +00:00

1133 lines
38 KiB
YAML

# Default commit CI should only run the following pipelines:
# - Linux native GCC build (base & fast)
# - Win64 crossbuild (base & fast)
# Scheduled CI ($CI_PIPELINE_SOURCE == "schedule") will run regularly:
# - Linux native CLang build (rare usefulness)
# - Win32 crossbuild (rare usefulness)
# - Win Aarch64/64/32 native builds (base but slow)
# - Flatpak build (slow and doesn't need constant publishing)
# - cppcheck (static code analysis)
# Releases ($CI_COMMIT_TAG != null) should run only:
# - Win Aarch64/64/32 native builds (Inno Windows installer creation)
#
# To force step-specific pipelines without waiting for commits and/or
# pipelines, these are the variable you should set:
# - GIMP_CI_MESON_GCC: trigger the Debian gcc build.
# - GIMP_CI_MESON_CLANG: trigger the Debian clang build.
# - GIMP_CI_RASTER_ICONS: trigger the Debian build without vector icons.
# - GIMP_CI_CROSSROAD_WIN64: trigger the crossroad build for Win 64-bit.
# - GIMP_CI_CROSSROAD_WIN32: trigger the crossroad build for Win 32-bit.
# - GIMP_CI_MSYS2_WIN_AARCH64: trigger the native MSYS2 build for Win Aarch64.
# - GIMP_CI_MSYS2_WIN64: trigger the native MSYS2 build for Win 64-bit.
# - GIMP_CI_MSYS2_WIN32: trigger the native MSYS2 build for Win 32-bit.
# - GIMP_CI_FLATPAK: trigger the (normally) weekly flatpak build and publishing.
# - GIMP_CI_WIN_INSTALLER: trigger all native MSYS2 builds then creates Inno Windows installer.
# - GIMP_CI_SOURCES: trigger the Debian gcc build and the source tarball job.
# - GIMP_CI_CPPCHECK: trigger cppcheck static analysis.
include: 'https://gitlab.gnome.org/GNOME/citemplates/raw/master/flatpak/flatpak_ci_initiative.yml'
image: debian:bookworm
stages:
- prepare
- dependencies
- gimp
- packaging
- distribution
- analysis
variables:
GIT_DEPTH: "1"
INSTALL_DIR: "_install-x64"
GIMP_PREFIX: "${CI_PROJECT_DIR}/${INSTALL_DIR}"
APT_CACHE: "${CI_PROJECT_DIR}/apt-cache"
## prepare docker images ##
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_GCC != null'
- if: '$GIMP_CI_MESON_CLANG != null'
- if: '$GIMP_CI_RASTER_ICONS != null'
- if: '$GIMP_CI_SOURCES != null'
# This is needed for the BMP image generation for the installer.
# See commit e1203e9f76f.
- if: '$GIMP_CI_WIN_INSTALLER != null'
stage: prepare
variables:
GIT_STRATEGY: none
cache: {}
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- export container=docker
- mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
- echo "FROM debian:bookworm" > Dockerfile
- echo "RUN apt-get update" >> Dockerfile
- echo "RUN apt-get install -y --no-install-recommends \\" >> Dockerfile
- echo "appstream
at-spi2-core
build-essential
desktop-file-utils
ffmpeg
gettext
ghostscript
gi-docgen
git
glib-networking
gobject-introspection
graphviz
graphviz-dev
hicolor-icon-theme
iso-codes
libaa1-dev
libappstream-glib-dev
libbz2-dev
libcfitsio-dev
libdbus-glib-1-dev
libexif-dev
libgexiv2-dev
libgirepository1.0-dev
libgs-dev
libgtk-3-bin
libgtk-3-dev
libgudev-1.0-dev
libheif-dev
libjson-glib-dev
libjxl-dev
liblcms2-dev
liblzma-dev
libmng-dev
libmypaint-dev
libopenexr-dev
libpoppler-glib-dev
libraw-dev
libraw20
librsvg2-dev
libspiro-dev
libsuitesparse-dev
libtiff-dev
libtiff5-dev
libtool
libumfpack5
libwebp-dev
libwmf-dev
libxmu-dev
libxpm-dev
luajit
meson
mypaint-brushes
poppler-data
python3
python3-gi
python3-pip
valac
xauth
xsltproc
xvfb
xz-utils
yelp-tools" >> Dockerfile
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:build-debian-latest --cache=true --cache-ttl=120h
image-win-x64-cross:
rules:
# On commits except tags.
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_TAG == null'
# On merge requests.
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_CROSSROAD_WIN64 != null'
stage: prepare
variables:
GIT_STRATEGY: none
cache: {}
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- export container=docker
- mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
- echo "FROM debian:testing" > Dockerfile
- echo "RUN apt-get update" >> Dockerfile
- echo "RUN apt-get install -y --no-install-recommends \\" >> Dockerfile
# libjxl uses C++ features that require posix threads so we install
# specifically g++-mingw-w64-x86-64-posix and gcc-mingw-w64-x86-64-posix.
# Note that we can't install both the -posix and -win32 versions since
# update gcc-mingw-w64 (25).
- echo "build-essential
cmake
cpio
g++-mingw-w64-x86-64-posix
gcc-mingw-w64-x86-64-posix
gettext
git
libgdk-pixbuf2.0-dev
libgirepository1.0-dev
libglib2.0-bin
librsvg2-dev
meson
pkg-config
python3
python3-distutils
python3-docutils
python3-pip
rpm
python3-zstandard
xsltproc
xvfb" >> Dockerfile
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:build-win64-latest --cache=true --cache-ttl=120h
image-win-x86-cross:
rules:
# Custom builds only (web GUI, API or schedules).
- if: '$GIMP_CI_CROSSROAD_WIN32 != null'
stage: prepare
variables:
GIT_STRATEGY: none
cache: {}
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- export container=docker
- mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
- echo "FROM debian:testing" > Dockerfile
- echo "RUN apt-get update" >> Dockerfile
- echo "RUN apt-get install -y --no-install-recommends \\" >> Dockerfile
- echo "build-essential
cpio
g++-mingw-w64-i686
gcc-mingw-w64-i686
gettext
git
libgdk-pixbuf2.0-dev
libglib2.0-bin
librsvg2-dev
meson
pkg-config
python3
python3-distutils
python3-docutils
python3-pip
python3-zstandard
rpm
xsltproc
xvfb" >> Dockerfile
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:build-win32-latest --cache=true --cache-ttl=120h
## 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_SOURCES != null'
- if: '$GIMP_CI_MESON_GCC != null'
- if: '$GIMP_CI_MESON_CLANG != null'
- if: '$GIMP_CI_RASTER_ICONS != null'
# This is needed for the BMP image generation for the installer.
# See commit e1203e9f76f.
- if: '$GIMP_CI_WIN_INSTALLER != null'
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_DIR}"
- _babl/_build-x64
- _gegl/_build-x64
before_script:
- git clone --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/babl.git _babl
- git clone --depth=${GIT_DEPTH} https://gitlab.gnome.org/GNOME/gegl.git _gegl
- export PKG_CONFIG_PATH="${GIMP_PREFIX}/lib/pkgconfig"
- export PKG_CONFIG_PATH="${GIMP_PREFIX}/lib/`gcc -print-multiarch`/pkgconfig/:$PKG_CONFIG_PATH"
- export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib:${LD_LIBRARY_PATH}"
- export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib/`gcc -print-multiarch`:$LD_LIBRARY_PATH"
- export XDG_DATA_DIRS="${GIMP_PREFIX}/share:/usr/local/share:/usr/share"
script:
- mkdir _babl/_build-x64 && cd _babl/_build-x64
- meson setup .. -Dprefix="${GIMP_PREFIX}"
- ninja && ninja install
- mkdir ../../_gegl/_build-x64 && cd ../../_gegl/_build-x64
- 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
artifacts:
expire_in: 1 days
when: always
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
paths:
- _build-x64
- "${INSTALL_DIR}"
before_script:
- export PATH="${GIMP_PREFIX}/bin:$PATH"
- export PKG_CONFIG_PATH="${GIMP_PREFIX}/lib/pkgconfig:${GIMP_PREFIX}/share/pkgconfig"
- export PKG_CONFIG_PATH="${GIMP_PREFIX}/lib/`gcc -print-multiarch`/pkgconfig/:$PKG_CONFIG_PATH"
- export PKG_CONFIG_PATH="${GIMP_PREFIX}/share/`gcc -print-multiarch`/pkgconfig/:$PKG_CONFIG_PATH"
- export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib:${LD_LIBRARY_PATH}"
- export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib/`gcc -print-multiarch`:$LD_LIBRARY_PATH"
- export XDG_DATA_DIRS="${GIMP_PREFIX}/share:/usr/local/share:/usr/share"
- export GI_TYPELIB_PATH="${GIMP_PREFIX}/lib/`gcc -print-multiarch`/girepository-1.0/:${GI_TYPELIB_PATH}"
needs: ["deps-debian-x64"]
gimp-debian-x64:
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.
# This is needed for the BMP image generation for the installer.
# See commit e1203e9f76f.
- if: '$GIMP_CI_WIN_INSTALLER != null'
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_MESON_GCC != null'
- if: '$GIMP_CI_SOURCES != null'
extends: .gimp-debian-base
script:
- mkdir -p _build-x64 && cd _build-x64
- meson setup .. -Dprefix="${GIMP_PREFIX}"
-Dgi-docgen=enabled
-Dg-ir-doc=true
-Dwindows-installer=true
- 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.
- if [ $(git diff |wc -l) -ne 0 ]; then
git diff;
exit 1;
fi
- ninja dist && ninja install
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
reports:
junit: "_build-x64/meson-logs/testlog.junit.xml"
paths:
- "_build-x64/config.h"
- "_build-x64/meson-logs"
- "_build-x64/meson-dist"
- "_build-x64/devel-docs"
- "_build-x64/build/windows/installer/"
- "${INSTALL_DIR}"
gimp-debian-clang:
rules:
# Custom builds only (web GUI, API or schedules).
- if: '$GIMP_CI_MESON_CLANG != null'
extends: .gimp-debian-base
variables:
CC: "clang"
CXX: "clang++"
script:
- mkdir -p "$APT_CACHE"
- apt-get install -y --no-install-recommends -o dir::cache::archives="$APT_CACHE"
clang
libomp-dev
- mkdir -p _build-x64 && cd _build-x64
- meson setup .. -Dprefix="${GIMP_PREFIX}"
- ninja && ninja test
gimp-debian-raster-icons:
rules:
# Custom builds only (web GUI, API or schedules).
- if: '$GIMP_CI_RASTER_ICONS != null'
extends: .gimp-debian-base
script:
- mkdir -p _build-x64 && cd _build-x64
- meson setup .. -Dprefix="${GIMP_PREFIX}"
-Dvector-icons=false
- ninja && ninja test
## WINDOWS 64-bit CI (cross-build crossroad) ##
deps-win-x64-cross:
rules:
# On commits except tags.
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_TAG == null'
# On merge requests.
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_CROSSROAD_WIN64 != null'
stage: dependencies
image: $CI_REGISTRY_IMAGE:build-win64-latest
variables:
XDG_CACHE_HOME: "$CI_PROJECT_DIR/.cache/"
XDG_DATA_HOME: "$CI_PROJECT_DIR/.local/share/"
# Needed because by default, Debian has now changed
# "sysconfig.get_default_scheme()" from "posix_prefix" to "posix_local" which
# adds a local/ folder to the install prefix of setup.py. This environment
# variable overrides this behavior.
DEB_PYTHON_INSTALL_LAYOUT: "deb"
APT_CACHE: "${CI_PROJECT_DIR}/apt-cache"
cache:
paths:
- .cache/crossroad/
- apt-cache
before_script:
- apt-get update
- mkdir -p "$APT_CACHE"
- apt-get install -y --no-install-recommends -o dir::cache::archives="$APT_CACHE"
wine
wine64
- git clone --depth=${GIT_DEPTH} https://gitlab.freedesktop.org/crossroad/crossroad.git
- cd crossroad
- ./setup.py install --prefix=`pwd`/../.local
- cd ..
script:
- export PATH="`pwd`/.local/bin:$PATH"
- crossroad w64 gimp --run="build/windows/gitlab-ci/1_build-deps-crossroad.sh"
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 2 hours
paths:
- .local/
- _deps/_babl/_build-x64/
- _deps/_gegl/_build-x64/
needs: ["image-win-x64-cross"]
gimp-win-x64-cross:
rules:
# On commits except tags.
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_TAG == null'
# On merge requests.
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_CROSSROAD_WIN64 != null'
stage: gimp
image: $CI_REGISTRY_IMAGE:build-win64-latest
dependencies:
- deps-win-x64-cross
variables:
XDG_CACHE_HOME: "$CI_PROJECT_DIR/.cache/"
XDG_DATA_HOME: "$CI_PROJECT_DIR/.local/share/"
cache:
paths:
- .cache/crossroad/
- apt-cache
script:
- export PATH="`pwd`/.local/bin:$PATH"
- crossroad w64 gimp --run="build/windows/gitlab-ci/2_build-gimp-crossroad.sh"
needs: ["deps-win-x64-cross"]
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 1 day
paths:
- _build-x64/
- _install-x64/
packaging-win-x64-nightly:
rules:
# On commits except tags.
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_TAG == null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_CROSSROAD_WIN64 != null'
stage: packaging
dependencies:
- gimp-win-x64-cross
variables:
BUILD_TYPE: "CI_CROSS"
CROSSROAD_PLATFORM: "w64"
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 2 days
paths:
- gimp-x64
- done-dll.list
before_script:
- apt-get update
- apt-get install -y --no-install-recommends
binutils
binutils-mingw-w64-x86-64
file
libglib2.0-bin
python3
script:
- bash -x build/windows/gitlab-ci/3_package-gimp-uni_base.sh
- cd gimp-x64
- bash -x ../build/windows/gitlab-ci/3_package-gimp-uni_sym.sh
needs: ["gimp-win-x64-cross"]
## WINDOWS 32-bit CI (cross-build crossroad) ##
deps-win-x86-cross:
rules:
# Custom builds only (web GUI, API or schedules).
- if: '$GIMP_CI_CROSSROAD_WIN32 != null'
stage: dependencies
image: $CI_REGISTRY_IMAGE:build-win32-latest
variables:
XDG_CACHE_HOME: "$CI_PROJECT_DIR/.cache/"
XDG_DATA_HOME: "$CI_PROJECT_DIR/.local/share/"
DEB_PYTHON_INSTALL_LAYOUT: "deb"
cache:
paths:
- .cache/crossroad/
- apt-cache
before_script:
- apt-get update
- mkdir -p "$APT_CACHE"
- apt-get install -y --no-install-recommends -o dir::cache::archives="$APT_CACHE"
wine
- git clone --depth=${GIT_DEPTH} https://gitlab.freedesktop.org/crossroad/crossroad.git
- cd crossroad
- ./setup.py install --prefix=`pwd`/../.local
- cd ..
script:
- export PATH="`pwd`/.local/bin:$PATH"
- crossroad w32 gimp --run="build/windows/gitlab-ci/1_build-deps-crossroad.sh"
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 2 hours
paths:
- .local/
- _deps/_babl/_build-x86/
- _deps/_gegl/_build-x86/
needs: ["image-win-x86-cross"]
gimp-win-x86-cross:
rules:
# Custom builds only (web GUI, API or schedules).
- if: '$GIMP_CI_CROSSROAD_WIN32 != null'
stage: gimp
image: $CI_REGISTRY_IMAGE:build-win32-latest
dependencies:
- deps-win-x86-cross
- deps-win-x64-cross
variables:
XDG_CACHE_HOME: "$CI_PROJECT_DIR/.cache/"
XDG_DATA_HOME: "$CI_PROJECT_DIR/.local/share/"
cache:
paths:
- .cache/crossroad/
- apt-cache
script:
- export PATH="`pwd`/.local/bin:$PATH"
- crossroad w32 gimp --run="build/windows/gitlab-ci/2_build-gimp-crossroad.sh"
needs: ["deps-win-x86-cross", "deps-win-x64-cross"]
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 1 day
paths:
- _build-x86/
- _install-x86/
packaging-win-x86-nightly:
rules:
# Custom builds only (web GUI, API or schedules).
- if: '$GIMP_CI_CROSSROAD_WIN32 != null'
stage: packaging
dependencies:
- gimp-win-x86-cross
variables:
BUILD_TYPE: "CI_CROSS"
CROSSROAD_PLATFORM: "w32"
XDG_DATA_HOME: "$CI_PROJECT_DIR/.local/share/"
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 2 days
paths:
- gimp-x86
- done-dll.list
before_script:
- apt-get update
- apt-get install -y --no-install-recommends
binutils
binutils-mingw-w64-i686
file
libglib2.0-bin
python3
script:
- bash -x build/windows/gitlab-ci/3_package-gimp-uni_base.sh
- cd gimp-x86
- bash -x ../build/windows/gitlab-ci/3_package-gimp-uni_sym.sh
needs: ["gimp-win-x86-cross"]
## WINDOWS Aarch64 CI (native MSYS2) ##
deps-win-a64:
rules:
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_MSYS2_WIN_AARCH64 != null'
- if: '$GIMP_CI_WIN_INSTALLER != null'
# Merge requests with appropriate label.
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/'
stage: dependencies
variables:
BUILD_TYPE: "CI_NATIVE"
MSYSTEM: "CLANGARM64"
CHERE_INVOKING: "yes"
tags:
- windows-aarch64
before_script:
# C:\msys64\usr\bin\pacman --noconfirm -Syyuu
script:
# Verification to prevent the job from failing because stuck pacman (ARM only),
# since our runner keeps the status of the MSYS2 installation between jobs
- $stuck = Test-Path -Path "C:\msys64\var\lib\pacman\db.lck" -PathType Leaf
- if ($stuck -eq "True") {
Remove-Item -Force -Path "C:\msys64\var\lib\pacman\db.lck"
Write-Output "Cleaned previous stuck pacman" }
- Start-Job -ScriptBlock{sleep 90; taskkill /t /F /IM "pacman.exe"}
- C:\msys64\usr\bin\bash -lc "bash -x ./build/windows/gitlab-ci/1_build-deps-msys2.sh"
retry: 2
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 2 hours
paths:
- _install-a64
needs: []
gimp-win-a64:
rules:
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_MSYS2_WIN_AARCH64 != null'
- if: '$GIMP_CI_WIN_INSTALLER != null'
# Merge requests with appropriate label.
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/'
stage: gimp
variables:
BUILD_TYPE: "CI_NATIVE"
MSYSTEM: "CLANGARM64"
CHERE_INVOKING: "yes"
tags:
- windows-aarch64
before_script:
# C:\msys64\usr\bin\pacman --noconfirm -Syyuu
script:
- $stuck = Test-Path -Path "C:\msys64\var\lib\pacman\db.lck" -PathType Leaf
- if ($stuck -eq "True") {
Remove-Item -Force -Path "C:\msys64\var\lib\pacman\db.lck"
Write-Output "Cleaned previous stuck pacman" }
# Temporary patch until we use the latest LLVM.
- git apply ./build/windows/patches/0001-clang-rc-files-fix.patch
- git apply ./build/windows/patches/0004-clang-windres.patch
- Start-Job -ScriptBlock{sleep 90; taskkill /t /F /IM "pacman.exe"}
- C:\msys64\usr\bin\bash -lc "bash -x ./build/windows/gitlab-ci/2_build-gimp-msys2.sh"
retry: 2
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 1 day
paths:
- _install-a64
- _build-a64/build/windows/installer/
- _build-a64/meson-*/
cache:
paths:
- _ccache/
needs: ["deps-win-a64"]
packaging-win-a64:
rules:
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_WIN_INSTALLER != null'
# Merge requests with appropriate label.
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/'
stage: packaging
variables:
MSYSTEM: "CLANGARM64"
CHERE_INVOKING: "yes"
tags:
- windows-aarch64
before_script:
# C:\msys64\usr\bin\pacman --noconfirm -Syyuu
script:
- $stuck = Test-Path -Path "C:\msys64\var\lib\pacman\db.lck" -PathType Leaf
- if ($stuck -eq "True") {
Remove-Item -Force -Path "C:\msys64\var\lib\pacman\db.lck"
Write-Output "Cleaned previous stuck pacman" }
- Start-Job -ScriptBlock{sleep 90; taskkill /t /F /IM "pacman.exe"}
- C:\msys64\usr\bin\bash -lc "bash -x ./build/windows/gitlab-ci/3_package-gimp-uni_base.sh"
- cd gimp-a64
- C:\msys64\usr\bin\bash -lc "bash -x ../build/windows/gitlab-ci/3_package-gimp-uni_sym.sh"
retry: 2
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 1 day
paths:
- gimp-a64
- done-dll.list
needs: ["gimp-win-a64"]
## WINDOWS x86_64 CI (native MSYS2) ##
deps-win-x64:
rules:
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_MSYS2_WIN64 != null'
- if: '$GIMP_CI_WIN_INSTALLER != null'
# Merge requests with appropriate label.
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/'
stage: dependencies
variables:
BUILD_TYPE: "CI_NATIVE"
MSYSTEM: "MINGW64"
CHERE_INVOKING: "yes"
tags:
- win32-ps
before_script:
- C:\msys64\usr\bin\pacman --noconfirm -Syyuu
script:
- C:\msys64\usr\bin\bash -lc "bash -x ./build/windows/gitlab-ci/1_build-deps-msys2.sh"
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 2 hours
paths:
- _install-x64
needs: []
gimp-win-x64:
rules:
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_MSYS2_WIN64 != null'
- if: '$GIMP_CI_WIN_INSTALLER != null'
# Merge requests with appropriate label.
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/'
stage: gimp
variables:
BUILD_TYPE: "CI_NATIVE"
MSYSTEM: "MINGW64"
CHERE_INVOKING: "yes"
tags:
- win32-ps
before_script:
- C:\msys64\usr\bin\pacman --noconfirm -Syyuu
script:
- C:\msys64\usr\bin\bash -lc "bash -x ./build/windows/gitlab-ci/2_build-gimp-msys2.sh"
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 1 day
paths:
- _install-x64
- _build-x64/build/windows/installer/
- _build-x64/meson-*/
cache:
paths:
- _ccache/
needs: ["deps-win-x64"]
packaging-win-x64:
rules:
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_WIN_INSTALLER != null'
# Merge requests with appropriate label.
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/'
stage: packaging
variables:
MSYSTEM: "MINGW64"
CHERE_INVOKING: "yes"
tags:
- win32-ps
before_script:
- C:\msys64\usr\bin\pacman --noconfirm -Syyuu
script:
- C:\msys64\usr\bin\bash -lc "bash -x ./build/windows/gitlab-ci/3_package-gimp-uni_base.sh"
- cd gimp-x64
- C:\msys64\usr\bin\bash -lc "bash -x ../build/windows/gitlab-ci/3_package-gimp-uni_sym.sh"
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 1 day
paths:
- gimp-x64
- done-dll.list
needs: ["gimp-win-x64"]
## WINDOWS x86 CI (native MSYS2) ##
deps-win-x86:
rules:
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_MSYS2_WIN32 != null'
- if: '$GIMP_CI_WIN_INSTALLER != null'
# Merge requests with appropriate label.
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/'
stage: dependencies
variables:
BUILD_TYPE: "CI_NATIVE"
MSYSTEM: "MINGW32"
CHERE_INVOKING: "yes"
tags:
- win32-ps
before_script:
- C:\msys64\usr\bin\pacman --noconfirm -Syyuu
script:
- C:\msys64\usr\bin\bash -lc "bash -x ./build/windows/gitlab-ci/1_build-deps-msys2.sh"
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 2 hours
paths:
- _install-x86
needs: []
gimp-win-x86:
rules:
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_MSYS2_WIN32 != null'
- if: '$GIMP_CI_WIN_INSTALLER != null'
# Merge requests with appropriate label.
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/'
stage: gimp
variables:
BUILD_TYPE: "CI_NATIVE"
MSYSTEM: "MINGW32"
CHERE_INVOKING: "yes"
tags:
- win32-ps
before_script:
- C:\msys64\usr\bin\pacman --noconfirm -Syyuu
script:
- C:\msys64\usr\bin\bash -lc "bash -x ./build/windows/gitlab-ci/2_build-gimp-msys2.sh"
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 1 day
paths:
- _install-x86
- _build-x86/meson-*/
cache:
paths:
- _ccache/
needs: ["deps-win-x86"]
packaging-win-x86:
rules:
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_WIN_INSTALLER != null'
# Merge requests with appropriate label.
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/'
stage: packaging
variables:
MSYSTEM: "MINGW32"
CHERE_INVOKING: "yes"
tags:
- win32-ps
before_script:
- C:\msys64\usr\bin\pacman --noconfirm -Syyuu
script:
- C:\msys64\usr\bin\bash -lc "bash -x ./build/windows/gitlab-ci/3_package-gimp-uni_base.sh"
- cd gimp-x86
- C:\msys64\usr\bin\bash -lc "bash -x ../build/windows/gitlab-ci/3_package-gimp-uni_sym.sh"
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 1 day
paths:
- gimp-x86
- done-dll.list
needs: ["gimp-win-x86"]
## Linux Flatpak weekly CI ##
## To learn more about the CI, go to https://gitlab.gnome.org/GNOME/Initiatives/-/wikis/DevOps-with-Flatpak
flatpak:
# XXX This job is mostly the same as .flatpak job of
# flatpak_ci_initiative.yml so far, except that we removed the
# automatic tests since rebuilding plug-ins was not working and
# one of the test (save-and-export) requires plug-ins to be built.
image: 'quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master'
stage: gimp
tags:
- flatpak
needs: []
rules:
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_FLATPAK != null'
# Merge requests with appropriate label.
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Flatpak package.*/'
variables:
GIT_SUBMODULE_STRATEGY: normal
# Replace with your manifest path
MANIFEST_PATH: "build/flatpak/org.gimp.GIMP-nightly.json"
RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
# Replace with your application name, as written in the manifest
FLATPAK_MODULE: "gimp"
APP_ID: "org.gimp.GIMP"
BUNDLE: "gimp-git.flatpak"
before_script:
# Report the installed versions of the runtime
- flatpak info org.gnome.Platform
- flatpak info org.gnome.Sdk
# Print the date, since appstream depends on local timezone
- date && date -u
# Set GIMP app version (major.minor)
- GIMP_VERSION=$(grep version meson.build | head -1 | sed -nre 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p')
- echo $GIMP_VERSION
- GIMP_APP_VERSION=$(echo $GIMP_VERSION | sed 's/\([0-9]\+\.[0-9]\+\)\..*/\1/')
- echo $GIMP_APP_VERSION
- sed -i "s/GIMP_APP_VERSION/${GIMP_APP_VERSION}/g" ${MANIFEST_PATH}
# GNOME script to customize the manifest
- rewrite-flatpak-manifest ${MANIFEST_PATH} ${FLATPAK_MODULE} ${CONFIG_OPTS}
script:
# Build deps and GIMP
# (Our script is too long for Gitlab and no complete output would be collected
# To make debugging actually possible, let's save logs as a file.)
- flatpak-builder --user --disable-rofiles-fuse flatpak_app --repo=repo ${BRANCH:+--default-branch=$BRANCH} ${MANIFEST_PATH}
2>&1 | tee flatpak-builder.log
# Generate a Flatpak bundle
- flatpak build-bundle repo ${BUNDLE} --runtime-repo=${RUNTIME_REPO} ${APP_ID} ${BRANCH}
- tar cf repo.tar repo/
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
paths:
- flatpak-builder.log
# These are the same as flatpak_ci_initiative.yml as according to
# docs, key values are not merged but replaced.
- "${BUNDLE}"
- 'repo.tar'
- '.flatpak-builder/build/${FLATPAK_MODULE}/_flatpak_build/meson-logs/meson-log.txt'
- '.flatpak-builder/build/${FLATPAK_MODULE}/_flatpak_build/meson-logs/testlog.txt'
expire_in: 1 week
cache:
- key: "$CI_JOB_NAME"
paths:
- '.flatpak-builder/downloads'
- '.flatpak-builder/git'
- key: "$CI_JOB_NAME"
paths:
- '.flatpak-builder/cache'
- '.flatpak-builder/ccache'
clang-format:
only:
- merge_requests
stage: analysis
before_script:
- apt-get update
- apt-get install -y clang-format
git
allow_failure: true
script:
- .gitlab/run_style_check_diff.sh
artifacts:
paths: ['fetch_upstream.log', 'fetch_origin.log']
when: on_failure
expire_in: 1 week
needs: []
cppcheck:
rules:
# Custom builds only (web GUI, API or schedules).
- if: '$GIMP_CI_CPPCHECK != null'
stage: analysis
before_script:
- apt-get update
- apt-get install -y cppcheck
script:
- cppcheck -q -j8 --enable=all --force --output-file=cppcheck.xml --xml --xml-version=2
-i _build-x64 -i _build-x86 -i _deps -i _install-x64 -i _install-x86 -i .local -i .cache .
- mkdir report
- cppcheck-htmlreport --source-dir=. --title=gimp --file=cppcheck.xml --report-dir=report
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
expire_in: 1 week
when: always
paths:
- report
needs: []
## Ready-to-distribute ##
flatpak-weekly:
extends: '.publish_nightly'
stage: distribution
rules:
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_FLATPAK != null'
needs: ["flatpak"]
dependencies:
- 'flatpak'
win-installer-weekly:
rules:
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_WIN_INSTALLER != null'
# Merge requests with appropriate label.
- if: '$CI_MERGE_REQUEST_LABELS =~ /.*5. Windows Installer.*/'
variables:
CHERE_INVOKING: "yes"
tags:
- win32-ps
stage: distribution
dependencies:
- packaging-win-a64
- packaging-win-x64
- packaging-win-x86
# This is needed for the BMP image generation for the installer.
# See commit e1203e9f76f.
- gimp-debian-x64
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 1 week
paths:
- build/windows/installer/_Output
- installer.log
script:
- C:\msys64\usr\bin\pacman --noconfirm -Syyuu
- C:\msys64\usr\bin\bash -lc "bash -x ./build/windows/gitlab-ci/4_installer-gimp-msys2.sh > installer.log 2>&1"
needs: ["packaging-win-a64", "packaging-win-x64", "packaging-win-x86", "gimp-debian-x64"]
sources-debian:
rules:
# On commits.
- if: '$CI_PIPELINE_SOURCE == "push"'
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_SOURCES != null'
stage: distribution
dependencies:
- gimp-debian-x64
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 2 days
paths:
- gimp-*.tar.xz
- gimp-*.tar.xz.SHA256SUMS
- gimp-*.tar.xz.SHA512SUMS
script:
- mv _build-x64/meson-dist/gimp-*.tar.xz .
- FILENAME=`ls gimp-*.tar.xz` &&
sha256sum gimp-*.tar.xz > ${FILENAME}.SHA256SUMS &&
sha512sum gimp-*.tar.xz > ${FILENAME}.SHA512SUMS
needs: ["gimp-debian-x64"]
dev-docs:
rules:
# On commits.
- if: '$CI_PIPELINE_SOURCE == "push"'
# On releases.
- if: '$CI_COMMIT_TAG != null'
# Custom builds though web GUI, API or schedules.
- if: '$GIMP_CI_SOURCES != null'
stage: distribution
image: $CI_REGISTRY_IMAGE:build-debian-latest
dependencies:
- deps-debian-x64
- gimp-debian-x64
artifacts:
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
when: always
expire_in: 2 days
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
script:
- BABL_VER=$(grep BABL_VERSION _babl/_build-x64/config.h | head -1 | sed 's/^.*"\([^"]*\)"$/\1/') &&
BABL_API_VER=$(grep BABL_API_VERSION _babl/_build-x64/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 -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-x64/config.h |head -1 |sed 's/^[^0-9]*\([0-9]*\).*$/\1/') &&
GEGL_MIN_VER=$(grep GEGL_MINOR_VERSION _gegl/_build-x64/config.h |head -1 |sed 's/^[^0-9]*\([0-9]*\).*$/\1/') &&
GEGL_MIC_VER=$(grep GEGL_MICRO_VERSION _gegl/_build-x64/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 -cJf ${TAR_NAME} $DIR_NAME &&
sha256sum $TAR_NAME > ${TAR_NAME}.SHA256SUMS &&
sha512sum $TAR_NAME > ${TAR_NAME}.SHA512SUMS
- GIMP_VER=$(grep GIMP_VERSION _build-x64/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 &&
mv _build-x64/devel-docs/g-ir-docs $DIR_NAME/ &&
TAR_NAME="$DIR_NAME.tar.xz" &&
tar -cJf ${TAR_NAME} $DIR_NAME &&
sha256sum $TAR_NAME > ${TAR_NAME}.SHA256SUMS &&
sha512sum $TAR_NAME > ${TAR_NAME}.SHA512SUMS
needs: ["deps-debian-x64", "gimp-debian-x64"]