diff --git a/snap/part-gitea-build.sh b/snap/part-gitea-build.sh new file mode 100755 index 00000000000..8388c16e06e --- /dev/null +++ b/snap/part-gitea-build.sh @@ -0,0 +1,21 @@ +#!/bin/sh +set -e + +if [ ! -f go.mod -o ! -d snap ]; then + echo "This script should be run from the root of the gitea repository" + exit 1 +fi + +if [ -z "$SNAPCRAFT_PART_INSTALL" ]; then + SNAPCRAFT_PART_INSTALL="./dist/snap" + echo "* using mock install path: $SNAPCRAFT_PART_INSTALL" +fi + +command -v pnpm >/dev/null 2>&1 || npm install -g pnpm + +# build tags for 1.26: "bindata sqlite sqlite_unlock_notify pam cert" +# for 1.27: sqlite is not needed, "cert" seems doing nothing +TAGS="bindata pam" make build + +install -D gitea "${SNAPCRAFT_PART_INSTALL}/gitea" +cp -r options "${SNAPCRAFT_PART_INSTALL}/" diff --git a/snap/part-gitea-pull.sh b/snap/part-gitea-pull.sh new file mode 100755 index 00000000000..0d117bb4d1d --- /dev/null +++ b/snap/part-gitea-pull.sh @@ -0,0 +1,62 @@ +#!/bin/sh +set -e + +if [ ! -f go.mod -o ! -d snap ]; then + echo "This script should be run from the root of the gitea repository" + exit 1 +fi + +if [ -z "$SNAPCRAFT_PROJECT_NAME" ]; then + echo "No snapcraft build env, continue with mocking ...." + craftctl() { echo "* mocking craftctl: $*"; } + snap() { echo "* mocking snap: $*"; } +else + echo "Add working directory to git safe.directory ..." + git config --global --add safe.directory "$PWD" +fi + +# How it works: +# * snapcraft.io checks out the default branch (e.g.: main during 1.27 dev period) +# * "override-pull" step gets the latest tag by date (e.g.: v1.26.1) +# * use "snap info gitea" to get the latest released tag +# * if the latest tag is not released to stable, checkout that tag and build it for "stable" +# * otherwise, build the main branch for "devel" +# * "override-build" step uses build script from the checked out commit to build +# This approach highly depends on the "main" branch's push. + +# To debug the logic: +# * last_committed_tag=v1.26.1 last_released_tag=v1.26.0 ./snap/part-gitea-pull.sh +# it will checkout tag v1.26.1, and build that for "stable" +# * last_committed_tag=v1.26.1 last_released_tag=v1.26.1 recent_tag=v1.27.0-dev-205 ./snap/part-gitea-pull.sh +# it will still use the current branch, and build it for "devel" + +[ -z "$last_committed_tag" ] && last_committed_tag="$(git for-each-ref --sort=taggerdate --format '%(tag)' refs/tags | tail -n 1)" +[ -z "$last_released_tag" ] && last_released_tag="$(snap info gitea | awk '$1 == "latest/candidate:" { print $2 }')" + +if [ "${last_committed_tag}" != "${last_released_tag}" ]; then + # if the latest tag has not been released to stable, build that tag instead of default branch. + echo "Build last committed tag ${last_committed_tag} for new release, fetching and checking out ..." + git fetch --quiet + git checkout --quiet "${last_committed_tag}" + # HINT: after this, the "build" step will use that commit's "part-gitea-build.sh", but not this one's +else + echo "Build current branch $(git branch --show-current) @ $(git rev-parse HEAD)" +fi + +# possible tag names: +# * v1.27.0-dev-205-gce089f498b +# * v1.26.1 +# * v1.22.0-rc1-2816-gce089f498b +# then normalize it to semver format: v1.2.3+dev.205.gce089f498b +[ -z "$recent_tag" ] && recent_tag="$(git describe --always --tags)" +echo "Use recent tag $recent_tag to determine version and grade" + +version_main="$(echo "$recent_tag" | cut -d'-' -f1)" +version_ext="$(echo "$recent_tag" | cut -d'-' -s -f2- | sed -e 'y/-/./')" +[ -n "$version_ext" ] && grade=devel || grade=stable + +version="${version_main}" +[ -n "$version_ext" ] && version="${version}+${version_ext}" + +craftctl set version="$version" +craftctl set grade="$grade" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 6996a91d9e5..2147dd78dda 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -2,9 +2,9 @@ name: gitea summary: Gitea - A painless self-hosted Git service description: | The goal of this project is to make the easiest, fastest, and most painless - way of setting up a self-hosted Git service. With Go, this can be done with - an independent binary distribution across ALL platforms that Go supports, - including Linux, Mac OS X, Windows and ARM. + way of setting up a self-hosted Git service with GitHub-like experiences, + including issue tracking, code review, project management, wikis, packages registry, + GitHub Actions and more. icon: public/assets/img/logo.png confinement: strict @@ -53,31 +53,8 @@ parts: build-snaps: [ go/1.26/stable, node/24/stable ] build-environment: - LDFLAGS: "" - override-pull: | - craftctl default - - git config --global --add safe.directory /root/parts/gitea/src - last_committed_tag="$(git for-each-ref --sort=taggerdate --format '%(tag)' refs/tags | tail -n 1)" - last_released_tag="$(snap info gitea | awk '$1 == "latest/candidate:" { print $2 }')" - # If the latest tag from the upstream project has not been released to - # stable, build that tag instead of master. - if [ "${last_committed_tag}" != "${last_released_tag}" ]; then - git fetch - git checkout "${last_committed_tag}" - fi - - version="$(git describe --always | sed -e 's/-/+git/;y/-/./')" - [ -n "$(echo $version | grep "+git")" ] && grade=devel || grade=stable - craftctl set version="$version" - craftctl set grade="$grade" - - override-build: | - set -x - npm install -g pnpm - TAGS="bindata pam cert" make build - install -D gitea "${SNAPCRAFT_PART_INSTALL}/gitea" - cp -r options "${SNAPCRAFT_PART_INSTALL}/" - + override-pull: craftctl default && ./snap/part-gitea-pull.sh + override-build: ./snap/part-gitea-build.sh prime: - -etc - -usr/lib/systemd