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}"