From eb1dec0698b5fdc16962b2c377aadd56b07c722c Mon Sep 17 00:00:00 2001 From: Tiago Granelli Ribeiro Date: Tue, 29 Sep 2026 00:40:03 +0200 Subject: [PATCH 1/2] cli: exit 1 when the npm wrapper fails to spawn squawk #1130 added this exit, but it was dropped when the wrapper moved to js/index.js in #1133. Without it a spawn error (for example the glibc binary on Alpine) prints the error and exits 0, so CI passes without linting anything. --- js/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/index.js b/js/index.js index 5c1b37cb9..b91009b22 100644 --- a/js/index.js +++ b/js/index.js @@ -50,6 +50,7 @@ function run() { child.on("error", (err) => { console.error("error: failed to invoke squawk") console.error(err.stack) + process.exit(1) }) child.on("exit", (code) => { From 26c4768f45559a076657e98ace8afd421faada37 Mon Sep 17 00:00:00 2001 From: Tiago Granelli Ribeiro Date: Tue, 29 Sep 2026 00:40:03 +0200 Subject: [PATCH 2/2] npm: publish the musl builds as platform packages The release already builds squawk-linux-musl-x64 and squawk-linux-musl-arm64, but they weren't published to npm, so `npm install squawk-cli` on Alpine got the glibc binary, which can't run. Add @squawk-cli/linux-x64-musl and @squawk-cli/linux-arm64-musl with "libc": ["musl"], mark the existing linux packages as glibc, and pick the musl package in the wrapper when running on musl. --- .github/workflows/rust.yml | 8 +++++--- crates/xtask/src/update_version.rs | 2 ++ js/index.js | 19 ++++++++++++++++++- npm/linux-arm64-musl/package.json | 19 +++++++++++++++++++ npm/linux-arm64/package.json | 3 +++ npm/linux-x64-musl/package.json | 19 +++++++++++++++++++ npm/linux-x64/package.json | 3 +++ package.json | 4 ++++ pnpm-lock.yaml | 2 ++ 9 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 npm/linux-arm64-musl/package.json create mode 100644 npm/linux-x64-musl/package.json diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index eceae1727..1aaa357fa 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -229,18 +229,20 @@ jobs: - name: Stage platform binaries run: | set -euo pipefail - mkdir -p npm/darwin-x64/bin npm/darwin-arm64/bin npm/linux-x64/bin npm/linux-arm64/bin npm/win32-x64/bin + mkdir -p npm/darwin-x64/bin npm/darwin-arm64/bin npm/linux-x64/bin npm/linux-arm64/bin npm/linux-x64-musl/bin npm/linux-arm64-musl/bin npm/win32-x64/bin cp artifacts/release-squawk-darwin-x64/squawk-darwin-x64 npm/darwin-x64/bin/squawk cp artifacts/release-squawk-darwin-arm64/squawk-darwin-arm64 npm/darwin-arm64/bin/squawk cp artifacts/release-squawk-linux-x64/squawk-linux-x64 npm/linux-x64/bin/squawk cp artifacts/release-squawk-linux-arm64/squawk-linux-arm64 npm/linux-arm64/bin/squawk + cp artifacts/release-squawk-linux-musl-x64/squawk-linux-musl-x64 npm/linux-x64-musl/bin/squawk + cp artifacts/release-squawk-linux-musl-arm64/squawk-linux-musl-arm64 npm/linux-arm64-musl/bin/squawk cp artifacts/release-squawk-windows-x64.exe/squawk-windows-x64.exe npm/win32-x64/bin/squawk.exe - chmod +x npm/darwin-x64/bin/squawk npm/darwin-arm64/bin/squawk npm/linux-x64/bin/squawk npm/linux-arm64/bin/squawk + chmod +x npm/darwin-x64/bin/squawk npm/darwin-arm64/bin/squawk npm/linux-x64/bin/squawk npm/linux-arm64/bin/squawk npm/linux-x64-musl/bin/squawk npm/linux-arm64-musl/bin/squawk - name: Publish packages run: | set -euo pipefail - for pkg in darwin-x64 darwin-arm64 linux-x64 linux-arm64 win32-x64; do + for pkg in darwin-x64 darwin-arm64 linux-x64 linux-arm64 linux-x64-musl linux-arm64-musl win32-x64; do (cd "npm/$pkg" && npm publish --access public --provenance) done npm publish --access public --provenance diff --git a/crates/xtask/src/update_version.rs b/crates/xtask/src/update_version.rs index c64857662..af6a43a97 100644 --- a/crates/xtask/src/update_version.rs +++ b/crates/xtask/src/update_version.rs @@ -117,7 +117,9 @@ fn update_versions(sh: &Shell, v: &str) -> Result<()> { "darwin-arm64", "darwin-x64", "linux-arm64", + "linux-arm64-musl", "linux-x64", + "linux-x64-musl", "win32-x64", ] { replace_in_file( diff --git a/js/index.js b/js/index.js index b91009b22..43c5a9080 100644 --- a/js/index.js +++ b/js/index.js @@ -1,6 +1,7 @@ "use strict" const childProcess = require("child_process") +const fs = require("fs") /** @type {Record} */ const PLATFORM_PACKAGES = { @@ -8,11 +9,27 @@ const PLATFORM_PACKAGES = { "darwin-arm64": "@squawk-cli/darwin-arm64", "linux-x64": "@squawk-cli/linux-x64", "linux-arm64": "@squawk-cli/linux-arm64", + "linux-x64-musl": "@squawk-cli/linux-x64-musl", + "linux-arm64-musl": "@squawk-cli/linux-arm64-musl", "win32-x64": "@squawk-cli/win32-x64", } +function isMusl() { + // same order as detect-libc, process.report can be slow + try { + return fs.readFileSync("/usr/bin/ldd", "utf8").includes("musl") + } catch { + /** @type {any} */ + const report = process.report?.getReport() + return !report?.header.glibcVersionRuntime + } +} + function getBinaryPath() { - const key = `${process.platform}-${process.arch}` + let key = `${process.platform}-${process.arch}` + if (process.platform === "linux" && isMusl()) { + key += "-musl" + } const pkg = PLATFORM_PACKAGES[key] if (!pkg) { throw new Error( diff --git a/npm/linux-arm64-musl/package.json b/npm/linux-arm64-musl/package.json new file mode 100644 index 000000000..f0d47d56f --- /dev/null +++ b/npm/linux-arm64-musl/package.json @@ -0,0 +1,19 @@ +{ + "name": "@squawk-cli/linux-arm64-musl", + "version": "2.66.0", + "description": "squawk-cli binary for linux-arm64-musl", + "repository": "git@github.com:sbdchd/squawk.git", + "license": "(Apache-2.0 OR MIT)", + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "files": [ + "bin/squawk" + ] +} diff --git a/npm/linux-arm64/package.json b/npm/linux-arm64/package.json index 989442dfe..48bbc2d92 100644 --- a/npm/linux-arm64/package.json +++ b/npm/linux-arm64/package.json @@ -10,6 +10,9 @@ "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "files": [ "bin/squawk" ] diff --git a/npm/linux-x64-musl/package.json b/npm/linux-x64-musl/package.json new file mode 100644 index 000000000..73b1987ca --- /dev/null +++ b/npm/linux-x64-musl/package.json @@ -0,0 +1,19 @@ +{ + "name": "@squawk-cli/linux-x64-musl", + "version": "2.66.0", + "description": "squawk-cli binary for linux-x64-musl", + "repository": "git@github.com:sbdchd/squawk.git", + "license": "(Apache-2.0 OR MIT)", + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "files": [ + "bin/squawk" + ] +} diff --git a/npm/linux-x64/package.json b/npm/linux-x64/package.json index 3600dacee..f29de07f7 100644 --- a/npm/linux-x64/package.json +++ b/npm/linux-x64/package.json @@ -10,6 +10,9 @@ "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "files": [ "bin/squawk" ] diff --git a/package.json b/package.json index ccad463bf..3a974bd3a 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,9 @@ "@squawk-cli/darwin-arm64": "2.66.0", "@squawk-cli/darwin-x64": "2.66.0", "@squawk-cli/linux-arm64": "2.66.0", + "@squawk-cli/linux-arm64-musl": "2.66.0", "@squawk-cli/linux-x64": "2.66.0", + "@squawk-cli/linux-x64-musl": "2.66.0", "@squawk-cli/win32-x64": "2.66.0" }, "volta": { @@ -45,7 +47,9 @@ "@squawk-cli/darwin-arm64", "@squawk-cli/darwin-x64", "@squawk-cli/linux-arm64", + "@squawk-cli/linux-arm64-musl", "@squawk-cli/linux-x64", + "@squawk-cli/linux-x64-musl", "@squawk-cli/win32-x64" ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 22e390b30..73b6f9ffa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1138,7 +1138,9 @@ ignoredOptionalDependencies: - '@squawk-cli/darwin-arm64' - '@squawk-cli/darwin-x64' - '@squawk-cli/linux-arm64' + - '@squawk-cli/linux-arm64-musl' - '@squawk-cli/linux-x64' + - '@squawk-cli/linux-x64-musl' - '@squawk-cli/win32-x64' snapshots: