feat: add OS package repository publishing - #2611
Conversation
Preview DeploymentPreview deployments for this PR are available at:
The preview environment will start automatically on first visit. Subsequent pushes to this PR will update the Run locally with Dockerdocker pull ghcr.io/go-vikunja/vikunja:pr-2611
docker run -p 3456:3456 ghcr.io/go-vikunja/vikunja:pr-2611Last updated for commit 1cde0a1 |
| Label: Vikunja | ||
| Codename: buster | ||
| Architectures: amd64 | ||
| Codename: stable |
There was a problem hiding this comment.
The publish-repos job has if: github.ref_type == 'tag' so only tagged releases publish to the repo. Unstable/dev builds don't touch it. Do you want a separate unstable suite added for non-tag builds?
There was a problem hiding this comment.
Implemented in d361ed6 — all repo targets now support stable/unstable suites via REPO_SUITE env var. The CI sets it automatically based on ref type (tag → stable, otherwise → unstable). Users switch suites by changing one word in their repo config.
Add four new Release namespace targets: - release:repo-apt — generates APT repo metadata using reprepro - release:repo-rpm — generates RPM repo metadata via createrepo_c - release:repo-apk — generates Alpine APK index via apk index + abuild-sign - release:repo-pacman — generates Pacman database via repo-add All targets read REPO_SUITE env var (stable/unstable, default stable) to support publishing to different repository suites.
New CI job runs after os-package and desktop jobs complete. Downloads all package artifacts, runs Mage repo targets to generate repository metadata (APT, RPM, APK, Pacman), GPG-signs the metadata, and uploads to R2 under /repos/. Publishes to stable suite for tagged releases, unstable for main branch builds. Artifact uploads from os-package and desktop jobs are no longer gated on tags to support this.
…stable suites Update codename from buster to stable, add arm64 and armhf architectures, pin GPG signing key, and add unstable distribution for non-release builds.
d361ed6 to
306604f
Compare
Add proper repository metadata generation so users can install Vikunja via native package managers (
apt install vikunja,dnf install vikunja,apk add vikunja,pacman -S vikunja) by adding dl.vikunja.io as a package source.What this adds:
release:repo-apt,release:repo-rpm,release:repo-apk,release:repo-pacman) that generate signed repository metadata using standard tools (dpkg-scanpackages, createrepo_c, apk index, repo-add)publish-reposCI job that runs afteros-packageanddesktopjobs on tagged releases, generates metadata for all four formats across all architectures, and uploads to R2 under/repos/reprepro-dist-conffor multi-arch (amd64, arm64, armhf) withstablecodenamePackage files are not re-uploaded — the dl.vikunja.io Worker redirects package requests under
/repos/to existing artifact locations.Setup required before first use
1. GPG signing (APT, RPM, Pacman)
The existing
RELEASE_GPG_SIGN_KEYandRELEASE_GPG_PASSPHRASEsecrets are reused. The GPG key ID7D061A4AA61436B40713D42EFF054DACD908493Ais hardcoded in the workflow for the--default-keyand public key export steps. No new secrets needed for GPG.2. APK signing key (Alpine)
Alpine uses RSA keys, not GPG. Two things are needed:
Generate the key pair (one-time):
Add the private key as a GitHub secret:
APK_SIGNING_KEYvikunja-apk.rsaUpload the public key to R2:
/repos/apk/vikunja-apk.rsa.pubvikunja-apk.rsa.pubThis public key is what Alpine users download to verify packages.
3. Existing secrets used
The job reuses these existing secrets (no changes needed):
RELEASE_GPG_SIGN_KEY— GPG private key (armor-encoded)RELEASE_GPG_PASSPHRASE— GPG key passphraseS3_ACCESS_KEY,S3_SECRET_KEY,S3_ENDPOINT,S3_BUCKET,S3_REGION— R2 upload credentials4. Worker redirect
The dl.vikunja.io Cloudflare Worker must redirect package file requests under
/repos/to existing artifact locations:/repos/*/vikunja-<ver>-<arch>.<ext>→/vikunja/<version>/<filename>/repos/*/Vikunja Desktop-<ver>.<ext>→/desktop/<version>/<filename>