--------- Reviewed-on: #5
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.
https://code.factoring.digital/api/packages/public/alpine/v3.24/alpine-packages
Available Packages
| Package | APK Name | Package Version | Package Type | Purpose |
|---|---|---|---|---|
| SeaweedFS | seaweedfs |
4.40 |
Binary repackaging of official upstream release tarballs | Ships current SeaweedFS features with Alpine OpenRC role splits. |
| GreptimeDB | greptimedb |
1.1.4 |
Source build from upstream release | Provides a current GreptimeDB build and component OpenRC packages before it is available from Alpine community. |
| LavinMQ | lavinmq |
2.9.1 |
Source build from upstream release | Provides a current LavinMQ build on Alpine 3.24 with matching Crystal support. |
| Gitea | gitea |
1.27.0 |
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:
cd /etc/apk/keys
curl -fsSLOJ https://code.factoring.digital/api/packages/public/alpine/key
Add the repository for the node's Alpine branch:
printf '%s\n' \
'https://code.factoring.digital/api/packages/public/alpine/v3.24/alpine-packages' \
>> /etc/apk/repositories
apk update
Private registry URL format:
https://<user>:<token>@code.factoring.digital/api/packages/public/alpine/v3.24/alpine-packages
Contribution
Package Layout
Package sources live under:
packaging/alpine/local/<pkgname>/
Local build output is written under:
packages/local/<arch>/
Signing keys and distfiles are cached under:
.cache/abuild/
.cache/apk-distfiles/
Build Commands
$ 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:lint-shell Run ShellCheck for packaging automation
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:
ALPINE_ARCHES="x86_64 aarch64" mise run apk:build-all
Limit package selection with ALPINE_PACKAGE or ALPINE_PACKAGES:
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:
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:
PACKAGER="Example Builder <builder@example.com>" ALPINE_PACKAGE=seaweedfs mise run apk:build
Open an Alpine package build shell:
ALPINE_PACKAGE=seaweedfs mise run apk:shell
Run the install test:
mise run apk:test-install
Reuse existing local packages:
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:
apk add seaweedfs seaweedfs-master-openrc
weed version
apk add greptimedb greptimedb-docs greptimedb-standalone-openrc
greptime --version
Run package-local runtime tests:
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:
packaging/alpine/local/<pkgname>/
Optional package hooks:
packaging/alpine/local/<pkgname>/scripts/test-install.sh
packaging/alpine/local/<pkgname>/scripts/update-generated-sources.sh
packaging/alpine/local/<pkgname>/scripts/runtime-test.sh
Start from the blueprint:
packaging/alpine/blueprint/
Generated Package Sources
Generated package sources live next to the package APKBUILD:
packaging/alpine/local/seaweedfs/example-*.toml
packaging/alpine/local/seaweedfs/weed.bash-completion
Refresh generated sources:
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:
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:
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:
INSTANCE_URL=https://code.factoring.digital
PACKAGE_OWNER=public
PACKAGE_NAME=alpine-packages
Repository secrets:
PACKAGE_USER=<gitea package publisher>
PACKAGE_TOKEN=<token with package write access>
Check the workflow locally:
mise run gitea-workflow-build
Publish local packages:
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:
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:
mise run apk:test-shell
apk add seaweedfs seaweedfs-master-openrc
rc-service seaweedfs.master start
weed version