name: Build Graph Node Native Modules on: push: branches: [main] paths: - 'crates/ruvector-graph/**' - 'crates/ruvector-graph-node/**' - 'npm/packages/graph-node/**' - '.github/workflows/build-graph-node.yml' tags: - 'v*' pull_request: branches: [main] paths: - 'crates/ruvector-graph/**' - 'crates/ruvector-graph-node/**' - 'npm/packages/graph-node/**' workflow_dispatch: inputs: publish: description: 'Publish to npm after build' required: false type: boolean default: false env: CARGO_TERM_COLOR: always jobs: build: strategy: fail-fast: false matrix: settings: - host: ubuntu-22.04 target: x86_64-unknown-linux-gnu platform: linux-x64-gnu - host: ubuntu-22.04 target: aarch64-unknown-linux-gnu platform: linux-arm64-gnu - host: macos-14 target: x86_64-apple-darwin platform: darwin-x64 - host: macos-14 target: aarch64-apple-darwin platform: darwin-arm64 - host: windows-2022 target: x86_64-pc-windows-msvc platform: win32-x64-msvc name: Build Graph ${{ matrix.settings.platform }} runs-on: ${{ matrix.settings.host }} steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' - name: Setup Rust uses: dtolnay/rust-toolchain@stable with: toolchain: stable targets: ${{ matrix.settings.target }} - name: Cache Rust uses: Swatinem/rust-cache@v2 with: key: graph-node-${{ matrix.settings.target }} - name: Install cross-compilation tools (Linux ARM64) if: matrix.settings.platform == 'linux-arm64-gnu' run: | sudo apt-get update sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu - name: Install dependencies working-directory: npm/packages/graph-node run: npm install --ignore-scripts --omit=optional --force - name: Build native module working-directory: npm/packages/graph-node run: | npx napi build --platform --release --cargo-cwd ../../../crates/ruvector-graph-node --target ${{ matrix.settings.target }} env: CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc - name: Find built .node files (debug) shell: bash run: | echo "=== Searching for Graph .node files ===" find npm/packages/graph-node -name "*.node" -type f 2>/dev/null || true - name: Prepare artifact shell: bash run: | mkdir -p graph-artifacts/${{ matrix.settings.platform }} NODE_FILE=$(find npm/packages/graph-node -name "index.*.node" -type f | head -1) if [ -z "$NODE_FILE" ]; then echo "ERROR: No .node file found" find npm/packages/graph-node -name "*.node" -type f exit 1 fi echo "Found: $NODE_FILE" cp -v "$NODE_FILE" "graph-artifacts/${{ matrix.settings.platform }}/" - name: Test native module (native platform only) if: | (matrix.settings.platform == 'linux-x64-gnu' && runner.os == 'Linux') || (matrix.settings.platform == 'darwin-x64' && runner.os == 'macOS' && runner.arch == 'X64') || (matrix.settings.platform == 'darwin-arm64' && runner.os == 'macOS' && runner.arch == 'ARM64') || (matrix.settings.platform == 'win32-x64-msvc' && runner.os == 'Windows') continue-on-error: true working-directory: npm/packages/graph-node run: npm test - name: Upload artifact uses: actions/upload-artifact@v4 with: name: graph-node-${{ matrix.settings.platform }} path: graph-artifacts/${{ matrix.settings.platform }}/*.node if-no-files-found: error publish: name: Publish Graph Node Platform Packages runs-on: ubuntu-22.04 needs: build if: inputs.publish == true || startsWith(github.ref, 'refs/tags/v') steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' registry-url: 'https://registry.npmjs.org' - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Copy binaries to package run: | for dir in artifacts/graph-node-*/; do platform=$(basename "$dir" | sed 's/graph-node-//') NODE_FILE=$(find "$dir" -name "*.node" | head -1) if [ -n "$NODE_FILE" ]; then cp -v "$NODE_FILE" "npm/packages/graph-node/index.${platform}.node" fi done ls -la npm/packages/graph-node/*.node - name: Publish platform packages working-directory: npm/packages/graph-node env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: node scripts/publish-platforms.js - name: Publish main package working-directory: npm/packages/graph-node env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: npm publish --access public || echo "Package may already exist"