From cfeb38cb5151fe4586289d6d5868955e3848596a Mon Sep 17 00:00:00 2001 From: James Magahern Date: Sun, 12 Apr 2026 17:18:48 -0700 Subject: [PATCH] [gtk] gtk build workflow --- .gitea/workflows/gtk-rpm-release.yaml | 178 ++++++++++++++++++++++++++ gtk/Makefile | 16 ++- gtk/dist/rpm/kordophone.spec | 2 +- 3 files changed, 190 insertions(+), 6 deletions(-) create mode 100644 .gitea/workflows/gtk-rpm-release.yaml diff --git a/.gitea/workflows/gtk-rpm-release.yaml b/.gitea/workflows/gtk-rpm-release.yaml new file mode 100644 index 0000000..93df1cb --- /dev/null +++ b/.gitea/workflows/gtk-rpm-release.yaml @@ -0,0 +1,178 @@ +name: GTK RPM Release + +on: + push: + tags: + - 'release/gtk/*' + +permissions: + code: read + releases: write + packages: write + +jobs: + build-gtk-rpm-release: + runs-on: ubuntu-latest + container: + image: fedora:40 + + steps: + # The default Gitea runner image is Debian-based. Build the GTK RPM in a + # Fedora container so rpmbuild and the RPM build dependencies match the + # existing local packaging environment. + - name: Install system dependencies + run: | + set -eu + dnf install -y \ + ca-certificates \ + curl \ + gcc \ + git \ + ImageMagick \ + libadwaita-devel \ + libgee-devel \ + libsecret-devel \ + make \ + meson \ + ninja-build \ + nodejs \ + pkgconfig \ + python3 \ + redhat-rpm-config \ + rpm-build \ + rpmdevtools \ + gtk4-devel \ + glib2-devel \ + vala + dnf clean all + rpmdev-setuptree + + - name: Check out repository code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Build GTK RPMs + working-directory: gtk + run: make rpm + + - name: Prepare release assets + env: + RELEASE_TAG: ${{ github.ref_name }} + RPM_PACKAGE_GROUP: ${{ vars.RPM_PACKAGE_GROUP }} + run: | + set -eu + + version="${RELEASE_TAG#release/gtk/}" + if [ -z "$version" ] || [ "$version" = "$RELEASE_TAG" ]; then + echo "Expected tag in the form release/gtk/{version}, got: $RELEASE_TAG" >&2 + exit 1 + fi + + assets_dir="${{ gitea.workspace }}/release-assets/gtk" + rpmbuild_dir="${HOME}/rpmbuild" + + rm -rf "$assets_dir" + mkdir -p "$assets_dir" + + if [ -d "$rpmbuild_dir/RPMS" ]; then + find "$rpmbuild_dir/RPMS" -type f -name "kordophone-${version}-*.rpm" \ + ! -name '*-debuginfo-*' \ + ! -name '*-debugsource-*' \ + -exec cp '{}' "$assets_dir/" ';' + fi + + if [ -d "$rpmbuild_dir/SRPMS" ]; then + find "$rpmbuild_dir/SRPMS" -type f -name "kordophone-${version}-*.src.rpm" \ + -exec cp '{}' "$assets_dir/" ';' + fi + + if ! find "$assets_dir" -maxdepth 1 -type f -name '*.rpm' | grep -q .; then + echo "No RPM artifacts were produced." >&2 + exit 1 + fi + + { + printf 'RELEASE_VERSION=%s\n' "$version" + printf 'RELEASE_ASSETS_DIR=%s\n' "$assets_dir" + printf 'RPM_PACKAGE_GROUP=%s\n' "${RPM_PACKAGE_GROUP:-}" + } >> "$GITHUB_ENV" + + - name: Upload RPMs to Gitea package registry + env: + GITEA_SERVER_URL: ${{ gitea.server_url }} + GITEA_REPOSITORY: ${{ gitea.repository }} + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + RPM_PACKAGE_GROUP: ${{ env.RPM_PACKAGE_GROUP }} + RPM_PACKAGE_TOKEN: ${{ secrets.RPM_PACKAGE_TOKEN }} + RELEASE_ASSETS_DIR: ${{ env.RELEASE_ASSETS_DIR }} + run: | + set -eu + + owner="${GITEA_REPOSITORY%%/*}" + token="${RPM_PACKAGE_TOKEN:-${GITEA_TOKEN:-}}" + group="${RPM_PACKAGE_GROUP:-}" + + if [ -z "$owner" ] || [ "$owner" = "$GITEA_REPOSITORY" ]; then + echo "Could not determine package owner from repository: $GITEA_REPOSITORY" >&2 + exit 1 + fi + + if [ -z "$token" ]; then + echo "Missing upload token. Set RPM_PACKAGE_TOKEN or ensure secrets.GITEA_TOKEN is available." >&2 + exit 1 + fi + + upload_url="${GITEA_SERVER_URL%/}/api/packages/${owner}/rpm" + if [ -n "$group" ]; then + upload_url="${upload_url}/${group}" + fi + upload_url="${upload_url}/upload" + + found_rpm=0 + for rpm in "$RELEASE_ASSETS_DIR"/*.rpm; do + if [ ! -e "$rpm" ] || [ "${rpm##*.}" != "rpm" ]; then + continue + fi + case "$rpm" in + *.src.rpm) + continue + ;; + esac + + found_rpm=1 + http_code="$(curl --silent --show-error \ + --write-out '%{http_code}' \ + --output /tmp/package-upload-response \ + --header "Authorization: token ${token}" \ + --upload-file "$rpm" \ + "$upload_url")" + + case "$http_code" in + 201) + echo "Uploaded $(basename "$rpm") to the RPM package registry." + ;; + 409) + echo "Package already exists for $(basename "$rpm"); skipping duplicate upload." + ;; + *) + echo "Failed to upload $(basename "$rpm") to $upload_url (HTTP $http_code)." >&2 + cat /tmp/package-upload-response >&2 || true + exit 1 + ;; + esac + done + + if [ "$found_rpm" -ne 1 ]; then + echo "No binary RPM artifacts were found to upload." >&2 + exit 1 + fi + + - name: Create Gitea release + uses: https://gitea.com/actions/gitea-release-action@v1 + with: + name: Kordophone GTK ${{ env.RELEASE_VERSION }} + tag_name: ${{ github.ref_name }} + target_commitish: ${{ github.sha }} + files: | + ${{ env.RELEASE_ASSETS_DIR }}/*.rpm diff --git a/gtk/Makefile b/gtk/Makefile index 0b82995..4b498a8 100644 --- a/gtk/Makefile +++ b/gtk/Makefile @@ -5,14 +5,20 @@ all: setup setup: build/ meson build -VER_RAW := $(shell git -C .. describe --tags --abbrev=0 2>/dev/null || git -C .. describe --tags 2>/dev/null || printf '0.0.0') -VER := $(patsubst v%,%,$(VER_RAW)) +VER_RAW := $(shell git -C .. describe --tags --match 'release/gtk/*' --abbrev=0 2>/dev/null || true) +VER := $(patsubst release/gtk/%,%,$(VER_RAW)) TMP := $(shell mktemp -d) -rpm: - git -C .. archive --format=tar.gz --prefix=kordophone/ -o $(TMP)/v$(VER).tar.gz HEAD +RPM_SOURCE := $(TMP)/$(VER).tar.gz +.PHONY: check-version +check-version: + @test -n "$(VER_RAW)" || { echo "Could not determine GTK release version from git tags." >&2; echo "Expected a tag reachable from HEAD matching release/gtk/." >&2; exit 1; } + @test "$(VER)" != "$(VER_RAW)" || { echo "Invalid GTK release tag: $(VER_RAW)" >&2; echo "Expected format: release/gtk/." >&2; exit 1; } + +rpm: check-version + git -C .. archive --format=tar.gz --prefix=kordophone/ -o $(RPM_SOURCE) HEAD rpmbuild -ba dist/rpm/kordophone.spec --define "_sourcedir $(TMP)" --define "app_version $(VER)" -deb: +deb: check-version ./dist/deb/build-deb.sh $(VER) .PHONY: flatpak diff --git a/gtk/dist/rpm/kordophone.spec b/gtk/dist/rpm/kordophone.spec index e1e39ea..44c548d 100644 --- a/gtk/dist/rpm/kordophone.spec +++ b/gtk/dist/rpm/kordophone.spec @@ -5,7 +5,7 @@ Summary: GTK4/Libadwaita client for Kordophone License: GPL URL: https://code.buzzert.dev/buzzert/Kordophone -Source0: %{url}/archive/v%{version}.tar.gz +Source0: %{url}/archive/release/gtk/%{version}.tar.gz BuildRequires: meson >= 0.56.0 BuildRequires: vala