ci: optimize workflow\n\n- Combine all test jobs into single matrix\n… #20
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: cel-typescript | |
| MACOSX_DEPLOYMENT_TARGET: '10.13' | |
| on: | |
| push: | |
| branches: | |
| - main | |
| tags: | |
| - 'v*.*.*' | |
| pull_request: | |
| jobs: | |
| build: | |
| if: "!contains(github.event.head_commit.message, 'skip ci')" | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| settings: | |
| - host: macos-latest | |
| target: x86_64-apple-darwin | |
| build: | | |
| npm install | |
| npx @napi-rs/cli build --target x86_64-apple-darwin | |
| strip -x *.node | |
| - host: macos-latest | |
| target: aarch64-apple-darwin | |
| build: | | |
| npm install | |
| npx @napi-rs/cli build --target aarch64-apple-darwin | |
| strip -x *.node | |
| - host: windows-latest | |
| target: x86_64-pc-windows-msvc | |
| build: | | |
| npm install | |
| npx @napi-rs/cli build --target x86_64-pc-windows-msvc | |
| - host: windows-latest | |
| target: aarch64-pc-windows-msvc | |
| build: | | |
| npm install | |
| npx @napi-rs/cli build --target aarch64-pc-windows-msvc | |
| - host: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian | |
| build: | | |
| set -e && | |
| npm install && | |
| npx @napi-rs/cli build --target x86_64-unknown-linux-gnu && | |
| 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 && | |
| npm install && | |
| npx @napi-rs/cli build --target aarch64-unknown-linux-gnu && | |
| aarch64-unknown-linux-gnu-strip *.node | |
| - host: ubuntu-latest | |
| target: aarch64-linux-android | |
| build: | | |
| npm install | |
| npx @napi-rs/cli build --target aarch64-linux-android | |
| ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip *.node | |
| - host: ubuntu-latest | |
| target: armv7-linux-androideabi | |
| build: | | |
| npm install | |
| npx @napi-rs/cli build --target armv7-linux-androideabi | |
| ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip *.node | |
| name: stable - ${{ matrix.settings.target }} - node@18 | |
| runs-on: ${{ matrix.settings.host }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| fetch-depth: 0 | |
| - name: Debug - List submodules | |
| run: | | |
| git submodule status | |
| ls -la | |
| ls -la cel-rust/ | |
| ls -la cel-rust/interpreter/ | |
| shell: bash | |
| - name: Setup node | |
| uses: actions/setup-node@v4 | |
| if: ${{ !matrix.settings.docker }} | |
| with: | |
| node-version: 18 | |
| check-latest: true | |
| cache: npm | |
| - name: Install | |
| uses: dtolnay/rust-toolchain@stable | |
| if: ${{ !matrix.settings.docker }} | |
| with: | |
| 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 | |
| if: ${{ matrix.settings.docker }} | |
| uses: actions-rs/toolchain@v1 | |
| with: | |
| toolchain: stable | |
| target: ${{ matrix.settings.target }} | |
| override: true | |
| - name: Cache NPM dependencies | |
| uses: actions/cache@v4 | |
| with: | |
| path: node_modules | |
| key: npm-cache-${{ matrix.settings.target }}-${{ hashFiles('package-lock.json') }} | |
| - name: Install dependencies | |
| run: npm ci | |
| - 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 | |
| if: ${{ !matrix.settings.docker }} | |
| run: ${{ matrix.settings.build }} | |
| shell: bash | |
| - name: Debug - List files after build | |
| run: | | |
| echo "Current directory:" | |
| pwd | |
| echo "\nFiles in current directory:" | |
| ls -la | |
| echo "\nNode files:" | |
| find . -name "*.node" | |
| shell: bash | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: bindings-${{ matrix.settings.target }} | |
| path: | | |
| *.node | |
| !target/**/*.node | |
| if-no-files-found: error | |
| retention-days: 1 | |
| test: | |
| name: Test ${{ matrix.platform.name }} - node@${{ matrix.node }} | |
| needs: | |
| - build | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| node: ['18', '20'] | |
| platform: | |
| # Native platforms (run directly) | |
| - name: macOS x64 | |
| runner: macos-latest | |
| target: x86_64-apple-darwin | |
| docker: false | |
| - name: Windows x64 | |
| runner: windows-latest | |
| target: x86_64-pc-windows-msvc | |
| docker: false | |
| # Linux platforms (run in Docker) | |
| - name: Linux x64 | |
| runner: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| docker: true | |
| - name: Linux ARM64 | |
| runner: ubuntu-latest | |
| target: aarch64-unknown-linux-gnu | |
| docker: true | |
| qemu: arm64 | |
| # Android platforms | |
| - name: Android ARM64 | |
| runner: ubuntu-latest | |
| target: aarch64-linux-android | |
| android: true | |
| - name: Android ARM v7 | |
| runner: ubuntu-latest | |
| target: armv7-linux-androideabi | |
| android: true | |
| runs-on: ${{ matrix.platform.runner }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| fetch-depth: 0 | |
| - name: Setup node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| check-latest: true | |
| cache: npm | |
| - name: Cache dependencies | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| node_modules | |
| ~/.cargo/registry/index/ | |
| ~/.cargo/registry/cache/ | |
| ~/.cargo/git/db/ | |
| .cargo-cache | |
| target/ | |
| key: deps-${{ matrix.platform.target }}-${{ matrix.node }}-${{ hashFiles('package-lock.json', '**/Cargo.lock') }} | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Setup QEMU | |
| if: matrix.platform.qemu | |
| uses: docker/setup-qemu-action@v3 | |
| with: | |
| platforms: ${{ matrix.platform.qemu }} | |
| - name: Install Android NDK | |
| if: matrix.platform.android | |
| run: | | |
| wget https://dl.google.com/android/repository/android-ndk-r25c-linux.zip | |
| unzip android-ndk-r25c-linux.zip | |
| echo "ANDROID_NDK_HOME=$PWD/android-ndk-r25c" >> $GITHUB_ENV | |
| - name: Download artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: bindings-${{ matrix.platform.target }} | |
| path: . | |
| - name: List files | |
| run: ls -R . | |
| shell: bash | |
| - name: Test bindings (native) | |
| if: "!matrix.platform.docker" | |
| run: npm test | |
| - name: Test bindings (Docker) | |
| if: matrix.platform.docker | |
| run: | | |
| docker run --rm ${{ matrix.platform.qemu && format('--platform linux/{0}', matrix.platform.qemu) || '' }} \ | |
| -v $(pwd):/build -w /build node:${{ matrix.node }}-slim bash -c ' | |
| # Install Rust | |
| apt-get update && apt-get install -y curl build-essential | |
| curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y | |
| export PATH="/root/.cargo/bin:$PATH" | |
| # Run tests | |
| npm test | |
| ' | |
| publish: | |
| name: Publish | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| id-token: write | |
| if: startsWith(github.ref, 'refs/tags/v') | |
| needs: | |
| - build | |
| - test | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| fetch-depth: 0 | |
| - name: Debug - List submodules | |
| run: | | |
| git submodule status | |
| ls -la | |
| ls -la cel-rust/ | |
| ls -la cel-rust/interpreter/ | |
| shell: bash | |
| - name: Setup node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 18 | |
| check-latest: true | |
| cache: npm | |
| - name: Cache NPM dependencies | |
| uses: actions/cache@v4 | |
| with: | |
| path: node_modules | |
| key: npm-cache-ubuntu-latest-${{ hashFiles('package-lock.json') }} | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Download all artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: artifacts | |
| pattern: bindings-* | |
| merge-multiple: true | |
| - name: Move artifacts | |
| run: | | |
| mkdir -p dist | |
| for artifact in artifacts/bindings-*; do | |
| mv $artifact/*.node . | |
| done | |
| - name: List files | |
| run: | | |
| echo "Root directory:" | |
| ls -la | |
| echo "\nNode files:" | |
| find . -name "*.node" | |
| shell: bash | |
| - name: Build TypeScript | |
| run: npm run build:ts | |
| - name: Verify package contents | |
| run: | | |
| echo "Package contents:" | |
| npm pack --dry-run | |
| - name: Publish | |
| env: | |
| NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
| run: | | |
| if [ -z "$NODE_AUTH_TOKEN" ]; then | |
| echo "NPM_TOKEN is not set, skipping publish" | |
| exit 0 | |
| fi | |
| npm publish --access public --provenance |