From 1c181c1739739d93ddc2f3b9aae8a878ce972e38 Mon Sep 17 00:00:00 2001 From: Postil Maintainer Date: Sat, 13 Jun 2026 03:44:55 +0000 Subject: [PATCH] Add x86_64 musl prebuilt target; installer accepts musl Add x86_64-unknown-linux-musl to the release build matrix so Alpine and other musl-libc systems get a prebuilt, statically linked binary. The musl leg runs on an ubuntu runner with musl-tools installed for the musl-gcc linker wrapper; packaging, checksum, and cosign keyless signing are identical to the existing targets, producing postil-x86_64-unknown-linux-musl.tar.gz with .sha256, .sig, and .pem. install.sh now detects musl (via ldd --version or the /lib/ld-musl-* loader) and maps to the musl asset instead of refusing the install. The glibc path and the checksum/signature verification flow are unchanged. --- .github/workflows/release.yml | 7 +++++++ ROADMAP.md | 5 ++--- install.sh | 10 +++++++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 42db430..44ee534 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,6 +11,10 @@ jobs: include: - target: x86_64-unknown-linux-gnu os: ubuntu-latest + - target: x86_64-unknown-linux-musl + os: ubuntu-latest + # musl needs the musl-gcc wrapper/linker from musl-tools (Alpine static build). + musl: true - target: aarch64-unknown-linux-gnu os: ubuntu-24.04-arm - target: x86_64-apple-darwin @@ -30,6 +34,9 @@ jobs: - uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} + - name: Install musl toolchain + if: matrix.musl + run: sudo apt-get update && sudo apt-get install -y musl-tools - uses: Swatinem/rust-cache@v2 - run: cargo test --quiet # SHA-pinned: this action handles the OIDC token. diff --git a/ROADMAP.md b/ROADMAP.md index 0b52962..63f51c1 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -17,7 +17,8 @@ - Model cascade + concurrent multi-model consensus over any OpenAI-compatible endpoint; bounded retry with backoff on transient provider errors. - Verified `curl | sh` install script with SHA-256 checksum verification; prebuilt - release binaries for four targets. + release binaries for five targets, including x86_64 musl (Alpine) for static-libc + systems. - Sigstore keyless signing of release artifacts (cosign, GitHub OIDC); the installer verifies the signature when cosign is present and refuses a stripped signature unless explicitly overridden. @@ -36,8 +37,6 @@ - `postil respond` parity on GitLab/Bitbucket/Azure (today it is GitHub-only), and a visible error reply when the hosted bot exhausts its retries (today a dead respond job is only logged). -- musl (Alpine) prebuilt target; the installer currently refuses musl and points at - the source build. - An `/evidence` benchmark: Postil's own silence rate and confirmed-finding rate on public OSS PRs, with raw envelopes. diff --git a/install.sh b/install.sh index 9e40f46..9c8c4dd 100755 --- a/install.sh +++ b/install.sh @@ -47,9 +47,13 @@ case "$arch" in aarch64|arm64) arch_part="aarch64" ;; *) err "unsupported architecture: $arch ($FROM_SOURCE)" ;; esac -# The prebuilt Linux binaries link glibc; a musl libc (Alpine) cannot run them. -if [ "$os" = "Linux" ] && ldd --version 2>&1 | grep -qi musl; then - err "musl libc detected (Alpine?); no musl prebuilt yet ($FROM_SOURCE)" +# glibc and musl binaries are not interchangeable, so pick the matching libc on +# Linux. Alpine and other musl systems report "musl" in `ldd --version`; the +# presence of the musl loader (/lib/ld-musl-*) is a fallback when ldd is absent. +if [ "$os" = "Linux" ]; then + if { ldd --version 2>&1 | grep -qi musl; } || ls /lib/ld-musl-* >/dev/null 2>&1; then + os_part="unknown-linux-musl" + fi fi target="${arch_part}-${os_part}"