fix: windows use bun correctly #92
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| env: | |
| DEBUG: napi:* | |
| APP_NAME: bum | |
| MACOSX_DEPLOYMENT_TARGET: "10.13" | |
| permissions: | |
| contents: write | |
| id-token: write | |
| "on": | |
| push: | |
| branches: | |
| - main | |
| tags: | |
| - "v[0-9]+.[0-9]+.[0-9]+" | |
| pull_request: | |
| paths-ignore: | |
| - "**/*.md" | |
| - LICENSE | |
| - "**/*.gitignore" | |
| - .editorconfig | |
| - docs/** | |
| jobs: | |
| test: | |
| name: Test | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Cache cargo | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry/index/ | |
| ~/.cargo/registry/cache/ | |
| ~/.cargo/git/db/ | |
| target/ | |
| key: test-cargo-${{ hashFiles('**/Cargo.lock') }} | |
| - name: Run tests | |
| run: cargo test --lib | |
| - name: Run clippy | |
| run: cargo clippy -- -D warnings | |
| - name: Check formatting | |
| run: cargo fmt --check | |
| build: | |
| needs: test | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| settings: | |
| - host: macos-13 | |
| target: x86_64-apple-darwin | |
| build: | | |
| bun run build --target x86_64-apple-darwin | |
| strip -x *.node | |
| - host: windows-latest | |
| build: bun run build | |
| target: x86_64-pc-windows-msvc | |
| - host: macos-latest | |
| target: aarch64-apple-darwin | |
| build: | | |
| bun run build --target aarch64-apple-darwin | |
| strip -x *.node | |
| - host: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian | |
| build: |- | |
| set -e && | |
| corepack enable && | |
| npm install -g bun && | |
| bun install && | |
| bun run build --target x86_64-unknown-linux-gnu && | |
| strip *.node | |
| - host: ubuntu-latest | |
| target: x86_64-unknown-linux-musl | |
| docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine | |
| build: |- | |
| set -e && | |
| corepack enable && | |
| npm install -g bun && | |
| bun install && | |
| bun run build && | |
| strip *.node | |
| - host: ubuntu-latest | |
| target: aarch64-unknown-linux-gnu | |
| docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 | |
| build: |- | |
| set -e && | |
| corepack enable && | |
| npm install -g bun && | |
| bun install && | |
| bun run build --target aarch64-unknown-linux-gnu && | |
| aarch64-unknown-linux-gnu-strip *.node | |
| - host: ubuntu-latest | |
| target: aarch64-unknown-linux-musl | |
| docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine | |
| build: |- | |
| set -e && | |
| rustup target add aarch64-unknown-linux-musl && | |
| corepack enable && | |
| npm install -g bun && | |
| bun install && | |
| CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=/aarch64-linux-musl-cross/bin/aarch64-linux-musl-gcc CC_aarch64_unknown_linux_musl=/aarch64-linux-musl-cross/bin/aarch64-linux-musl-gcc bun run build --target aarch64-unknown-linux-musl && | |
| /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node | |
| name: stable - ${{ matrix.settings.target }} - node@22 | |
| runs-on: ${{ matrix.settings.host }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup node | |
| uses: actions/setup-node@v4 | |
| if: ${{ !matrix.settings.docker }} | |
| with: | |
| node-version: 22 | |
| - name: Install Bum (Unix) | |
| if: ${{ !matrix.settings.docker && runner.os != 'Windows' }} | |
| run: | | |
| curl -fsSL https://github.com/owenizedd/bum/raw/main/install.sh | bash | |
| echo "$HOME/.bum/bin" >> $GITHUB_PATH | |
| echo "$HOME/.bun/bin" >> $GITHUB_PATH | |
| shell: bash | |
| - name: Setup Bun (Windows - fallback to official installer) | |
| if: ${{ !matrix.settings.docker && runner.os == 'Windows' }} | |
| uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: "1.3.0" | |
| - name: Use Bun via Bum (Unix) | |
| if: ${{ !matrix.settings.docker && runner.os != 'Windows' }} | |
| run: | | |
| export PATH="$HOME/.bum/bin:$PATH" | |
| bum use 1.3.0 | |
| shell: bash | |
| - name: Install | |
| uses: dtolnay/rust-toolchain@stable | |
| if: ${{ !matrix.settings.docker }} | |
| with: | |
| toolchain: stable | |
| targets: ${{ matrix.settings.target }} | |
| - name: Cache cargo | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry/index/ | |
| ~/.cargo/registry/cache/ | |
| ~/.cargo/git/db/ | |
| .cargo-cache | |
| target/ | |
| key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} | |
| - uses: goto-bus-stop/setup-zig@v2 | |
| if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' }} | |
| with: | |
| version: 0.11.0 | |
| - name: Setup toolchain | |
| run: ${{ matrix.settings.setup }} | |
| if: ${{ matrix.settings.setup }} | |
| shell: bash | |
| - name: Setup node x86 | |
| if: matrix.settings.target == 'i686-pc-windows-msvc' | |
| run: bun config set supportedArchitectures.cpu "ia32" | |
| shell: bash | |
| - name: Setup node x86 architecture | |
| uses: actions/setup-node@v4 | |
| if: matrix.settings.target == 'i686-pc-windows-msvc' | |
| with: | |
| node-version: 22 | |
| architecture: x86 | |
| - name: Install dependencies | |
| run: bun install | |
| if: ${{ !matrix.settings.docker }} | |
| - name: Build in docker | |
| uses: addnab/docker-run-action@v3 | |
| if: ${{ matrix.settings.docker }} | |
| with: | |
| image: ${{ matrix.settings.docker }} | |
| options: "--user 0:0 -v ${{ github.workspace }}/.cargo-cache/git/db:/usr/local/cargo/git/db -v ${{ github.workspace }}/.cargo/registry/cache:/usr/local/cargo/registry/cache -v ${{ github.workspace }}/.cargo/registry/index:/usr/local/cargo/registry/index -v ${{ github.workspace }}:/build -w /build" | |
| run: ${{ matrix.settings.build }} | |
| - name: Build | |
| run: ${{ matrix.settings.build }} | |
| if: ${{ !matrix.settings.docker }} | |
| shell: bash | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: bindings-${{ matrix.settings.target }} | |
| path: ${{ env.APP_NAME }}.*.node | |
| if-no-files-found: error | |
| universal-macOS: | |
| name: Build universal macOS binary | |
| needs: | |
| - build | |
| runs-on: macos-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| - name: Install Bum | |
| run: | | |
| curl -fsSL https://github.com/owenizedd/bum/raw/main/install.sh | bash | |
| echo "$HOME/.bum/bin" >> $GITHUB_PATH | |
| echo "$HOME/.bun/bin" >> $GITHUB_PATH | |
| shell: bash | |
| - name: Use Bun via Bum | |
| run: | | |
| export PATH="$HOME/.bum/bin:$PATH" | |
| bum use 1.3.0 | |
| shell: bash | |
| - name: Install dependencies | |
| run: bun install | |
| - name: Download macOS x64 artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: bindings-x86_64-apple-darwin | |
| path: artifacts | |
| - name: Download macOS arm64 artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: bindings-aarch64-apple-darwin | |
| path: artifacts | |
| - name: List downloaded files | |
| run: | | |
| echo "Current directory: $(pwd)" | |
| ls -la artifacts/ | |
| - name: Move artifacts to root | |
| run: | | |
| mv artifacts/*.node . | |
| ls -la *.node | |
| - name: Clean up hashed files | |
| run: | | |
| echo "Removing hashed files..." | |
| rm -f bum.darwin-*-*.node | |
| echo "Files after cleanup:" | |
| ls -la *.node | |
| - name: Combine binaries | |
| run: | | |
| bun run universal | |
| ls -la *.node | |
| - name: Clean up individual arch files before upload | |
| run: | | |
| echo "Removing individual arch files to avoid duplicates..." | |
| rm -f bum.darwin-x64.node bum.darwin-arm64.node | |
| echo "Files to be uploaded:" | |
| ls -la *.node | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: bindings-universal-apple-darwin | |
| path: ${{ env.APP_NAME }}.*.node | |
| if-no-files-found: error | |
| publish: | |
| name: Publish | |
| runs-on: ubuntu-latest | |
| needs: | |
| - build | |
| - universal-macOS | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| - name: Setup Bun | |
| uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: "1.3.0" | |
| - name: Install dependencies | |
| run: bun install | |
| - name: Download all artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: artifacts | |
| - name: List artifacts structure | |
| run: | | |
| echo "Artifacts structure:" | |
| ls -R artifacts/ | |
| - name: Clean up hashed files | |
| run: | | |
| echo "Removing hashed .node files (format: platform-HASH.node)..." | |
| # Remove files like: bum.darwin-arm64-abc123.node | |
| # Keep files like: bum.darwin-arm64.node, bum.linux-x64-gnu.node | |
| find artifacts -type f -name "*.node" | while read file; do | |
| basename=$(basename "$file") | |
| # If filename has more than 3 dashes (e.g. bum.darwin-arm64-HASH.node has 3 dashes) | |
| # and ends with a hash pattern, remove it | |
| if echo "$basename" | grep -E '.*-[a-z0-9]{8}\.node$' > /dev/null; then | |
| echo "Removing: $basename" | |
| rm "$file" | |
| fi | |
| done | |
| echo "Remaining .node files:" | |
| find artifacts -name "*.node" -type f | |
| - name: Move artifacts to npm folders | |
| run: | | |
| # Move each platform's .node file to the correct npm/ folder | |
| for artifact_dir in artifacts/bindings-*/; do | |
| platform=$(basename "$artifact_dir" | sed 's/bindings-//') | |
| node_file=$(find "$artifact_dir" -name "*.node" -type f | head -1) | |
| if [ -n "$node_file" ]; then | |
| # Map platform name to npm folder name | |
| case "$platform" in | |
| "aarch64-apple-darwin") npm_dir="darwin-arm64" ;; | |
| "x86_64-apple-darwin") npm_dir="darwin-x64" ;; | |
| "universal-apple-darwin") npm_dir="darwin-universal" ;; | |
| "x86_64-unknown-linux-gnu") npm_dir="linux-x64-gnu" ;; | |
| "x86_64-unknown-linux-musl") npm_dir="linux-x64-musl" ;; | |
| "aarch64-unknown-linux-gnu") npm_dir="linux-arm64-gnu" ;; | |
| "aarch64-unknown-linux-musl") npm_dir="linux-arm64-musl" ;; | |
| "x86_64-pc-windows-msvc") npm_dir="win32-x64-msvc" ;; | |
| *) echo "Unknown platform: $platform"; continue ;; | |
| esac | |
| cp "$node_file" "npm/$npm_dir/" | |
| echo "✅ Copied $(basename $node_file) to npm/$npm_dir/" | |
| fi | |
| done | |
| - name: Verify npm folders | |
| run: | | |
| echo "Checking npm folders:" | |
| for dir in npm/*/; do | |
| echo "📁 $dir" | |
| ls -lh "$dir"*.node 2>/dev/null || echo " ⚠️ No .node file" | |
| done | |
| - name: Sync platform package versions | |
| run: | | |
| VERSION=$(node -p "require('./package.json').version") | |
| echo "Syncing platform packages to version $VERSION" | |
| for dir in npm/*/; do | |
| # Update version in each platform package.json | |
| node -e " | |
| const fs = require('fs'); | |
| const pkg = JSON.parse(fs.readFileSync('$dir/package.json')); | |
| pkg.version = '$VERSION'; | |
| fs.writeFileSync('$dir/package.json', JSON.stringify(pkg, null, 2) + '\n'); | |
| " | |
| echo "✅ Updated $(basename $dir) to $VERSION" | |
| done | |
| - name: Publish platform packages | |
| run: | | |
| echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc | |
| for dir in npm/*/; do | |
| platform=$(basename "$dir") | |
| if [ -f "$dir"/*.node ]; then | |
| echo "📦 Publishing @owenizedd/bum-$platform..." | |
| cd "$dir" | |
| if npm publish --access public 2>&1 | tee publish.log; then | |
| echo "✅ Published @owenizedd/bum-$platform" | |
| else | |
| if grep -q "cannot publish over the previously published\|You cannot publish over previously published versions" publish.log; then | |
| echo "⚠️ @owenizedd/bum-$platform already published, skipping..." | |
| else | |
| echo "❌ Failed to publish @owenizedd/bum-$platform" | |
| cat publish.log | |
| exit 1 | |
| fi | |
| fi | |
| cd ../.. | |
| else | |
| echo "⚠️ Skipping $platform (no .node file)" | |
| fi | |
| done | |
| env: | |
| NPM_TOKEN: ${{ secrets.NPM_TOKEN }} | |
| - name: List packages | |
| run: ls -R ./npm | |
| shell: bash | |
| - name: Test npm package locally | |
| run: | | |
| echo "Testing main package bin.js..." | |
| # Copy bin.js and index.js to a platform folder and test there | |
| cp bin.js index.js index.d.ts npm/linux-x64-gnu/ | |
| cd npm/linux-x64-gnu | |
| node bin.js --version || (echo "❌ bin.js failed" && exit 1) | |
| echo "✅ bin.js works correctly" | |
| - name: Publish | |
| run: | | |
| npm config set provenance true | |
| if git describe --exact-match --tags HEAD 2>/dev/null | grep "^v[0-9]\+\.[0-9]\+\.[0-9]\+$"; | |
| then | |
| echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc | |
| # Try to publish, but don't fail if version already exists | |
| if npm publish --access public 2>&1 | tee publish.log; then | |
| echo "✅ Published successfully" | |
| else | |
| if grep -q "cannot publish over the previously published" publish.log || grep -q "You cannot publish over previously published versions" publish.log; then | |
| echo "⚠️ Version already published, skipping..." | |
| exit 0 | |
| else | |
| echo "❌ Publish failed with unexpected error" | |
| cat publish.log | |
| exit 1 | |
| fi | |
| fi | |
| else | |
| echo "Not a release tag, skipping publish" | |
| fi | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| NPM_TOKEN: ${{ secrets.NPM_TOKEN }} |