From 78f29907ccbb1af0f819aee3cfb32ae3c18d9e3e Mon Sep 17 00:00:00 2001 From: James Magahern Date: Sun, 12 Apr 2026 18:27:05 -0700 Subject: [PATCH] [core] rpm release ci workflow --- .gitea/workflows/core-rpm-release.yaml | 201 +++++++++++++++++++++++++ core/Dockerfile | 3 +- core/kordophoned/Cargo.toml | 2 +- 3 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 .gitea/workflows/core-rpm-release.yaml diff --git a/.gitea/workflows/core-rpm-release.yaml b/.gitea/workflows/core-rpm-release.yaml new file mode 100644 index 0000000..dfb8401 --- /dev/null +++ b/.gitea/workflows/core-rpm-release.yaml @@ -0,0 +1,201 @@ +name: Core RPM Release + +on: + push: + tags: + - 'release/core/*' + +permissions: + code: read + releases: write + packages: write + +env: + RPM_DISTRO_NAME: fedora + RPM_DISTRO_VERSION: '43' + +jobs: + build-core-rpm-release: + runs-on: ubuntu-latest + container: + image: fedora:43 + + steps: + # Build inside Fedora so the RPM package repository grouping matches the + # Fedora release we publish to. + - name: Install system dependencies + run: | + set -eu + dnf install -y \ + ca-certificates \ + curl \ + gcc \ + gcc-c++ \ + git \ + make \ + nodejs \ + openssl-devel \ + pkg-config \ + python3 \ + rpm-build \ + sqlite-devel \ + dbus-devel \ + systemd-devel + dnf clean all + + - name: Install Rust toolchain + run: | + set -eu + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + echo "/root/.cargo/bin" >> "$GITHUB_PATH" + + - name: Install cargo-generate-rpm + run: cargo install cargo-generate-rpm + + - name: Check out repository code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Build Core RPM + working-directory: core + run: make rpm + + - name: Prepare release assets + env: + RELEASE_TAG: ${{ github.ref_name }} + RPM_PACKAGE_GROUP: ${{ vars.RPM_PACKAGE_GROUP }} + RPM_DISTRO_NAME: ${{ env.RPM_DISTRO_NAME }} + RPM_DISTRO_VERSION: ${{ env.RPM_DISTRO_VERSION }} + run: | + set -eu + + version="${RELEASE_TAG#release/core/}" + if [ -z "$version" ] || [ "$version" = "$RELEASE_TAG" ]; then + echo "Expected tag in the form release/core/{version}, got: $RELEASE_TAG" >&2 + exit 1 + fi + + package_version="$(awk -F ' = ' ' + $0 == "[package]" { in_pkg = 1; next } + /^\[/ { in_pkg = 0 } + in_pkg && $1 == "version" { + gsub(/"/, "", $2) + print $2 + exit + } + ' core/kordophoned/Cargo.toml)" + + if [ -z "$package_version" ]; then + echo "Could not determine kordophoned package version from core/kordophoned/Cargo.toml." >&2 + exit 1 + fi + + if [ "$package_version" != "$version" ]; then + echo "Release tag version ($version) does not match kordophoned package version ($package_version)." >&2 + exit 1 + fi + + assets_dir="${{ gitea.workspace }}/release-assets/core" + rpm_dir="${{ gitea.workspace }}/core/target/generate-rpm" + + rm -rf "$assets_dir" + mkdir -p "$assets_dir" + + if [ -d "$rpm_dir" ]; then + find "$rpm_dir" -maxdepth 1 -type f -name "kordophoned-${version}-*.rpm" \ + -exec cp '{}' "$assets_dir/" ';' + fi + + if ! find "$assets_dir" -maxdepth 1 -type f -name '*.rpm' | grep -q .; then + echo "No core RPM artifacts were produced." >&2 + exit 1 + fi + + package_group="${RPM_PACKAGE_GROUP:-${RPM_DISTRO_NAME}/${RPM_DISTRO_VERSION}}" + + { + printf 'RELEASE_VERSION=%s\n' "$version" + printf 'RELEASE_ASSETS_DIR=%s\n' "$assets_dir" + printf 'RPM_PACKAGE_GROUP=%s\n' "$package_group" + } >> "$GITHUB_ENV" + + - name: Upload RPMs to Gitea package registry + env: + GITEA_SERVER_URL: ${{ gitea.server_url }} + GITEA_REPOSITORY_OWNER: ${{ gitea.repository_owner }} + RPM_PACKAGE_GROUP: ${{ env.RPM_PACKAGE_GROUP }} + RPM_PACKAGE_TOKEN: ${{ secrets.RPM_PACKAGE_TOKEN }} + RPM_PACKAGE_USERNAME: ${{ vars.RPM_PACKAGE_USERNAME }} + RELEASE_ASSETS_DIR: ${{ env.RELEASE_ASSETS_DIR }} + run: | + set -eu + + owner="${GITEA_REPOSITORY_OWNER}" + package_user="${RPM_PACKAGE_USERNAME:-${GITEA_REPOSITORY_OWNER}}" + token="${RPM_PACKAGE_TOKEN:-}" + group="${RPM_PACKAGE_GROUP:-}" + + if [ -z "$owner" ]; then + echo "Could not determine package owner from workflow context." >&2 + exit 1 + fi + + if [ -z "$package_user" ]; then + echo "Missing package upload username. Set repository or organization variable RPM_PACKAGE_USERNAME." >&2 + exit 1 + fi + + if [ -z "$token" ]; then + echo "Missing package upload token. Set repository or organization secret RPM_PACKAGE_TOKEN." >&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 + + found_rpm=1 + http_code="$(curl --silent --show-error \ + --write-out '%{http_code}' \ + --output /tmp/package-upload-response \ + --user "${package_user}:${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 core 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: Kordophoned Core ${{ env.RELEASE_VERSION }} + tag_name: ${{ github.ref_name }} + target_commitish: ${{ github.sha }} + files: | + ${{ env.RELEASE_ASSETS_DIR }}/*.rpm diff --git a/core/Dockerfile b/core/Dockerfile index 19840b8..9a76481 100644 --- a/core/Dockerfile +++ b/core/Dockerfile @@ -1,4 +1,4 @@ -FROM fedora:40 +FROM fedora:43 RUN dnf update -y && \ dnf install -y \ @@ -23,4 +23,3 @@ WORKDIR /workspace COPY . . CMD ["make", "rpm"] - diff --git a/core/kordophoned/Cargo.toml b/core/kordophoned/Cargo.toml index e43eb86..26011bd 100644 --- a/core/kordophoned/Cargo.toml +++ b/core/kordophoned/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kordophoned" -version = "1.3.0" +version = "1.3.1" edition = "2021" license = "GPL-3.0" description = "Client daemon for the Kordophone chat protocol"