# Alpine Packages Alpine stable packaging for internal packages. ```text https://code.factoring.digital/api/packages/public/alpine/v3.24/alpine-packages ``` ## Available Packages - [SeaweedFS](packaging/alpine/local/seaweedfs/README.md): `seaweedfs` - [GreptimeDB](packaging/alpine/local/greptimedb/README.md): `greptimedb` - [LavinMQ](packaging/alpine/local/lavinmq/README.md): `lavinmq` ## 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// ``` Currently packaged: ```text seaweedfs SeaweedFS 4.31 release binary and OpenRC role splits greptimedb GreptimeDB 1.1.2 built from source for x86_64 lavinmq LavinMQ 2.9.1 built from source for x86_64 ``` 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: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 current local package build installed 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 ``` 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 ``` Open an Alpine test shell: ```sh ALPINE_PACKAGE=seaweedfs mise run apk:shell mise run apk:test-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 ``` 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 ``` ### 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 rc-service seaweedfs.master start weed version ```