Fix artifacts: Copy .node files to npm folders instead of using napi … #62
Workflow file for this run
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:napi --target x86_64-apple-darwin | |
| bun run build:bin | |
| 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:napi --target aarch64-apple-darwin | |
| bun run build:bin | |
| 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:napi --target x86_64-unknown-linux-gnu && | |
| bun run build:bin && | |
| 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:napi --target aarch64-unknown-linux-gnu && | |
| bun run build:bin && | |
| 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:napi --target aarch64-unknown-linux-musl && | |
| bun run build:bin && | |
| /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: 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: 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 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..." | |
| find artifacts -name "*.node" -name "*-*-*.node" -type f -delete | |
| 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: List packages | |
| run: ls -R ./npm | |
| shell: bash | |
| - 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 }} |