diff --git a/README.md b/README.md index fc09227..aeaa095 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ https://code.factoring.digital/api/packages/public/alpine/v3.24/alpine-packages - [SeaweedFS](packaging/alpine/local/seaweedfs/README.md): `seaweedfs` - [GreptimeDB](packaging/alpine/local/greptimedb/README.md): `greptimedb` - [LavinMQ](packaging/alpine/local/lavinmq/README.md): `lavinmq` +- [Gitea](packaging/alpine/local/gitea/README.md): `gitea` ## Use In Production @@ -55,6 +56,7 @@ Currently packaged: seaweedfs SeaweedFS 4.31 release binary and OpenRC role splits greptimedb GreptimeDB 1.1.2 built from source for x86_64 lavinmq LavinMQ 2.9.1 built from source for x86_64 +gitea Gitea 1.26.4 release binary and OpenRC service ``` Local build output is written under: @@ -114,6 +116,8 @@ ALPINE_PACKAGE=greptimedb mise run apk:build ALPINE_PACKAGE=greptimedb SKIP_BUILD=1 mise run apk:test-install ALPINE_PACKAGE=lavinmq mise run apk:build ALPINE_PACKAGE=lavinmq SKIP_BUILD=1 mise run apk:test-install +ALPINE_PACKAGE=gitea mise run apk:build +ALPINE_PACKAGE=gitea SKIP_BUILD=1 mise run apk:test-install ``` Override Docker cache scope: diff --git a/packaging/alpine/local/gitea/APKBUILD b/packaging/alpine/local/gitea/APKBUILD new file mode 100644 index 0000000..e2a254f --- /dev/null +++ b/packaging/alpine/local/gitea/APKBUILD @@ -0,0 +1,77 @@ +# Maintainer: Joachim Schlöffel +pkgname=gitea +pkgver=1.26.4 +pkgrel=0 +pkgdesc="Self-hosted Git service written in Go" +url="https://about.gitea.com/" +arch="x86_64 aarch64" +license="MIT" +depends="git git-lfs gnupg" +makedepends="tar xz" +provides="cmd:gitea=$pkgver-r$pkgrel" +install="$pkgname.pre-install" +pkgusers="gitea" +pkggroups="www-data" +subpackages=" + $pkgname-doc + $pkgname-openrc:_openrc:noarch + " +options="!check !strip !tracedeps" + +case "$CARCH" in + x86_64) + _archive="$pkgname-$pkgver-linux-amd64.xz" + ;; + aarch64) + _archive="$pkgname-$pkgver-linux-arm64.xz" + ;; +esac + +source=" + $pkgname-$pkgver-linux-amd64.xz::https://github.com/go-gitea/gitea/releases/download/v$pkgver/gitea-$pkgver-linux-amd64.xz + $pkgname-$pkgver-linux-arm64.xz::https://github.com/go-gitea/gitea/releases/download/v$pkgver/gitea-$pkgver-linux-arm64.xz + $pkgname-src-$pkgver.tar.gz::https://github.com/go-gitea/gitea/releases/download/v$pkgver/gitea-src-$pkgver.tar.gz + gitea.ini + gitea.initd + " +builddir="$srcdir/gitea-src-$pkgver" + +prepare() { + default_prepare + xz -dc "$srcdir/$_archive" > "$srcdir"/gitea + chmod 0755 "$srcdir"/gitea +} + +package() { + local _dir + for _dir in gitea gitea/git gitea/data gitea/db gitea/custom; do + install -d -m 0750 -o gitea -g www-data \ + "$pkgdir"/var/lib/$_dir + done + + install -d -m 0755 -o gitea -g www-data "$pkgdir"/var/log/gitea + install -Dm755 "$srcdir"/gitea "$pkgdir"/usr/bin/gitea + install -Dm644 -o gitea -g www-data "$srcdir"/gitea.ini \ + "$pkgdir"/etc/gitea/app.ini + chown gitea:www-data "$pkgdir"/etc/gitea + + install -d -m 0755 "$pkgdir"/usr/share/webapps/gitea + cp -r "$builddir"/options "$builddir"/public "$builddir"/templates \ + "$pkgdir"/usr/share/webapps/gitea/ + install -Dm644 "$builddir"/LICENSE -t "$pkgdir"/usr/share/licenses/gitea/ +} + +_openrc() { + pkgdesc="$pkgdesc (OpenRC service)" + depends="$pkgname=$pkgver-r$pkgrel openrc" + + install -Dm755 "$srcdir"/gitea.initd "$subpkgdir"/etc/init.d/gitea +} + +sha512sums=" +fa4d6a388f22f1f20e99a7a73143b5541aacaf2f60f9bf8b47cdb5c9cb192a16b0a1a2f8dd1fe9710817edf6ce5ea6fea4ef4acdb8e363fe9f25c53f6e682962 gitea-1.26.4-linux-amd64.xz +f17868d979ca1ec37f7793d6286789a788abc674e06265011938cfa5b6bf6c1c259af2633fbf8d6371221240c4e3987b7f55ba50b893da74b77ce33265464c92 gitea-1.26.4-linux-arm64.xz +9298d2d6eaf03d708a869e8fe5b2cbdcede3fc5e3ae640d3f43a27b7c9a3e10b353ae6135bfb634360679b5793a759c9ae9c7531cde331b11ae81c03b4904ddb gitea-src-1.26.4.tar.gz +431184faffa8996873d92d7b0d16bc4b1a0178d264cd2928d1f49b13ad3e6470d9ede7a18c12112deeeb38f0647ccc0b012e98bcbd96e7b8496a3dc18f5b1fb7 gitea.ini +9474d707df8b049c93ec4642f71195adff699e1e812f315cac4295b3ab29eeb9ba8b83bf3307c50b04e072a4a9dc4c4f84ac490ee22291bd50015009795c1598 gitea.initd +" diff --git a/packaging/alpine/local/gitea/README.md b/packaging/alpine/local/gitea/README.md new file mode 100644 index 0000000..94c1d86 --- /dev/null +++ b/packaging/alpine/local/gitea/README.md @@ -0,0 +1,38 @@ +# Gitea Alpine Package + +Repackages upstream Gitea 1.26.4 Linux release binaries for `x86_64` and +`aarch64`. + +The package follows Alpine's Gitea runtime layout: + +- `/usr/bin/gitea` +- `/etc/gitea/app.ini` +- `/var/lib/gitea` +- `/var/log/gitea` +- `/usr/share/webapps/gitea` + +Install the OpenRC service with: + +```sh +apk add gitea gitea-openrc +rc-update add gitea default +rc-service gitea start +``` + +Refresh checksums: + +```sh +ALPINE_PACKAGE=gitea mise run apk:checksum +``` + +Build: + +```sh +ALPINE_PACKAGE=gitea mise run apk:build +``` + +Install-test local build: + +```sh +ALPINE_PACKAGE=gitea SKIP_BUILD=1 mise run apk:test-install +``` diff --git a/packaging/alpine/local/gitea/gitea.ini b/packaging/alpine/local/gitea/gitea.ini new file mode 100644 index 0000000..308c4f3 --- /dev/null +++ b/packaging/alpine/local/gitea/gitea.ini @@ -0,0 +1,26 @@ +# Configuration cheat sheet: https://docs.gitea.io/en-us/config-cheat-sheet/ + +RUN_USER = gitea +RUN_MODE = prod + +[repository] +ROOT = /var/lib/gitea/git +SCRIPT_TYPE = sh + +[server] +STATIC_ROOT_PATH = /usr/share/webapps/gitea +APP_DATA_PATH = /var/lib/gitea/data +LFS_START_SERVER = true + +[database] +DB_TYPE = sqlite3 +PATH = /var/lib/gitea/db/gitea.db +SSL_MODE = disable + +[session] +PROVIDER = file + +[log] +ROOT_PATH = /var/log/gitea +MODE = file +LEVEL = Info diff --git a/packaging/alpine/local/gitea/gitea.initd b/packaging/alpine/local/gitea/gitea.initd new file mode 100755 index 0000000..ad328fb --- /dev/null +++ b/packaging/alpine/local/gitea/gitea.initd @@ -0,0 +1,30 @@ +#!/sbin/openrc-run + +supervisor=supervise-daemon +name=gitea +command="/usr/bin/gitea" +command_user="${GITEA_USER:-gitea}" +command_args="web --config '${GITEA_CONF:-/etc/gitea/app.ini}'" +supervise_daemon_args="--env GITEA_WORK_DIR='${GITEA_WORK_DIR:-/var/lib/gitea}' --chdir '${GITEA_WORK_DIR:-/var/lib/gitea}' --stdout '${GITEA_LOG_FILE:-/var/log/gitea/http.log}' --stderr '${GITEA_LOG_FILE:-/var/log/gitea/http.log}'" +pidfile="/run/gitea.pid" +extra_started_commands="reopen_log" +capabilities="^cap_net_bind_service" + +depend() { + use logger dns + need net + after firewall mysql postgresql +} + +# https://github.com/go-gitea/gitea/issues/17976 +# reload() { +# ebegin "Reloading ${RC_SVCNAME}" +# ${supervisor} ${RC_SVCNAME} --signal HUP --pidfile "${pidfile}" +# eend $? +# } + +reopen_log() { + ebegin "Reopening logfile for ${RC_SVCNAME}" + ${supervisor} ${RC_SVCNAME} --signal USR1 --pidfile "${pidfile}" + eend $? +} diff --git a/packaging/alpine/local/gitea/gitea.pre-install b/packaging/alpine/local/gitea/gitea.pre-install new file mode 100755 index 0000000..88077ed --- /dev/null +++ b/packaging/alpine/local/gitea/gitea.pre-install @@ -0,0 +1,7 @@ +#!/bin/sh + +addgroup -S www-data 2>/dev/null +adduser -S -D -H -h /var/lib/gitea -s /sbin/nologin \ + -G www-data -g gitea gitea 2>/dev/null + +exit 0 diff --git a/packaging/alpine/local/gitea/scripts/runtime-test.sh b/packaging/alpine/local/gitea/scripts/runtime-test.sh new file mode 100755 index 0000000..6b4e286 --- /dev/null +++ b/packaging/alpine/local/gitea/scripts/runtime-test.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +set -euo pipefail + +apk add gitea gitea-doc gitea-openrc + +test -x /usr/bin/gitea +test -f /etc/gitea/app.ini +test -d /var/lib/gitea +test -d /var/lib/gitea/git +test -d /var/lib/gitea/data +test -d /var/lib/gitea/db +test -d /var/log/gitea +test -d /usr/share/webapps/gitea/options +test -d /usr/share/webapps/gitea/public +test -d /usr/share/webapps/gitea/templates +test -f /etc/init.d/gitea + +gitea --version + +rc-update add gitea default || true +test -L /etc/runlevels/default/gitea diff --git a/packaging/alpine/local/gitea/scripts/test-install.sh b/packaging/alpine/local/gitea/scripts/test-install.sh new file mode 100755 index 0000000..bc9fbdb --- /dev/null +++ b/packaging/alpine/local/gitea/scripts/test-install.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../../.." && pwd)}" +package_name="${PACKAGE_NAME:-gitea}" +package_version="${PACKAGE_VERSION:-1.26.4-r0}" +alpine_version="${ALPINE_VERSION:-3.24}" +arch="${ALPINE_ARCH:-x86_64}" +repository_url="${ALPINE_REPOSITORY_URL:-}" +repository_key_url="${ALPINE_REPOSITORY_KEY_URL:-}" + +case "${arch}" in + x86_64) + platform="${ALPINE_TEST_PLATFORM:-linux/amd64}" + ;; + aarch64) + platform="${ALPINE_TEST_PLATFORM:-linux/arm64}" + ;; + *) + printf 'unsupported Alpine architecture: %s\n' "${arch}" >&2 + exit 2 + ;; +esac + +if [[ -z "${repository_url}" && "${SKIP_BUILD:-0}" != "1" ]]; then + ALPINE_PACKAGE="${package_name}" "${repo_root}/scripts/apk/build.sh" build "${arch}" +fi + +if [[ -z "${repository_url}" && ! -d "${repo_root}/packages/local/${arch}" ]]; then + printf 'missing local repository: packages/local/%s\n' "${arch}" >&2 + printf 'run: ALPINE_PACKAGE=%s mise run apk:build\n' "${package_name}" >&2 + exit 1 +fi + +docker run --rm --platform "${platform}" \ + -e "ALPINE_ARCH=${arch}" \ + -e "PACKAGE_NAME=${package_name}" \ + -e "PACKAGE_VERSION=${package_version}" \ + -e "ALPINE_REPOSITORY_URL=${repository_url}" \ + -e "ALPINE_REPOSITORY_KEY_URL=${repository_key_url}" \ + -v "${repo_root}/packages/local:/repo:ro" \ + "alpine:${alpine_version}" \ + sh -lc ' + set -e + + if [ -n "${ALPINE_REPOSITORY_URL}" ]; then + if [ -n "${ALPINE_REPOSITORY_KEY_URL}" ]; then + apk add --no-cache curl >/dev/null + cd /etc/apk/keys + curl -fsSLOJ "${ALPINE_REPOSITORY_KEY_URL}" + fi + printf "%s\n" "${ALPINE_REPOSITORY_URL}" >> /etc/apk/repositories + else + apk update + apk add "${PACKAGE_NAME}" + installed_before="$(apk list -I "${PACKAGE_NAME}" | awk "{print \$1}")" + printf "Installed repository package before local upgrade: %s\n" "${installed_before}" + if [ "${installed_before}" = "${PACKAGE_NAME}-${PACKAGE_VERSION}" ]; then + printf "default repository already has %s; upgrade path was not exercised\n" "${PACKAGE_VERSION}" >&2 + exit 1 + fi + + cp "/repo/${ALPINE_ARCH}"/*.rsa.pub /etc/apk/keys/ + printf "%s\n" /repo >> /etc/apk/repositories + fi + apk update + apk add --upgrade "${PACKAGE_NAME}" "${PACKAGE_NAME}-doc" "${PACKAGE_NAME}-openrc" + installed_after="$(apk list -I "${PACKAGE_NAME}" | awk "{print \$1}")" + printf "Installed package after local upgrade: %s\n" "${installed_after}" + test "${installed_after}" = "${PACKAGE_NAME}-${PACKAGE_VERSION}" + + test -x /usr/bin/gitea + test -f /etc/gitea/app.ini + test -d /var/lib/gitea + test -d /var/lib/gitea/git + test -d /var/lib/gitea/data + test -d /var/lib/gitea/db + test -d /var/log/gitea + test -d /usr/share/webapps/gitea/options + test -d /usr/share/webapps/gitea/public + test -d /usr/share/webapps/gitea/templates + test -f /etc/init.d/gitea + + gitea --version + + rc-update add gitea default + test -L /etc/runlevels/default/gitea + ' diff --git a/scripts/apk/ci-smoke.sh b/scripts/apk/ci-smoke.sh index 63cef12..6591512 100755 --- a/scripts/apk/ci-smoke.sh +++ b/scripts/apk/ci-smoke.sh @@ -4,7 +4,7 @@ set -euo pipefail repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" repo_name="${ALPINE_REPO_NAME:-local}" arch="${ALPINE_ARCH:-$(apk --print-arch)}" -packages="${SMOKE_PACKAGES:-seaweedfs seaweedfs-master-openrc seaweedfs-filer-openrc seaweedfs-worker-openrc greptimedb lavinmq lavinmq-openrc}" +packages="${SMOKE_PACKAGES:-seaweedfs seaweedfs-master-openrc seaweedfs-filer-openrc seaweedfs-worker-openrc greptimedb lavinmq lavinmq-openrc gitea gitea-openrc}" repo_dir="${repo_root}/packages/${repo_name}/${arch}" read -r -a package_list <<< "${packages}" @@ -29,9 +29,17 @@ if command -v lavinmq >/dev/null 2>&1; then lavinmqctl --version lavinmqperf --version fi +if command -v gitea >/dev/null 2>&1; then + gitea --version + test -f /etc/gitea/app.ini + test -d /var/lib/gitea +fi if ls /etc/init.d/seaweedfs.* >/dev/null 2>&1; then find /etc/init.d -maxdepth 1 -name 'seaweedfs.*' -print | sort fi if [[ -f /etc/init.d/lavinmq ]]; then printf '%s\n' /etc/init.d/lavinmq fi +if [[ -f /etc/init.d/gitea ]]; then + printf '%s\n' /etc/init.d/gitea +fi diff --git a/scripts/apk/smoke.sh b/scripts/apk/smoke.sh index d0a0b07..058ae81 100755 --- a/scripts/apk/smoke.sh +++ b/scripts/apk/smoke.sh @@ -5,7 +5,7 @@ repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" alpine_version="${ALPINE_VERSION:-3.24}" platform="${ALPINE_BUILD_PLATFORM:-linux/amd64}" arch="${ALPINE_ARCH:-x86_64}" -packages="${SMOKE_PACKAGES:-seaweedfs seaweedfs-master-openrc seaweedfs-filer-openrc seaweedfs-worker-openrc greptimedb lavinmq lavinmq-openrc}" +packages="${SMOKE_PACKAGES:-seaweedfs seaweedfs-master-openrc seaweedfs-filer-openrc seaweedfs-worker-openrc greptimedb lavinmq lavinmq-openrc gitea gitea-openrc}" if [[ ! -d "${repo_root}/packages/local/${arch}" ]]; then printf 'missing local repository: packages/local/%s\n' "${arch}" >&2 @@ -34,10 +34,18 @@ docker run --rm --platform "${platform}" \ lavinmqctl --version lavinmqperf --version fi + if command -v gitea >/dev/null 2>&1; then + gitea --version + test -f /etc/gitea/app.ini + test -d /var/lib/gitea + fi if ls /etc/init.d/seaweedfs.* >/dev/null 2>&1; then ls -1 /etc/init.d/seaweedfs.* | sort fi if [ -f /etc/init.d/lavinmq ]; then ls -1 /etc/init.d/lavinmq fi + if [ -f /etc/init.d/gitea ]; then + ls -1 /etc/init.d/gitea + fi " diff --git a/scripts/apk/test-shell.sh b/scripts/apk/test-shell.sh index e3f235e..51f9f52 100755 --- a/scripts/apk/test-shell.sh +++ b/scripts/apk/test-shell.sh @@ -5,7 +5,7 @@ repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" alpine_version="${ALPINE_VERSION:-3.24}" platform="${ALPINE_BUILD_PLATFORM:-linux/amd64}" arch="${ALPINE_ARCH:-x86_64}" -packages="${TEST_SHELL_PACKAGES:-seaweedfs seaweedfs-doc bash-completion seaweedfs-master-openrc seaweedfs-filer-openrc seaweedfs-worker-openrc greptimedb lavinmq lavinmq-doc lavinmq-openrc}" +packages="${TEST_SHELL_PACKAGES:-seaweedfs seaweedfs-doc bash-completion seaweedfs-master-openrc seaweedfs-filer-openrc seaweedfs-worker-openrc greptimedb lavinmq lavinmq-doc lavinmq-openrc gitea gitea-doc gitea-openrc}" shell="${TEST_SHELL:-/bin/bash}" timeout_seconds="${TEST_SHELL_TIMEOUT:-120}" @@ -53,6 +53,7 @@ docker run "${docker_args[@]}" \ apk info -e seaweedfs seaweedfs-doc seaweedfs-bash-completion \ seaweedfs-master-openrc seaweedfs-filer-openrc seaweedfs-worker-openrc \ greptimedb lavinmq lavinmq-doc lavinmq-openrc \ + gitea gitea-doc gitea-openrc \ | sort if command -v weed >/dev/null 2>&1; then printf "\nSeaweedFS version:\n" @@ -66,6 +67,10 @@ docker run "${docker_args[@]}" \ printf "\nLavinMQ version:\n" lavinmq -v fi + if command -v gitea >/dev/null 2>&1; then + printf "\nGitea version:\n" + gitea --version + fi printf "\nEntering %s. Repository mounted read-only at /work.\n\n" "${TEST_SHELL}" exec "${TEST_SHELL}" '