# Alpine Packages Alpine stable packaging for internal packages. This repository carries selected upstream releases ahead of Alpine community packages when we need newer features, packaging fixes, or service layouts on the current Alpine branch. Packages are either source builds or binary repackages: - Source builds compile upstream source releases inside the Alpine build environment and link against Alpine libraries. - Binary repackages wrap official upstream Linux release artifacts in Alpine package metadata, OpenRC services, config defaults, and role subpackages. ```text https://code.factoring.digital/api/packages/public/alpine/v3.24/alpine-packages ``` ## Available Packages | Package | APK Name | Package Version | Package Type | Purpose | |-----------------------------------------------------------|--------------|-----------------|----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------| | [SeaweedFS](packaging/alpine/local/seaweedfs/README.md) | `seaweedfs` | `4.39` | Binary repackaging of official upstream release tarballs | Ships current SeaweedFS features with Alpine OpenRC role splits. | | [GreptimeDB](packaging/alpine/local/greptimedb/README.md) | `greptimedb` | `1.1.2` | Source build from upstream release | Provides a current GreptimeDB build and component OpenRC packages before it is available from Alpine community. | | [LavinMQ](packaging/alpine/local/lavinmq/README.md) | `lavinmq` | `2.9.1` | Source build from upstream release | Provides a current LavinMQ build on Alpine 3.24 with matching Crystal support. | | [Gitea](packaging/alpine/local/gitea/README.md) | `gitea` | `1.26.4` | Binary repackaging of official upstream release binaries | Ships current Gitea releases with the expected Alpine runtime layout and OpenRC service. | ## Use In Production ### Add The Package Repository Install the registry key: ```sh cd /etc/apk/keys curl -fsSLOJ https://code.factoring.digital/api/packages/public/alpine/key ``` Add the repository for the node's Alpine branch: ```sh printf '%s\n' \ 'https://code.factoring.digital/api/packages/public/alpine/v3.24/alpine-packages' \ >> /etc/apk/repositories apk update ``` Private registry URL format: ```text https://:@code.factoring.digital/api/packages/public/alpine/v3.24/alpine-packages ``` ## Contribution ### Package Layout Package sources live under: ```text packaging/alpine/local// ``` Local build output is written under: ```text packages/local// ``` Signing keys and distfiles are cached under: ```text .cache/abuild/ .cache/apk-distfiles/ ``` ### Build Commands ```sh $ mise tasks Name Description apk:build Build the Alpine package in Docker for the default architecture apk:build-aarch64 Build the Alpine package in Docker for aarch64 apk:build-all Build the Alpine package in Docker for all configured architectures apk:build-x86_64 Build the Alpine package in Docker for x86_64 apk:checksum Refresh APKBUILD checksums in Docker apk:ci-build Build all configured Alpine packages directly in the current Alpine... apk:ci-smoke Install-test built packages directly in the current Alpine environment apk:clean Remove generated Alpine package build outputs apk:lint Run Alpine APKBUILD lint in Docker apk:packages List built Alpine packages and dependencies apk:publish-check Run lint, multi-arch build, package listing, and smoke test apk:publish-gitea Publish built packages to the Gitea Alpine package registry apk:outdated Check packaged upstream versions against latest GitHub releases apk:shell Open an Alpine package build shell in Docker apk:smoke Install-test built packages from the local repository in Docker apk:test-install Test README installation instructions in a fresh Alpine container apk:test-shell Open an Alpine shell with the local APK repository configured apk:update-generated Refresh packaged upstream examples and shell completions apk:runtime-test Run package-local Docker runtime tests against the local... gitea-workflow-build Run the Gitea build workflow locally through act as a pull_request event ``` `apk:build` targets `x86_64` by default. Multi-arch builds target `x86_64` and `aarch64`: ```sh ALPINE_ARCHES="x86_64 aarch64" mise run apk:build-all ``` Limit package selection with `ALPINE_PACKAGE` or `ALPINE_PACKAGES`: ```sh ALPINE_PACKAGE=seaweedfs mise run apk:build ALPINE_PACKAGES="seaweedfs other-package" mise run apk:build-all ALPINE_PACKAGE=seaweedfs mise run apk:test-install ALPINE_PACKAGE=greptimedb mise run apk:checksum 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: ```sh ALPINE_APK_CACHE_SCOPE=public-alpine-packages ALPINE_PACKAGE=greptimedb mise run apk:build ALPINE_APK_CACHE_PREFIX=alpine-apk-ci ALPINE_PACKAGE=greptimedb mise run apk:build ``` Local packages use `local` as the default package metadata identity. Override it when needed: ```sh PACKAGER="Example Builder " ALPINE_PACKAGE=seaweedfs mise run apk:build ``` Open an Alpine package build shell: ```sh ALPINE_PACKAGE=seaweedfs mise run apk:shell ``` Run the install test: ```sh mise run apk:test-install ``` Reuse existing local packages: ```sh SKIP_BUILD=1 mise run apk:test-install SKIP_BUILD=1 mise run apk:test-shell ``` `apk:test-shell` opens an Alpine shell with the local APK repository configured. Install whichever built packages you want inside the container: ```sh apk add seaweedfs seaweedfs-master-openrc weed version apk add greptimedb greptimedb-docs greptimedb-standalone-openrc greptime --version ``` Run package-local runtime tests: ```sh mise run apk:runtime-test ALPINE_PACKAGE=seaweedfs mise run apk:runtime-test ALPINE_VERSION=3.24 mise run apk:runtime-test ``` ### Adding Packages Package path: ```text packaging/alpine/local// ``` Optional package hooks: ```text packaging/alpine/local//scripts/test-install.sh packaging/alpine/local//scripts/update-generated-sources.sh packaging/alpine/local//scripts/runtime-test.sh ``` Start from the blueprint: ```text packaging/alpine/blueprint/ ``` ### Generated Package Sources Generated package sources live next to the package `APKBUILD`: ```text packaging/alpine/local/seaweedfs/example-*.toml packaging/alpine/local/seaweedfs/weed.bash-completion ``` Refresh generated sources: ```sh mise run apk:update-generated ALPINE_PACKAGE=seaweedfs mise run apk:update-generated mise run apk:checksum ``` ### Upstream Update Visibility Check whether packaged upstream versions are current: ```sh mise run apk:outdated ALPINE_PACKAGE=seaweedfs mise run apk:outdated ``` By default this is a warning-only signal. To make outdated or unknown package versions fail the command: ```sh APK_UPDATE_CHECK_MODE=fail mise run apk:outdated ``` ### Gitea Workflow `.gitea/workflows/build.yml` builds and publishes `v3.24`. Pull requests build only. Repository variables: ```text INSTANCE_URL=https://code.factoring.digital PACKAGE_OWNER=public PACKAGE_NAME=alpine-packages ``` Repository secrets: ```text PACKAGE_USER= PACKAGE_TOKEN= ``` Check the workflow locally: ```sh mise run gitea-workflow-build ``` Publish local packages: ```sh INSTANCE_URL=https://code.factoring.digital \ PACKAGE_OWNER=public \ PACKAGE_NAME=alpine-packages \ PACKAGE_USER=... \ PACKAGE_TOKEN=... \ mise run apk:publish-gitea ``` ### Checklist Before opening a PR, run: ```sh mise run apk:publish-check mise run gitea-workflow-build mise run apk:test-install mise run apk:runtime-test ``` Then test at least one installed role in the package shell: ```sh mise run apk:test-shell apk add seaweedfs seaweedfs-master-openrc rc-service seaweedfs.master start weed version ```