diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 05c7db0..3cb80ae 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -1,52 +1,43 @@ name: Build Alpine Packages on: - schedule: - - cron: "17 5 * * 1" push: branches: - - master - - main + - "**" tags: - "*" pull_request: workflow_dispatch: +env: + ALPINE_VERSION: "3.24" + ALPINE_ARCHES: "x86_64 aarch64" + ALPINE_REGISTRY_BRANCH: "v3.24" + ALPINE_REGISTRY_REPOSITORY: "${{ vars.PACKAGE_NAME }}" + INSTANCE_URL: "${{ vars.INSTANCE_URL }}" + PACKAGE_OWNER: "${{ vars.PACKAGE_OWNER }}" + PACKAGE_USER: "${{ secrets.PACKAGE_USER }}" + PACKAGE_TOKEN: "${{ secrets.PACKAGE_TOKEN }}" + PACKAGER: "${{ gitea.repository_owner }}" + ALPINE_RUST_CACHE_ROOT: "/cache/public-alpine-packages/v3.24/rust" + TRIVY_VERSION: "0.74.0" + TRIVY_SHA256: "2ae6fe3ee734b7fdf11335663e18c75ea12dccc76062f09f164a3b0f8be4371a" + jobs: - build-and-publish: + preflight: runs-on: ubuntu-latest - strategy: - matrix: - include: - - alpine_version: "3.24" - alpine_registry_branch: "v3.24" + timeout-minutes: 180 container: - image: "alpine:${{ matrix.alpine_version }}" - env: - ALPINE_VERSION: "${{ matrix.alpine_version }}" - ALPINE_ARCHES: "x86_64 aarch64" - ALPINE_REGISTRY_BRANCH: "${{ matrix.alpine_registry_branch }}" - ALPINE_REGISTRY_REPOSITORY: "${{ vars.PACKAGE_NAME }}" - INSTANCE_URL: "${{ vars.INSTANCE_URL }}" - PACKAGE_OWNER: "${{ vars.PACKAGE_OWNER }}" - PACKAGE_USER: "${{ secrets.PACKAGE_USER }}" - PACKAGE_TOKEN: "${{ secrets.PACKAGE_TOKEN }}" - PACKAGER: "${{ gitea.repository_owner }}" - ALPINE_APK_REPO_CACHE: "/cache/public-alpine-packages/${{ matrix.alpine_registry_branch }}/apk-repo" - ALPINE_RUST_CACHE_ROOT: "/cache/public-alpine-packages/${{ matrix.alpine_registry_branch }}/rust" - TRIVY_VERSION: "0.74.0" - TRIVY_SHA256: "2ae6fe3ee734b7fdf11335663e18c75ea12dccc76062f09f164a3b0f8be4371a" + image: "alpine:3.24" + outputs: + packages_selected: "${{ steps.package-selection.outputs.packages_selected }}" + selected_packages: "${{ steps.package-selection.outputs.selected_packages }}" + greptimedb_selected: "${{ steps.package-selection.outputs.greptimedb_selected }}" steps: - name: Prepare Environment run: | printf '%s\n' 'https://dl-cdn.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories - apk add --no-cache --update abuild-rootbld alpine-sdk atools-apkbuild-lint bash ca-certificates curl doas git jq nodejs rsync shellcheck sudo tar - trivy_archive="trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz" - curl -fsSL -o "/tmp/${trivy_archive}" "https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/${trivy_archive}" - echo "${TRIVY_SHA256} /tmp/${trivy_archive}" | sha256sum -c - - tar -xzf "/tmp/${trivy_archive}" -C /usr/local/bin trivy - mkdir -p "$ALPINE_APK_REPO_CACHE" "$ALPINE_RUST_CACHE_ROOT" - chown -R 1000:1000 /cache/public-alpine-packages/${{ matrix.alpine_registry_branch }} + apk add --no-cache --update atools-apkbuild-lint bash ca-certificates curl git jq nodejs shellcheck tar - name: Checkout uses: actions/checkout@v3 @@ -68,46 +59,136 @@ jobs: fi - name: Prepare package cache - if: github.event_name != 'schedule' id: package-selection - run: | - scripts/apk/ci-package-cache.sh prepare + run: scripts/apk/ci-package-cache.sh prepare - - name: Build packages - if: github.event_name != 'schedule' + build: + needs: preflight + if: needs.preflight.outputs.packages_selected == 'true' + runs-on: ubuntu-latest + timeout-minutes: 180 + strategy: + fail-fast: false + matrix: + package: [seaweedfs, greptimedb, lavinmq, gitea] + container: + image: "alpine:3.24" + env: + ALPINE_PACKAGE: "${{ matrix.package }}" + steps: + - name: Prepare Environment + run: | + printf '%s\n' 'https://dl-cdn.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories + apk add --no-cache --update abuild-rootbld alpine-sdk bash ca-certificates doas git nodejs sudo + mkdir -p "$ALPINE_RUST_CACHE_ROOT" + chown -R 1000:1000 /cache/public-alpine-packages/v3.24 + + - name: Checkout + uses: actions/checkout@v3 + + - name: Build package + if: contains(needs.preflight.outputs.selected_packages, matrix.package) run: | scripts/apk/ci-build.sh - if [ -d packages/local ]; then - scripts/apk/list-packages.sh - fi - - - name: Export GreptimeDB CI assets - if: github.event_name != 'schedule' && steps.package-selection.outputs.greptimedb_selected == 'true' - run: scripts/apk/export-ci-assets.sh + scripts/apk/list-packages.sh - name: Check artifact upload support - if: github.event_name != 'schedule' - id: artifact-upload + if: contains(needs.preflight.outputs.selected_packages, matrix.package) run: | - if [ -n "${ACTIONS_RUNTIME_TOKEN:-}" ]; then - echo "available=true" >> "$GITHUB_OUTPUT" - else - echo "available=false" >> "$GITHUB_OUTPUT" - fi + test -n "${ACTIONS_RUNTIME_TOKEN:-}" || { + echo "artifact upload support is required for split package builds" >&2 + exit 1 + } - - name: Upload generated CI assets - if: github.event_name != 'schedule' && steps.package-selection.outputs.greptimedb_selected == 'true' && steps.artifact-upload.outputs.available == 'true' + - name: Upload package artifacts + if: contains(needs.preflight.outputs.selected_packages, matrix.package) uses: actions/upload-artifact@v3 with: - name: greptimedb-musl-binaries-${{ matrix.alpine_registry_branch }} + name: alpine-package-${{ matrix.package }}-${{ github.sha }} + path: packages/local/ + retention-days: 1 + + verify-and-publish: + needs: [preflight, build] + if: needs.preflight.outputs.packages_selected == 'true' + runs-on: ubuntu-latest + timeout-minutes: 180 + container: + image: "alpine:3.24" + env: + ALPINE_PACKAGES: "${{ needs.preflight.outputs.selected_packages }}" + steps: + - name: Prepare Environment + run: | + printf '%s\n' 'https://dl-cdn.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories + apk add --no-cache --update abuild-rootbld alpine-sdk bash ca-certificates curl doas git jq nodejs rsync shellcheck sudo tar + trivy_archive="trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz" + curl -fsSL -o "/tmp/${trivy_archive}" "https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/${trivy_archive}" + echo "${TRIVY_SHA256} /tmp/${trivy_archive}" | sha256sum -c - + tar -xzf "/tmp/${trivy_archive}" -C /usr/local/bin trivy + + - name: Checkout + uses: actions/checkout@v3 + + - name: Prepare registry fallback + run: | + selected_packages="$ALPINE_PACKAGES" + scripts/apk/ci-package-cache.sh prepare + printf 'ALPINE_PACKAGES=%s\n' "$selected_packages" >> "$GITHUB_ENV" + + - name: Download SeaweedFS artifacts + if: contains(needs.preflight.outputs.selected_packages, 'seaweedfs') + uses: actions/download-artifact@v3 + with: + name: alpine-package-seaweedfs-${{ github.sha }} + path: packages/worker-artifacts/seaweedfs + + - name: Download GreptimeDB artifacts + if: contains(needs.preflight.outputs.selected_packages, 'greptimedb') + uses: actions/download-artifact@v3 + with: + name: alpine-package-greptimedb-${{ github.sha }} + path: packages/worker-artifacts/greptimedb + + - name: Download LavinMQ artifacts + if: contains(needs.preflight.outputs.selected_packages, 'lavinmq') + uses: actions/download-artifact@v3 + with: + name: alpine-package-lavinmq-${{ github.sha }} + path: packages/worker-artifacts/lavinmq + + - name: Download Gitea artifacts + if: contains(needs.preflight.outputs.selected_packages, 'gitea') + uses: actions/download-artifact@v3 + with: + name: alpine-package-gitea-${{ github.sha }} + path: packages/worker-artifacts/gitea + + - name: Merge package artifacts + run: scripts/apk/merge-ci-artifacts.sh + + - name: Export GreptimeDB CI assets + if: needs.preflight.outputs.greptimedb_selected == 'true' + run: scripts/apk/export-ci-assets.sh + + - name: Upload generated CI assets + if: needs.preflight.outputs.greptimedb_selected == 'true' + uses: actions/upload-artifact@v3 + with: + name: greptimedb-musl-binaries-v3.24 path: packages/ci-assets/ + - name: Upload local Alpine registry + uses: actions/upload-artifact@v3 + with: + name: alpine-local-registry-v3.24-${{ github.sha }} + path: packages/local/ + retention-days: 30 + - name: Smoke test - if: github.event_name != 'schedule' run: scripts/apk/ci-smoke.sh - name: Generate security reports - if: github.event_name != 'schedule' && env.ALPINE_SKIP_BUILD != '1' run: | scripts/apk/security-report.sh if [ -n "${GITHUB_STEP_SUMMARY:-}" ]; then @@ -117,16 +198,14 @@ jobs: fi - name: Upload security reports - if: github.event_name != 'schedule' && env.ALPINE_SKIP_BUILD != '1' && steps.artifact-upload.outputs.available == 'true' uses: actions/upload-artifact@v3 with: - name: apk-security-reports-${{ matrix.alpine_registry_branch }} + name: apk-security-reports-v3.24 path: packages/security-reports/ - name: Runtime test - if: github.event_name != 'schedule' && env.ALPINE_SKIP_BUILD != '1' run: scripts/apk/runtime-test.sh - name: Publish Alpine packages - if: github.event_name != 'pull_request' && github.event_name != 'schedule' && env.ALPINE_SKIP_BUILD != '1' + if: github.ref == 'refs/heads/main' run: scripts/apk/publish-gitea.sh diff --git a/.gitea/workflows/package-status.yml b/.gitea/workflows/package-status.yml new file mode 100644 index 0000000..09fdc8f --- /dev/null +++ b/.gitea/workflows/package-status.yml @@ -0,0 +1,30 @@ +name: Package Update Status + +on: + schedule: + - cron: "17 5 * * 1" + workflow_dispatch: + +jobs: + package-status: + runs-on: ubuntu-latest + container: + image: alpine:3.24 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Check packaged upstream versions + run: | + apk add --no-cache bash curl git jq + APK_UPDATE_CHECK_MODE=warn scripts/apk/outdated.sh > update-check.txt + cat update-check.txt + if [ -n "${GITHUB_STEP_SUMMARY:-}" ]; then + { + echo "## Upstream package update check" + echo + echo '```text' + cat update-check.txt + echo '```' + } >> "$GITHUB_STEP_SUMMARY" + fi diff --git a/README.md b/README.md index 4b10e73..424b955 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Alpine Packages +[![Package update check](https://code.factoring.digital/public/alpine-packages/actions/workflows/package-status.yml/badge.svg?branch=main&event=schedule)](https://code.factoring.digital/public/alpine-packages/actions?workflow=package-status.yml) + 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. @@ -19,7 +21,7 @@ https://code.factoring.digital/api/packages/public/alpine/v3.24/alpine-packages | Package | APK Name | Package Version | Package Type | Purpose | |-----------------------------------------------------------|--------------|-----------------|----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------| -| [SeaweedFS](packaging/alpine/local/seaweedfs/README.md) | `seaweedfs` | `4.47` | Binary repackaging of official upstream release tarballs | Ships current SeaweedFS features with Alpine OpenRC role splits. | +| [SeaweedFS](packaging/alpine/local/seaweedfs/README.md) | `seaweedfs` | `4.47` | Source build from upstream release | Builds the baseline upstream feature set with Alpine OpenRC role splits. | | [GreptimeDB](packaging/alpine/local/greptimedb/README.md) | `greptimedb` | `1.2.1` | 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.10.0` | 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.27.3` | Binary repackaging of official upstream release binaries | Ships current Gitea releases with the expected Alpine runtime layout and OpenRC service. | diff --git a/packaging/alpine/local/greptimedb/APKBUILD b/packaging/alpine/local/greptimedb/APKBUILD index 8f5c848..8761e5f 100644 --- a/packaging/alpine/local/greptimedb/APKBUILD +++ b/packaging/alpine/local/greptimedb/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: Joachim Schlöffel pkgname=greptimedb pkgver=1.2.1 -pkgrel=0 +pkgrel=3 pkgdesc="Cloud-native observability database for metrics, logs, and traces" url="https://github.com/GreptimeTeam/greptimedb" arch="x86_64" @@ -12,14 +12,17 @@ makedepends=" clang cmake coreutils - curl + cargo-auditable + git lld linux-headers make mold + nodejs openssl-dev openssl-libs-static perl + pnpm protobuf protobuf-dev rustup @@ -28,6 +31,7 @@ makedepends=" zstd-dev zstd-static " +checkdepends="cargo-nextest" install="$pkgname.pre-install" subpackages=" $pkgname-datanode-openrc:_openrc_datanode:noarch @@ -41,7 +45,7 @@ options="net" _dashboard_version="v0.12.0" source=" $pkgname-$pkgver.tar.gz::https://github.com/GreptimeTeam/greptimedb/archive/refs/tags/v$pkgver.tar.gz - dashboard-$_dashboard_version.tar.gz::https://github.com/GreptimeTeam/dashboard/releases/download/$_dashboard_version/build.tar.gz + dashboard-$_dashboard_version.tar.gz::https://github.com/GreptimeTeam/dashboard/archive/refs/tags/$_dashboard_version.tar.gz datanode.toml flownode.toml frontend.toml @@ -64,31 +68,45 @@ export CARGO_BUILD_JOBS="${CARGO_BUILD_JOBS:-2}" export CARGO_PROFILE_NIGHTLY_CODEGEN_UNITS="${CARGO_PROFILE_NIGHTLY_CODEGEN_UNITS:-16}" export CARGO_PROFILE_NIGHTLY_DEBUG="${CARGO_PROFILE_NIGHTLY_DEBUG:-false}" export CARGO_PROFILE_NIGHTLY_LTO="${CARGO_PROFILE_NIGHTLY_LTO:-thin}" +export CARGO_PROFILE_TEST_DEBUG="${CARGO_PROFILE_TEST_DEBUG:-false}" export LIBRARY_PATH="/usr/lib" +export RUSTFLAGS="${RUSTFLAGS:-} -C link-arg=-fuse-ld=mold" prepare() { default_prepare - if [ ! -d "$builddir"/src/servers/dashboard/dist ]; then - mv "$srcdir"/dist "$builddir"/src/servers/dashboard/dist - fi rustup-init \ -y \ --no-modify-path \ --profile minimal \ --default-toolchain "$_rust_toolchain" + "$CARGO_HOME"/bin/rustup run "$_rust_toolchain" cargo fetch \ + --locked + + local _dashboard_builddir="$srcdir"/dashboard-${_dashboard_version#v} + ( + cd "$_dashboard_builddir" + pnpm install --frozen-lockfile --store-dir "$srcdir"/pnpm-store + pnpm run build:docker + ) + rm -rf "$builddir"/src/servers/dashboard/dist + cp -a "$_dashboard_builddir"/dist "$builddir"/src/servers/dashboard/ } build() { - "$CARGO_HOME"/bin/rustup run "$_rust_toolchain" cargo build \ + "$CARGO_HOME"/bin/rustup run "$_rust_toolchain" cargo auditable build \ --profile "$_cargo_profile" \ + --frozen \ --locked \ --bin greptime \ --features servers/dashboard } check() { - "$CARGO_TARGET_DIR"/"$_cargo_profile"/greptime --version + "$CARGO_HOME"/bin/rustup run "$_rust_toolchain" cargo nextest run \ + -p cmd \ + --lib \ + --frozen } package() { @@ -128,14 +146,14 @@ _docs() { sha512sums=" fc580f6e34df84b4f37219047d751968324c356f3cad352d1515abb4b441515a1ad98f0d01e2de33aac5129a2d7a5335edc4d8888923da7683a084a484769bea greptimedb-1.2.1.tar.gz -4260acae5bed00a693dceffe9f53d0f8b25fd677b15638e951cf973dc29681f4bacde352c661a12bd78af7be9181a3740812f814fc3c4c8c87ea4eee6ee07e2d dashboard-v0.12.0.tar.gz +3f853b6767a86cfa97ec640a17de59b2e798561c9402026e9b3a749907780b9b686149dba8a932b5d61ae538c430deab2410248e5c9e6e1961909000445ee2ee dashboard-v0.12.0.tar.gz 29cc3376753487b216748e3f85e12639830e1ac4a763e94f330f87c3651a8ef9de35732958311c0049e1b7cbb4e90a9e602b3aff43297fe088c5ce795a110a79 datanode.toml 52790808cb4f5cf0220ac2ab169b623fe76b6318d27d7f003e1197e850373cb915bfd40556098bcb7650f293d751039cb3bccbf9107bb160b8284887794ba975 flownode.toml e3e19ab3c7a345ecf8cf0a507f7fc95dd3b036a4a797385cf77fcf1999f2e4f053042c7bbda8de73ed43ff72e87aad81e4ac6d4a34d01773bbc1f6d0d967d9f7 frontend.toml 313ed7d9ccd174b1869f3009e174266cdc414599e0b0f8307c8aaf2b73841eb36ce4c1b2f6244a0358b5a587a4edaa621b781fbd767835088b3fa13623fcc0df greptimedb.datanode.confd daf8efacc8bf2b74abd9f4900f889585295b57333a8a562a722de0596d35f25d5f9149e0879f4140bfdf727caa59c3f55b1380212722df92c588d912275530b8 greptimedb.flownode.confd e3e61b1df00f8172a3b1d4a0d37ed2574a8c5cd27676b4e2ce14d15ad8933d233baabe8da374f715d00cfaee26f665244c1ba00f70197fcc713c4e9af9c3229e greptimedb.frontend.confd -c00740aee566b161bbe3610e0e0d6e8340022055750e6778772262474ffd6484d9f58be2fd498beafe28d0943e259e2277930af691bedea7650726e6c8998881 greptimedb.initd +f72f52aa8277fc56eb071b5118990b8f4e09d143634c2f7fc54ed1f5ff065631c8630c45fe90d3db1f3ea0540c1ab3154a383d2000b4c5978e889ca02a1b6564 greptimedb.initd df495367d85844dcba99e5aa01e5a23fd14799b7521a72d9ea00d29fc0e5fbc5c5d06ee88e88d9637e260f8337249a39d2b0115de58da4899824d20bd844254a greptimedb.metasrv.confd 882a79e969cac42adfada22060e6507fb687755a6d266d6728154b3e4da5777d2eaf5ad9bc331ed050448249ca609e6a61977b624d9faf25d83ed975345452cf greptimedb.standalone.confd 8120ec338ebe1330d43b20d9b34a8f5f778ea13cb056febd3c8e9dc189d0de2380b90e5474a0990294d7004827c6133d44d2dd3e32d463b9259c47c82592d257 metasrv.toml diff --git a/packaging/alpine/local/greptimedb/README.md b/packaging/alpine/local/greptimedb/README.md index 703bc54..291e38e 100644 --- a/packaging/alpine/local/greptimedb/README.md +++ b/packaging/alpine/local/greptimedb/README.md @@ -1,14 +1,22 @@ # GreptimeDB Alpine Package -Builds `greptime` from the upstream source release and packages OpenRC service -subpackages plus `/etc/greptimedb` defaults. +Builds `greptime` and its embedded dashboard from their upstream source +releases, and packages OpenRC service subpackages plus `/etc/greptimedb` +defaults. Build command: ```sh -cargo build --profile nightly --locked --bin greptime --features servers/dashboard +cargo auditable build --profile nightly --frozen --locked --bin greptime --features servers/dashboard ``` +GreptimeDB requires the nightly pinned in its source release +(`nightly-2026-03-21`). The package uses Rustup to install that toolchain and +uses locked Cargo and pnpm dependency resolution, so `options="net"` is +intentional. Cargo dependencies are fetched before compilation; the Rust build +then runs frozen. The dashboard is built from the matching `v0.12.0` source tag +with its checked-in `pnpm-lock.yaml`. + ## Runtime Layout Installs `/usr/bin/greptime` and component OpenRC packages: @@ -92,4 +100,4 @@ ALPINE_REPOSITORY_KEY_URL=https://code.factoring.digital/api/packages/public/alp mise run apk:test-install ``` -Full builds take close to an hour. +Full builds and the targeted upstream Nextest check take close to an hour. diff --git a/packaging/alpine/local/greptimedb/greptimedb.initd b/packaging/alpine/local/greptimedb/greptimedb.initd index 30bc208..faf5ff9 100755 --- a/packaging/alpine/local/greptimedb/greptimedb.initd +++ b/packaging/alpine/local/greptimedb/greptimedb.initd @@ -6,6 +6,7 @@ description="GreptimeDB ${service_name} service" command="/usr/bin/greptime" command_user="${GREPTIMEDB_USER:-greptimedb}:${GREPTIMEDB_GROUP:-greptimedb}" command_background="yes" +retry="TERM/30/KILL/5" pidfile="/run/greptimedb/${RC_SVCNAME}.pid" output_log="${GREPTIMEDB_LOG:-/var/log/greptimedb/${RC_SVCNAME}.log}" error_log="${GREPTIMEDB_ERRLOG:-/var/log/greptimedb/${RC_SVCNAME}.log}" diff --git a/packaging/alpine/local/greptimedb/scripts/runtime-test.sh b/packaging/alpine/local/greptimedb/scripts/runtime-test.sh index 5e7c861..f105246 100755 --- a/packaging/alpine/local/greptimedb/scripts/runtime-test.sh +++ b/packaging/alpine/local/greptimedb/scripts/runtime-test.sh @@ -21,3 +21,14 @@ greptime --version rc-update add greptimedb.standalone default || true test -L /etc/runlevels/default/greptimedb.standalone + +rc-service greptimedb.standalone start +for _attempt in $(seq 1 30); do + if wget -qO- http://127.0.0.1:4000/status >/dev/null; then + break + fi + sleep 1 +done +wget -qO- http://127.0.0.1:4000/status >/dev/null +wget -qO- http://127.0.0.1:4000/dashboard/ | grep -qi '' +rc-service greptimedb.standalone stop diff --git a/packaging/alpine/local/greptimedb/scripts/update-generated-sources.sh b/packaging/alpine/local/greptimedb/scripts/update-generated-sources.sh deleted file mode 100755 index 9b6c101..0000000 --- a/packaging/alpine/local/greptimedb/scripts/update-generated-sources.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -package_dir="${PACKAGE_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}" - -printf 'No generated sources for %s\n' "${package_dir}" diff --git a/packaging/alpine/local/lavinmq/APKBUILD b/packaging/alpine/local/lavinmq/APKBUILD index 5b25c60..e515b4e 100644 --- a/packaging/alpine/local/lavinmq/APKBUILD +++ b/packaging/alpine/local/lavinmq/APKBUILD @@ -1,15 +1,14 @@ # Maintainer: Joachim Schlöffel pkgname=lavinmq pkgver=2.10.0 -pkgrel=0 +pkgrel=2 pkgdesc="High-performance AMQP and MQTT message queue server" url="https://github.com/cloudamqp/lavinmq" arch="x86_64" license="Apache-2.0" depends="ca-certificates /bin/sh" makedepends=" - crystal=1.21.0-r0 - curl + crystal>=1.21.0 gc-dev help2man libevent-dev @@ -29,15 +28,21 @@ subpackages=" $pkgname-doc $pkgname-openrc:_openrc:noarch " -options="net" source=" $pkgname-$pkgver.tar.gz::https://github.com/cloudamqp/lavinmq/archive/refs/tags/v$pkgver.tar.gz + $pkgname-$pkgver-shards.tar.gz + $pkgname-$pkgver-assets.tar.gz lavinmq.confd lavinmq.initd + use-vendored-build-inputs.patch " -export CRYSTAL_CACHE_DIR="${CRYSTAL_CACHE_DIR:-$srcdir/crystal-cache}" -export SHARDS_CACHE_PATH="${SHARDS_CACHE_PATH:-$srcdir/shards-cache}" +prepare() { + default_prepare + tar -xzf "$srcdir/$pkgname-$pkgver-shards.tar.gz" -C "$builddir" + mkdir -p "$builddir/.alpine-assets" + tar -xzf "$srcdir/$pkgname-$pkgver-assets.tar.gz" -C "$builddir/.alpine-assets" +} build() { crystal --version @@ -46,9 +51,7 @@ build() { } check() { - bin/lavinmq -v - bin/lavinmqctl --version - bin/lavinmqperf --version + crystal spec spec/config_spec.cr } package() { @@ -70,6 +73,9 @@ _openrc() { sha512sums=" b494892dada6eb713025bc3245e16035a63265805d77c537b4530226195f00dacab1fb14de5bf4c999165faa6bf2f7ef7c6b8ffb4c6f4a921977f1c13a4f1545 lavinmq-2.10.0.tar.gz +d0dfdd5c0e474024f57deb9e31c76e3f176e798c8d21dea53d3aea1b05436bd03fa34e69ccddf322bc89adedce5f379df5a316cddbbdfe12520e5bf672ad8228 lavinmq-2.10.0-shards.tar.gz +ae3cea2534b211abbcbd1e4fcb6da73dfaf383a19aef1c45f367cba77492cc20a7ce8283fc42f26c0a023149114c369bed307fb8cde0b8f27fba61165092e986 lavinmq-2.10.0-assets.tar.gz 62a609d50f28db960098c4c84ce4f1dad78413366a9a9aca18fe321114d687be3bf7b71924d4ace69bd74383c5ac40d2ee09ae0eef9c1bfe653b97448e42e110 lavinmq.confd 1853196e70297b5c4a2207fde50df735620cf6d99c4994644fd676bffaf863d67300ad7ae771c4bbb86fce1a0485c2a7968cf912c5f5bb878e08b15e5a28ba1b lavinmq.initd +e7617099f745ecbf2f0686830d0a1b28044741ebd543798505b5b3c08f1be96b6cc478eb18f6785af49b100c2f49d837775f0721ac27519ddf3f081e681c581c use-vendored-build-inputs.patch " diff --git a/packaging/alpine/local/lavinmq/README.md b/packaging/alpine/local/lavinmq/README.md index baa8eb9..a66a7f0 100644 --- a/packaging/alpine/local/lavinmq/README.md +++ b/packaging/alpine/local/lavinmq/README.md @@ -1,7 +1,9 @@ # LavinMQ Alpine Package Builds LavinMQ from the upstream source release for `x86_64` and packages the -OpenRC service plus `/etc/lavinmq` defaults. +OpenRC service plus `/etc/lavinmq` defaults. The locked Shards dependencies and +frontend assets are versioned, checksummed source inputs, so the build does not +need network access. Build command: @@ -9,8 +11,9 @@ Build command: make ``` -LavinMQ 2.9.2 requires Crystal 1.21.0. The package pins Alpine edge's native -Crystal package, avoiding a glibc toolchain in the Alpine musl build. +LavinMQ 2.10.0 requires Crystal 1.21.0 or newer. The package uses Alpine +edge's native Crystal package, avoiding a glibc toolchain in the Alpine musl +build. ## Runtime Layout diff --git a/packaging/alpine/local/lavinmq/lavinmq-2.10.0-assets.tar.gz b/packaging/alpine/local/lavinmq/lavinmq-2.10.0-assets.tar.gz new file mode 100644 index 0000000..6c501e4 Binary files /dev/null and b/packaging/alpine/local/lavinmq/lavinmq-2.10.0-assets.tar.gz differ diff --git a/packaging/alpine/local/lavinmq/lavinmq-2.10.0-shards.tar.gz b/packaging/alpine/local/lavinmq/lavinmq-2.10.0-shards.tar.gz new file mode 100644 index 0000000..cc9c905 Binary files /dev/null and b/packaging/alpine/local/lavinmq/lavinmq-2.10.0-shards.tar.gz differ diff --git a/packaging/alpine/local/lavinmq/use-vendored-build-inputs.patch b/packaging/alpine/local/lavinmq/use-vendored-build-inputs.patch new file mode 100644 index 0000000..d72c392 --- /dev/null +++ b/packaging/alpine/local/lavinmq/use-vendored-build-inputs.patch @@ -0,0 +1,36 @@ +--- a/Makefile ++++ b/Makefile +@@ -8,0 +9 @@ ++LAVINMQ_ASSET_DIR ?= .alpine-assets +@@ -55,2 +56,2 @@ +-lib: shard.yml shard.lock +- shards install --production ++lib: ++ test -d lib +@@ -62,3 +63 @@ +- curl --fail --retry 5 -sL https://github.com/chartjs/Chart.js/releases/download/v4.0.1/chart.js-4.0.1.tgz | \ +- tar -zxOf- package/dist/chart.js > $@ +- [ "038d0a4f9c61f0b35ff70f883e7591403a349542625a4caaf48caa141adedfd5 *$@" = "$$(openssl dgst -sha256 -r $@)" ] ++ install -Dm644 "$(LAVINMQ_ASSET_DIR)/chart.js" "$@" +@@ -67,3 +66 @@ +- curl --fail --retry 5 -sL https://github.com/chartjs/Chart.js/releases/download/v4.0.1/chart.js-4.0.1.tgz | \ +- tar -zxOf- package/dist/chunks/helpers.segment.js > $@ +- [ "b4746b748fe583a18ef921e341b8b65166c2ebd0b737fde6527b254baaeb1aa1 *$@" = "$$(openssl dgst -sha256 -r $@)" ] ++ install -Dm644 "$(LAVINMQ_ASSET_DIR)/helpers.segment.js" "$@" +@@ -72,2 +69 @@ +- curl --fail --retry 5 -sLo $@ https://moment.github.io/luxon/es6/luxon.mjs +- [ "b495ad5cabea3439d04387e6622f2c3fa81d319424d9d76d9e7f874ac5a0807a *$@" = "$$(openssl dgst -sha256 -r $@)" ] ++ install -Dm644 "$(LAVINMQ_ASSET_DIR)/luxon.js" "$@" +@@ -76,3 +72 @@ +- curl --fail --retry 5 -sLo $@ https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon@1.3.1/dist/chartjs-adapter-luxon.esm.js +- sed -i'' -e "s|\(import { _adapters } from\).*|\1 './chart.js'|; s|\(import { DateTime } from\).*|\1 './luxon.js'|" $@ +- [ "17d7b6567d656a004f86b6b5cbdbe64cb308e9a2ebfa7675caa79ba0bc72ef91 *$@" = "$$(openssl dgst -sha256 -r $@)" ] ++ install -Dm644 "$(LAVINMQ_ASSET_DIR)/chartjs-adapter-luxon.esm.js" "$@" +@@ -81,2 +75 @@ +- curl --fail --retry 5 -sLo $@ https://unpkg.com/@stoplight/elements@8.2.0/web-components.min.js +- [ "598862da6d551769ebad9d61d4e3037535de573a13d3e0bd1ded4c5fc65c5885 *$@" = "$$(openssl dgst -sha256 -r $@)" ] ++ install -Dm644 "$(LAVINMQ_ASSET_DIR)/elements-8.2.0.js" "$@" +@@ -85,2 +78 @@ +- curl --fail --retry 5 -sLo $@ https://unpkg.com/@stoplight/elements@8.2.0/styles.min.css +- [ "119784e23ffc39b6fa3fdb3df93f391f8250e8af141b78dfc3b6bed86079f93b *$@" = "$$(openssl dgst -sha256 -r $@)" ] ++ install -Dm644 "$(LAVINMQ_ASSET_DIR)/elements-8.2.0.css" "$@" diff --git a/packaging/alpine/local/seaweedfs/APKBUILD b/packaging/alpine/local/seaweedfs/APKBUILD index 2d223af..60f1882 100644 --- a/packaging/alpine/local/seaweedfs/APKBUILD +++ b/packaging/alpine/local/seaweedfs/APKBUILD @@ -1,13 +1,13 @@ # Maintainer: Joachim Schlöffel pkgname=seaweedfs pkgver=4.47 -pkgrel=2 +pkgrel=3 pkgdesc="Distributed storage system for object storage, file systems, and Iceberg tables" url="https://github.com/seaweedfs/seaweedfs" arch="x86_64 aarch64" license="Apache-2.0" depends="ca-certificates /bin/sh" -makedepends="build-base cargo rust protobuf-dev" +makedepends="build-base cargo go protobuf-dev rust" provides="!$pkgname-openrc cmd:weed=$pkgver-r$pkgrel" install="$pkgname.pre-install" subpackages=" @@ -24,21 +24,12 @@ subpackages=" $pkgname-worker-lance:_worker_lance $pkgname-worker-lance-openrc:_openrc_worker_lance:noarch " -options="!check !strip !tracedeps" - -case "$CARCH" in - x86_64) - _archive="$pkgname-$pkgver-linux-amd64.tar.gz" - ;; - aarch64) - _archive="$pkgname-$pkgver-linux-arm64.tar.gz" - ;; -esac +options="!strip !tracedeps" source=" - $pkgname-$pkgver-linux-amd64.tar.gz::https://github.com/seaweedfs/seaweedfs/releases/download/$pkgver/linux_amd64.tar.gz - $pkgname-$pkgver-linux-arm64.tar.gz::https://github.com/seaweedfs/seaweedfs/releases/download/$pkgver/linux_arm64.tar.gz $pkgname-$pkgver-src.tar.gz::https://github.com/seaweedfs/seaweedfs/archive/refs/tags/$pkgver.tar.gz + $pkgname-$pkgver-go-vendor.tar.gz + $pkgname-$pkgver-cargo-vendor.tar.gz admin.toml credential.toml example-admin.toml @@ -66,22 +57,31 @@ source=" weed.bash-completion " -builddir="$srcdir" -_worker_builddir="$builddir/$pkgname-$pkgver/seaweed-worker" +_worker_builddir="$srcdir/$pkgname-$pkgver/seaweed-worker" prepare() { default_prepare - tar -xzf "$srcdir/$_archive" -C "$builddir" - tar -xzf "$srcdir/$pkgname-$pkgver-src.tar.gz" -C "$builddir" + tar -xzf "$srcdir/$pkgname-$pkgver-go-vendor.tar.gz" -C "$builddir" + tar -xzf "$srcdir/$pkgname-$pkgver-cargo-vendor.tar.gz" -C "$_worker_builddir" + mkdir -p "$_worker_builddir/.cargo" + mv "$_worker_builddir/cargo-vendor-config.toml" "$_worker_builddir/.cargo/config.toml" } build() { + go build -mod=vendor -buildvcs=false -trimpath -o "$builddir/weed-bin" ./weed + cd "$_worker_builddir" - cargo build --locked --release -p weed-lance-worker + cargo build --frozen --locked --release -p weed-lance-worker +} + +check() { + "$builddir/weed-bin" version + "$builddir/weed-bin" scaffold -config master >/dev/null + "${CARGO_TARGET_DIR:-$_worker_builddir/target}/release/weed-worker" --help >/dev/null } package() { - install -Dm755 "$srcdir"/weed "$pkgdir"/usr/bin/weed + install -Dm755 "$builddir"/weed-bin "$pkgdir"/usr/bin/weed install -Dm755 "${CARGO_TARGET_DIR:-$_worker_builddir/target}/release/weed-worker" \ "$pkgdir"/usr/bin/weed-worker local _config @@ -137,16 +137,16 @@ _bashcomp() { } sha512sums=" -f2e90fac760ac93951becce0314fa27aa69308a538a14d9066635d64c5fca07eababdbd41f5bb2215ba5793bf14fa2c019163438467aab2cf5bfea7f204f3faa seaweedfs-4.47-linux-amd64.tar.gz -a3e44542fa6e0f1266dea998a50120325c67a448d2cf09ad370a6d147f3d6096363fea57a056b2bd38d5b0674f4b2695644eed7e93110542efdc03fd8b5cde9e seaweedfs-4.47-linux-arm64.tar.gz b04ed6a4d16a016d08179a85fb0d4a7cf9de354f39820f8590a92384f5c750236f690a2110e9c33ba253564eadc02f639a329754f48b5d213c9c117c4ba46578 seaweedfs-4.47-src.tar.gz +94ad27f6ef7e94eeefc3e2be8c95e7e9d3839e0257e797b57a595f9eb87039fb1379c6cbd568d39fcc2b324d1bb4f350ece6e04e2d724691efecc1eeb5f7e42e seaweedfs-4.47-go-vendor.tar.gz +924ff6649fb1caeac02c604d31e26eee294fbb902ed7f6410467530e83e5aa4c2a5f06849ce89a0fe4da5cd4e269d4e7395d020b6529094fc8c762ec31fb6b83 seaweedfs-4.47-cargo-vendor.tar.gz 58be6587b082f45b4dd22ad8ebb1b8bf84cea2a7c0cb6b4ad4a749ac0bfdf92d10d22281a432f9e5a87afa0b940cd0172671a292fbe17803e56425cd940d47f9 admin.toml 7f77ad8787629e3defbc89e39e5432482aa50d87ddd723de927a9c6c77b14b1673cbf5b3fc3c18dd7d0eba26fbcd4220d2da6939ed097d0294b24ccd5c002635 credential.toml 507b389f6373b5f4d8ca69f27bc806b39bda8edf7f58e4f32720958e7782ee171dd0461bdecb285e5a8bf2cf4ea3d6cbe8b62ae6ac43c2a40d0eb053d50a22f8 example-admin.toml 7105de7053654b8c0502521ce58585915fc831c3152801e1db02b1c5214dc3c3ed31f4fc18000665d8338c7a10ffbf0d248368bef2ef3a6d37d46cd856398366 example-credential.toml c6ec4fc7709c42dc6771b5039203c44cbd693742abcd7720936c00b1bd5f99bb2999bb1545680ae4418efedd65d71c234f4602f52ce9d58b1ff7ec53eafb1a1a example-filer.toml e5753bd0bcc60dc84428c40ba556c08acae61dec083a5b76640125f637532e7c5759a72cdfd95114222a7a0901a916ec3c4d12f306853cfca0fe9a0b1857893e example-master.toml -2d64cde0ba4f91ed78a580399d7cada2af254c974a8f6458be70339d218d772680ca1bdefcb69e3a3eced1b0fd8206fa0e30122c1cd0a4dc9f306f813da935ee example-volume.toml +aea1b3114311304230cb30143825329ef7353a302d094c131ca4e049b847305e2143b76078e6574c6d7d4039c03a2e2d5a4925de80cd7cb2be75b2b522ce47f7 example-volume.toml 2c200c28172a5d0b1c80ab28e849287e7af8d103355638fd3183b8614d3e2b1b3482132522663f7c6d844e10e13b8c6e23fb5fba0dec2cc83de45c2f17b33477 example-notification.toml 328cfe43d0c2ebf5092a1178af45c37b07593085135c31649754f0df9fd4c043847c13b56c3c7c45194541db8082309c4845c825d7011e4c3e503b1e6576528d example-replication.toml 3b45b0f5bf6c5339cfb63c3ddb489b7122e03996ce380c7a244778ef1e7f6c06b4e3e56ea695a2dc3c9c49322a58df865ff50b2904318abafee5e66b2af757f1 example-security.toml @@ -156,7 +156,7 @@ e5753bd0bcc60dc84428c40ba556c08acae61dec083a5b76640125f637532e7c5759a72cdfd95114 79a078133c259473e601488cd1d8032b74c5fa32da6f34a4ed46efa9736bf5369365a77d775e3d78512b1060cd87012eb40226829eecb30544e1542d165af7d6 security.toml 82e2793bf483ffb5b0c8fbe38e6c9df75afe01f824f8414cafd91e4bed5c79c13dae1ca659070401d4968d16ed4b26455b0c6208f777705527bceb2e5f286988 seaweedfs.admin.confd 5ad952c37c62a770327bd70f7349fa677406606f0b9bf03fdc8f6c6804701f1e77710ab20d6153f9e0cfb549ec161d68a3316abab9c59837bbe3f91ee99e5ce0 seaweedfs.filer.confd -583de285a15b9006881821127b3fa0759216649c87c2f9aa5eaf73993ebfa66f7e06d364b1a35dd332efc9db4867120a3564f6ef12d2b39f00d7020c604599d6 seaweedfs.initd +077c513851bbbe53dd32d26455abc361f97006f9ace1190f96eb4b9136d16befab1a6153752eae8dac695c3a9aed084a00b411684915618cb30dd0770e608403 seaweedfs.initd 57ba77519bb266f0117eaadae3af5ae6bc99bb653668ff526202f327df1c8d93973c0e19dae0c53a19e06389868043c04e53f16f01c851b77fe1387e92cc993b seaweedfs.master.confd 22a3ea6c83266a979ea7c848fc74b40fc0f2ade960b273fa11e63d4a72a1328bd688c9918be3e9234cfb19f889fd9c931388bb5c2863cea3500e534b8bd90282 seaweedfs.s3.confd 3e9c41bc61cdd9a4c53ece64d847eca26ab7d0ce0cc98e72462c3dbb225a40de10a02201362801015a9c629d77d5c0d54c7228e9d20111fb6f478b2267d2db98 seaweedfs.sftp.confd diff --git a/packaging/alpine/local/seaweedfs/README.md b/packaging/alpine/local/seaweedfs/README.md index 78c8b4d..661bf23 100644 --- a/packaging/alpine/local/seaweedfs/README.md +++ b/packaging/alpine/local/seaweedfs/README.md @@ -1,13 +1,18 @@ # SeaweedFS Alpine Package -Repackages official SeaweedFS 4.47 Linux release tarballs for `x86_64` and -`aarch64`. +Builds SeaweedFS 4.47 from its upstream source release for `x86_64` and +`aarch64`. The package intentionally builds the upstream baseline feature set, +without optional build tags. Versioned Go and Cargo vendor archives make the +build fully offline after source retrieval. ## Package Commands -Refresh generated sources: +When updating SeaweedFS, refresh the vendor archives before generating the +config scaffolds and checksums: ```sh +PACKAGE_DIR=packaging/alpine/local/seaweedfs \ + packaging/alpine/local/seaweedfs/scripts/update-vendor-sources.sh ALPINE_PACKAGE=seaweedfs mise run apk:update-generated ALPINE_PACKAGE=seaweedfs mise run apk:checksum ``` @@ -140,5 +145,5 @@ rc-service seaweedfs.master restart Pin: ```sh -apk add seaweedfs=4.47-r2 +apk add seaweedfs=4.47-r3 ``` diff --git a/packaging/alpine/local/seaweedfs/example-volume.toml b/packaging/alpine/local/seaweedfs/example-volume.toml index 4e5f35f..2fa7094 100644 --- a/packaging/alpine/local/seaweedfs/example-volume.toml +++ b/packaging/alpine/local/seaweedfs/example-volume.toml @@ -27,3 +27,4 @@ percent = 10 hdd = "500ms" ssd = "100ms" nvme = "50ms" + diff --git a/packaging/alpine/local/seaweedfs/scripts/update-generated-sources.sh b/packaging/alpine/local/seaweedfs/scripts/update-generated-sources.sh index 067363e..419aec2 100755 --- a/packaging/alpine/local/seaweedfs/scripts/update-generated-sources.sh +++ b/packaging/alpine/local/seaweedfs/scripts/update-generated-sources.sh @@ -13,23 +13,13 @@ cleanup() { } trap cleanup EXIT -case "$(uname -m)" in - x86_64) - archive="linux_amd64.tar.gz" - ;; - aarch64|arm64) - archive="linux_arm64.tar.gz" - ;; - *) - printf 'unsupported host architecture for SeaweedFS generated sources: %s\n' "$(uname -m)" >&2 - exit 2 - ;; -esac - curl -fsSL \ - -o "${tmpdir}/${archive}" \ - "https://github.com/seaweedfs/seaweedfs/releases/download/${pkgver}/${archive}" -tar -xzf "${tmpdir}/${archive}" -C "${tmpdir}" weed + -o "${tmpdir}/seaweedfs-${pkgver}-src.tar.gz" \ + "https://github.com/seaweedfs/seaweedfs/archive/refs/tags/${pkgver}.tar.gz" +tar -xzf "${tmpdir}/seaweedfs-${pkgver}-src.tar.gz" -C "${tmpdir}" +source_dir="${tmpdir}/seaweedfs-${pkgver}" +tar -xzf "${package_dir}/seaweedfs-${pkgver}-go-vendor.tar.gz" -C "${source_dir}" +go build -mod=vendor -buildvcs=false -trimpath -o "${tmpdir}/weed" "${source_dir}/weed" for config in "${configs[@]}"; do "${tmpdir}/weed" scaffold -config "${config}" 2>/dev/null \ diff --git a/packaging/alpine/local/seaweedfs/scripts/update-vendor-sources.sh b/packaging/alpine/local/seaweedfs/scripts/update-vendor-sources.sh new file mode 100755 index 0000000..14509c9 --- /dev/null +++ b/packaging/alpine/local/seaweedfs/scripts/update-vendor-sources.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail + +package_dir="${PACKAGE_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}" +pkgver="$(awk -F= '$1 == "pkgver" { print $2; exit }' "${package_dir}/APKBUILD")" +tmpdir="$(mktemp -d)" + +cleanup() { + rm -rf "${tmpdir}" +} +trap cleanup EXIT + +curl -fsSL \ + -o "${tmpdir}/seaweedfs-${pkgver}-src.tar.gz" \ + "https://github.com/seaweedfs/seaweedfs/archive/refs/tags/${pkgver}.tar.gz" +tar -xzf "${tmpdir}/seaweedfs-${pkgver}-src.tar.gz" -C "${tmpdir}" +source_dir="${tmpdir}/seaweedfs-${pkgver}" + +( + cd "${source_dir}" + go mod vendor +) +( + cd "${source_dir}/seaweed-worker" + cargo vendor --locked vendor > cargo-vendor-config.toml +) + +tar --sort=name --mtime='@0' --owner=0 --group=0 --numeric-owner \ + -C "${source_dir}" -czf "${package_dir}/seaweedfs-${pkgver}-go-vendor.tar.gz" vendor +tar --sort=name --mtime='@0' --owner=0 --group=0 --numeric-owner \ + -C "${source_dir}/seaweed-worker" \ + -czf "${package_dir}/seaweedfs-${pkgver}-cargo-vendor.tar.gz" \ + vendor cargo-vendor-config.toml diff --git a/packaging/alpine/local/seaweedfs/seaweedfs-4.47-cargo-vendor.tar.gz b/packaging/alpine/local/seaweedfs/seaweedfs-4.47-cargo-vendor.tar.gz new file mode 100644 index 0000000..c181d1f Binary files /dev/null and b/packaging/alpine/local/seaweedfs/seaweedfs-4.47-cargo-vendor.tar.gz differ diff --git a/packaging/alpine/local/seaweedfs/seaweedfs-4.47-go-vendor.tar.gz b/packaging/alpine/local/seaweedfs/seaweedfs-4.47-go-vendor.tar.gz new file mode 100644 index 0000000..8ac82fa Binary files /dev/null and b/packaging/alpine/local/seaweedfs/seaweedfs-4.47-go-vendor.tar.gz differ diff --git a/packaging/alpine/local/seaweedfs/seaweedfs.initd b/packaging/alpine/local/seaweedfs/seaweedfs.initd index bbc4cf6..20507e3 100644 --- a/packaging/alpine/local/seaweedfs/seaweedfs.initd +++ b/packaging/alpine/local/seaweedfs/seaweedfs.initd @@ -52,8 +52,6 @@ build_command_args() { ;; esac - [ -n "${SEAWEEDFS_IP:-}" ] && command_args="$command_args -ip=${SEAWEEDFS_IP}" - [ -n "${SEAWEEDFS_PORT:-}" ] && command_args="$command_args -port=${SEAWEEDFS_PORT}" command_args="$command_args ${SEAWEEDFS_OPTS:-}" } diff --git a/scripts/apk/ci-package-cache.sh b/scripts/apk/ci-package-cache.sh index 80508a3..8117634 100755 --- a/scripts/apk/ci-package-cache.sh +++ b/scripts/apk/ci-package-cache.sh @@ -138,6 +138,7 @@ prepare() { } >> "${GITHUB_ENV}" fi if [[ -n "${GITHUB_OUTPUT:-}" ]]; then + printf 'selected_packages=%s\n' "${ALPINE_PACKAGES}" >> "${GITHUB_OUTPUT}" if [[ -n "${ALPINE_PACKAGES}" ]]; then printf 'packages_selected=true\n' >> "${GITHUB_OUTPUT}" else diff --git a/scripts/apk/merge-ci-artifacts.sh b/scripts/apk/merge-ci-artifacts.sh new file mode 100755 index 0000000..4deada0 --- /dev/null +++ b/scripts/apk/merge-ci-artifacts.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +repo_name="${ALPINE_REPO_NAME:-local}" +arches="${ALPINE_ARCHES:-x86_64 aarch64}" +artifact_root="${APK_CI_ARTIFACTS_DIR:-${repo_root}/packages/worker-artifacts}" +package_root="${APK_CI_PACKAGE_ROOT:-${repo_root}/packages/${repo_name}}" + +require_command() { + command -v "$1" >/dev/null 2>&1 || { + printf 'missing required command: %s\n' "$1" >&2 + exit 2 + } +} + +copy_key() { + local key="$1" + local destination="$2" + local digest + + digest="$(sha256sum "${key}" | awk '{print $1}')" + cp "${key}" "${destination}/${digest}.rsa.pub" +} + +require_command abuild-keygen +require_command abuild-sign +require_command apk + +if [[ ! -d "${artifact_root}" ]]; then + printf 'missing worker artifacts directory: %s\n' "${artifact_root}" >&2 + exit 1 +fi + +rm -rf "${package_root}" +mkdir -p "${package_root}" "${HOME}/.abuild" + +if ! compgen -G "${HOME}/.abuild/*.rsa" > /dev/null; then + abuild-keygen -a -n +fi + +shopt -s nullglob +merge_private_keys=("${HOME}"/.abuild/*.rsa) +merge_public_keys=("${HOME}"/.abuild/*.rsa.pub) +shopt -u nullglob + +if [[ "${#merge_private_keys[@]}" -ne 1 || "${#merge_public_keys[@]}" -ne 1 ]]; then + printf 'expected exactly one merge signing key in %s/.abuild\n' "${HOME}" >&2 + exit 1 +fi + +for arch in ${arches}; do + destination="${package_root}/${arch}" + mkdir -p "${destination}" + + while IFS= read -r -d '' apk; do + cp "${apk}" "${destination}/" + done < <(find "${artifact_root}" -type f -path "*/${arch}/*.apk" -print0) + + shopt -s nullglob + apks=("${destination}"/*.apk) + shopt -u nullglob + if [[ "${#apks[@]}" -eq 0 ]]; then + rmdir "${destination}" + continue + fi + + while IFS= read -r -d '' key; do + copy_key "${key}" "${destination}" + done < <(find "${artifact_root}" -type f -path "*/${arch}/*.rsa.pub" -print0) + copy_key "${merge_public_keys[0]}" "${destination}" + + ( + cd "${destination}" + apk index --rewrite-arch "${arch}" -o APKINDEX.tar.gz ./*.apk + abuild-sign -k "${merge_private_keys[0]}" APKINDEX.tar.gz + ) +done + +if ! compgen -G "${package_root}"/*/*.apk > /dev/null; then + printf 'no APK files found in worker artifacts: %s\n' "${artifact_root}" >&2 + exit 1 +fi