From f00eb5855ad7b2262421e66e77996f00f41bac19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Tue, 3 Oct 2023 11:57:18 +0200 Subject: [PATCH] ci: Split definition in multiple files --- .gitlab-ci.yml | 196 ++++----------------------------- .gitlab-ci/build.yml | 19 ++++ .gitlab-ci/create_release.yml | 67 +++++++++++ .gitlab-ci/publish_docs.yml | 18 +++ .gitlab-ci/publish_nightly.yml | 11 ++ .gitlab-ci/run_checks.yml | 18 +++ 6 files changed, 156 insertions(+), 173 deletions(-) create mode 100644 .gitlab-ci/build.yml create mode 100644 .gitlab-ci/create_release.yml create mode 100644 .gitlab-ci/publish_docs.yml create mode 100644 .gitlab-ci/publish_nightly.yml create mode 100644 .gitlab-ci/run_checks.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 87219566..d824449c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,183 +1,33 @@ -include: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/master/flatpak/flatpak_ci_initiative.yml' - stages: - check - - test - build - - doc - deploy - - release variables: - RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo" FLATPAK_MODULE: "fractal" - # We currently don't have any tests, remove "RUN_TESTS" to run tests - RUN_TESTS: "0" - BUNDLE: "${APP_ID}.flatpak" -.vars_nightly: - variables: - MANIFEST_PATH: "build-aux/org.gnome.Fractal.Devel.json" - APP_ID: "org.gnome.Fractal.Devel" - only: - - main - -.vars_hack: - variables: - MANIFEST_PATH: "build-aux/org.gnome.Fractal.Hack.json" - APP_ID: "org.gnome.Fractal.Hack" - except: - - main - -# Configure and run code checks -# Exits and fails if an error is encountered -checks: - image: "instrumentisto/rust:nightly-slim-2023-08-11" - stage: check - script: - - scripts/checks.sh --verbose --force-install - -# Lint the code -cargo-clippy: - stage: check - image: 'quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master' - extends: - - .vars_hack - tags: - - flatpak - script: - - flatpak-builder --keep-build-dirs --user --disable-rofiles-fuse --stop-at=${FLATPAK_MODULE} flatpak_app --repo=repo ${BRANCH:+--default-branch=$BRANCH} ${MANIFEST_PATH} - - echo "cargo clippy -- -D warnings" | flatpak-builder --disable-rofiles-fuse --build-shell=${FLATPAK_MODULE} flatpak_app ${MANIFEST_PATH} - -# Build a debug version of the flatpak -# Except on main -build-hack@x86_64: - extends: - - .flatpak@x86_64 - - .vars_hack - stage: build - -build-hack@aarch64: - extends: - - .flatpak@aarch64 - - .vars_hack - stage: build - -# Build the nightly version of the flatpak -# Only on main -build@x86_64: - extends: - - .flatpak@x86_64 - - .vars_nightly - stage: build - -build@aarch64: - extends: - - .flatpak@aarch64 - - .vars_nightly - stage: build - -# Build the docs -# Only on main -pages: - image: 'quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master' - extends: .vars_nightly - stage: doc - tags: - - flatpak - script: - - flatpak install --user --noninteractive org.freedesktop.Sdk.Extension.rust-nightly//23.08 - - sed -i 's|rust-stable|rust-nightly|g' ${MANIFEST_PATH} - - flatpak-builder --keep-build-dirs --user --disable-rofiles-fuse --stop-at=${FLATPAK_MODULE} flatpak_app --repo=repo ${BRANCH:+--default-branch=$BRANCH} ${MANIFEST_PATH} - - echo "ninja src/doc" | flatpak-builder --disable-rofiles-fuse --build-shell=${FLATPAK_MODULE} flatpak_app ${MANIFEST_PATH} - - mv .flatpak-builder/build/${FLATPAK_MODULE}/_flatpak_build/src/doc public - - chmod -R a=rwx public - dependencies: [] - artifacts: - paths: - - 'public' - -# Publish the nightly version -# Only on main -publish_nightly@x86_64: - extends: .publish_nightly - needs: ['build@x86_64'] - -publish_nightly@aarch64: - extends: .publish_nightly - needs: ['build@aarch64'] - -.vars_release: - variables: - PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/release-tarballs/${CI_COMMIT_TAG}" - RELEASE_TARBALL: "fractal-${CI_COMMIT_TAG}.tar.xz" - RELEASE_TARBALL_SHA: "fractal-${CI_COMMIT_TAG}.tar.xz.sha256sum" - FLATPAK_MODULE: "fractal" - MANIFEST_PATH: "build-aux/org.gnome.Fractal.json" - APP_ID: "org.gnome.Fractal" - CONFIG_OPTS: "-Dprofile=default" - -release-tarball: - stage: release - image: 'quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master' - extends: - - .vars_release - tags: - - flatpak - script: - # Create flatpak manifest for release - - sed 's/org.gnome.Fractal.Devel/org.gnome.Fractal/g' build-aux/org.gnome.Fractal.Devel.json > ${MANIFEST_PATH} - - rewrite-flatpak-manifest ${MANIFEST_PATH} ${FLATPAK_MODULE} ${CONFIG_OPTS} - - # Build tarball with vendored rust dependencies - - flatpak-builder --keep-build-dirs --user --disable-rofiles-fuse --stop-at=${FLATPAK_MODULE} flatpak_app --repo=repo ${BRANCH:+--default-branch=$BRANCH} ${MANIFEST_PATH} - # FIXME: We need --allow-dirty since the manifest is created in place - - echo "meson dist --allow-dirty" | flatpak-builder --disable-rofiles-fuse --build-shell=${FLATPAK_MODULE} flatpak_app ${MANIFEST_PATH} - - mv .flatpak-builder/build/${FLATPAK_MODULE}/_flatpak_build/meson-dist tarball - - # Upload tarball - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file tarball/${RELEASE_TARBALL} "${PACKAGE_REGISTRY_URL}/${RELEASE_TARBALL}" - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file tarball/${RELEASE_TARBALL_SHA} "${PACKAGE_REGISTRY_URL}/${RELEASE_TARBALL_SHA}" - - # Extract release notes from appstream - # FIXME: Appstream requires the files name to be `*.metainfo.xml` - - cp data/${APP_ID}.metainfo.xml.in.in data/${APP_ID}.metainfo.xml - - appstream-util appdata-to-news "data/${APP_ID}.metainfo.xml" | - awk '{ x[NR] = $0 } END { for ( i=5 ; i<=NR ; i++ ) { if (x[i] ~ /^$/ && x[i+1] ~ /^Version/ && x[i+2] ~ /^=/ && x[i+3] ~ /^Release/) exit; else print x[i]; }}' > - release_notes.txt - dependencies: [] +workflow: rules: - - if: $CI_COMMIT_TAG - artifacts: - paths: - - tarball - - release_notes.txt + - if: $CI_COMMIT_BRANCH == "main" + variables: + MANIFEST_PATH: "build-aux/org.gnome.Fractal.Devel.json" + APP_ID: "org.gnome.Fractal.Devel" + - if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "main" + variables: + MANIFEST_PATH: "build-aux/org.gnome.Fractal.Hack.json" + APP_ID: "org.gnome.Fractal.Hack" -# https://gitlab.com/gitlab-org/gitlab/-/issues/271534 The default URL needs authentication right now, which is less than optimal... -# Get the package_files ID instead and use that as download URL in the "release" step. -release: - stage: release - extends: - - .vars_release - image: registry.gitlab.com/gitlab-org/release-cli:latest - script: - - apk add curl jq - - | - export PACKAGE_ID=$(curl "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages?sort=desc" | jq -c .[0].id) - - | - export RELEASE_TARBALL_DOWNLOAD_ID=$(curl "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/${PACKAGE_ID}/package_files" | jq -c .[0].id) - export RELEASE_TARBALL_SHA_DOWNLOAD_ID=$(curl "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/${PACKAGE_ID}/package_files" | jq -c .[1].id) - - - export RELEASE_TARBALL_URL="${CI_PROJECT_URL}/-/package_files/$RELEASE_TARBALL_DOWNLOAD_ID/download" - - export RELEASE_TARBALL_SHA_URL="${CI_PROJECT_URL}/-/package_files/$RELEASE_TARBALL_SHA_DOWNLOAD_ID/download" - - cat release_notes.txt - - | - release-cli create --name "Release $CI_COMMIT_TAG" --tag-name $CI_COMMIT_TAG \ - --assets-link "{\"name\":\"Tarball for ${CI_COMMIT_TAG}\",\"url\":\"${RELEASE_TARBALL_URL}\", \"filepath\": \"/tarball/${RELEASE_TARBALL}\"}" \ - --assets-link "{\"name\":\"Checksum for ${CI_COMMIT_TAG}\",\"url\":\"${RELEASE_TARBALL_SHA_URL}\", \"filepath\": \"/tarball/${RELEASE_TARBALL_SHA}\"}" \ - --description release_notes.txt - rules: - - if: $CI_COMMIT_TAG - needs: ['release-tarball'] +include: + - local: .gitlab-ci/run_checks.yml + - local: .gitlab-ci/build.yml + rules: + - if: $CI_COMMIT_TAG == null + - local: .gitlab-ci/publish_docs.yml + rules: + - if: $CI_COMMIT_BRANCH == "main" && $CI_COMMIT_TAG == null + - local: .gitlab-ci/publish_nightly.yml + rules: + - if: $CI_COMMIT_BRANCH == "main" && $CI_COMMIT_TAG == null + - local: .gitlab-ci/create_release.yml + rules: + - if: $CI_COMMIT_TAG \ No newline at end of file diff --git a/.gitlab-ci/build.yml b/.gitlab-ci/build.yml new file mode 100644 index 00000000..a32d190f --- /dev/null +++ b/.gitlab-ci/build.yml @@ -0,0 +1,19 @@ +# Build the Flatpak + +include: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/master/flatpak/flatpak_ci_initiative.yml' + +variables: + RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo" + BUNDLE: "${APP_ID}.flatpak" + # We currently don't have any tests, remove "RUN_TESTS" to run tests + RUN_TESTS: "0" + +build@x86_64: + extends: + - .flatpak@x86_64 + stage: build + +build@aarch64: + extends: + - .flatpak@aarch64 + stage: build diff --git a/.gitlab-ci/create_release.yml b/.gitlab-ci/create_release.yml new file mode 100644 index 00000000..f2bb440a --- /dev/null +++ b/.gitlab-ci/create_release.yml @@ -0,0 +1,67 @@ +# Generate a tarball, publish it to the package registry and create a release + +variables: + PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/release-tarballs/${CI_COMMIT_TAG}" + RELEASE_TARBALL: "fractal-${CI_COMMIT_TAG}.tar.xz" + RELEASE_TARBALL_SHA: "fractal-${CI_COMMIT_TAG}.tar.xz.sha256sum" + +release-tarball: + stage: deploy + image: 'quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master' + variables: + MANIFEST_PATH: "build-aux/org.gnome.Fractal.json" + APP_ID: "org.gnome.Fractal" + CONFIG_OPTS: "-Dprofile=default" + tags: + - flatpak + script: + # Create flatpak manifest for release + - sed 's/org.gnome.Fractal.Devel/org.gnome.Fractal/g' build-aux/org.gnome.Fractal.Devel.json > ${MANIFEST_PATH} + - rewrite-flatpak-manifest ${MANIFEST_PATH} ${FLATPAK_MODULE} ${CONFIG_OPTS} + + # Build tarball with vendored rust dependencies + - flatpak-builder --keep-build-dirs --user --disable-rofiles-fuse --stop-at=${FLATPAK_MODULE} flatpak_app --repo=repo ${BRANCH:+--default-branch=$BRANCH} ${MANIFEST_PATH} + # FIXME: We need --allow-dirty since the manifest is created in place + - echo "meson dist --allow-dirty" | flatpak-builder --disable-rofiles-fuse --build-shell=${FLATPAK_MODULE} flatpak_app ${MANIFEST_PATH} + - mv .flatpak-builder/build/${FLATPAK_MODULE}/_flatpak_build/meson-dist tarball + + # Upload tarball + - | + curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file tarball/${RELEASE_TARBALL} "${PACKAGE_REGISTRY_URL}/${RELEASE_TARBALL}" + - | + curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file tarball/${RELEASE_TARBALL_SHA} "${PACKAGE_REGISTRY_URL}/${RELEASE_TARBALL_SHA}" + + # Extract release notes from appstream + # FIXME: Appstream requires the files name to be `*.metainfo.xml` + - cp data/${APP_ID}.metainfo.xml.in.in data/${APP_ID}.metainfo.xml + - appstream-util appdata-to-news "data/${APP_ID}.metainfo.xml" | + awk '{ x[NR] = $0 } END { for ( i=5 ; i<=NR ; i++ ) { if (x[i] ~ /^$/ && x[i+1] ~ /^Version/ && x[i+2] ~ /^=/ && x[i+3] ~ /^Release/) exit; else print x[i]; }}' > + release_notes.txt + dependencies: [] + artifacts: + paths: + - tarball + - release_notes.txt + +# https://gitlab.com/gitlab-org/gitlab/-/issues/271534 The default URL needs authentication right now, which is less than optimal... +# Get the package_files ID instead and use that as download URL in the "release" step. +release: + stage: deploy + image: registry.gitlab.com/gitlab-org/release-cli:latest + script: + - apk add curl jq + - | + export PACKAGE_ID=$(curl "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages?sort=desc" | jq -c .[0].id) + - | + export RELEASE_TARBALL_DOWNLOAD_ID=$(curl "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/${PACKAGE_ID}/package_files" | jq -c .[0].id) + export RELEASE_TARBALL_SHA_DOWNLOAD_ID=$(curl "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/${PACKAGE_ID}/package_files" | jq -c .[1].id) + + - export RELEASE_TARBALL_URL="${CI_PROJECT_URL}/-/package_files/$RELEASE_TARBALL_DOWNLOAD_ID/download" + - export RELEASE_TARBALL_SHA_URL="${CI_PROJECT_URL}/-/package_files/$RELEASE_TARBALL_SHA_DOWNLOAD_ID/download" + - cat release_notes.txt + - | + release-cli create --name "Release $CI_COMMIT_TAG" --tag-name $CI_COMMIT_TAG \ + --assets-link "{\"name\":\"Tarball for ${CI_COMMIT_TAG}\",\"url\":\"${RELEASE_TARBALL_URL}\", \"filepath\": \"/tarball/${RELEASE_TARBALL}\"}" \ + --assets-link "{\"name\":\"Checksum for ${CI_COMMIT_TAG}\",\"url\":\"${RELEASE_TARBALL_SHA_URL}\", \"filepath\": \"/tarball/${RELEASE_TARBALL_SHA}\"}" \ + --description release_notes.txt + needs: ['release-tarball'] diff --git a/.gitlab-ci/publish_docs.yml b/.gitlab-ci/publish_docs.yml new file mode 100644 index 00000000..bd0ad23e --- /dev/null +++ b/.gitlab-ci/publish_docs.yml @@ -0,0 +1,18 @@ +# Build and publish the docs + +pages: + stage: deploy + image: 'quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master' + tags: + - flatpak + script: + - flatpak install --user --noninteractive org.freedesktop.Sdk.Extension.rust-nightly//23.08 + - sed -i 's|rust-stable|rust-nightly|g' ${MANIFEST_PATH} + - flatpak-builder --keep-build-dirs --user --disable-rofiles-fuse --stop-at=${FLATPAK_MODULE} flatpak_app --repo=repo ${BRANCH:+--default-branch=$BRANCH} ${MANIFEST_PATH} + - echo "ninja src/doc" | flatpak-builder --disable-rofiles-fuse --build-shell=${FLATPAK_MODULE} flatpak_app ${MANIFEST_PATH} + - mv .flatpak-builder/build/${FLATPAK_MODULE}/_flatpak_build/src/doc public + - chmod -R a=rwx public + dependencies: [] + artifacts: + paths: + - 'public' diff --git a/.gitlab-ci/publish_nightly.yml b/.gitlab-ci/publish_nightly.yml new file mode 100644 index 00000000..5d0ea5c2 --- /dev/null +++ b/.gitlab-ci/publish_nightly.yml @@ -0,0 +1,11 @@ +# Publish the nightly (Devel) version + +include: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/master/flatpak/flatpak_ci_initiative.yml' + +publish_nightly@x86_64: + extends: .publish_nightly + needs: ['build@x86_64'] + +publish_nightly@aarch64: + extends: .publish_nightly + needs: ['build@aarch64'] diff --git a/.gitlab-ci/run_checks.yml b/.gitlab-ci/run_checks.yml new file mode 100644 index 00000000..488a4c7a --- /dev/null +++ b/.gitlab-ci/run_checks.yml @@ -0,0 +1,18 @@ +# Configure and run code checks + +# Custom checks and lints +checks: + stage: check + image: "rustlang/rust:nightly-slim" + script: + - scripts/checks.sh --verbose --force-install + +# Lint the code +cargo-clippy: + stage: check + image: 'quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master' + tags: + - flatpak + script: + - flatpak-builder --keep-build-dirs --user --disable-rofiles-fuse --stop-at=${FLATPAK_MODULE} flatpak_app --repo=repo ${BRANCH:+--default-branch=$BRANCH} ${MANIFEST_PATH} + - echo "cargo clippy -- -D warnings" | flatpak-builder --disable-rofiles-fuse --build-shell=${FLATPAK_MODULE} flatpak_app ${MANIFEST_PATH}