fspjo 53f2a988de
Build Alpine Packages / build-and-publish (v3.24, 3.24) (push) Successful in 30m29s
upgrade seaweedfs to 4.41 (#5)
---------
Reviewed-on: #5
2026-08-13 16:42:23 +02:00
2026-06-07 14:30:21 +02:00
2026-07-12 10:24:15 +02:00
2026-07-24 16:54:31 +02:00

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
S
Description
No description provided
Readme
203 KiB
Languages
Shell 98.5%
Dockerfile 1.5%