ci: prepare build #7
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: enigo | |
| MACOSX_DEPLOYMENT_TARGET: "10.13" | |
| CARGO_INCREMENTAL: "1" | |
| permissions: | |
| contents: write | |
| id-token: write | |
| "on": | |
| push: | |
| branches: | |
| - main | |
| tags-ignore: | |
| - "**" | |
| paths-ignore: | |
| - "**/*.md" | |
| - LICENSE | |
| - "**/*.gitignore" | |
| - .editorconfig | |
| - docs/** | |
| pull_request: null | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| lint: | |
| name: Lint | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: setup system dependencies | |
| run: sudo apt-get update && sudo apt-get install -y libxdo-dev libxkbcommon-dev libxi-dev libxtst-dev | |
| - name: setup pnpm | |
| uses: pnpm/action-setup@v5 | |
| - name: Setup node | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: 22 | |
| cache: pnpm | |
| - name: Install | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| components: clippy, rustfmt | |
| - name: Install dependencies | |
| run: pnpm install | |
| - name: ESLint | |
| run: pnpm lint | |
| - name: Cargo fmt | |
| run: cargo fmt -- --check | |
| - name: Clippy | |
| run: cargo clippy | |
| build: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| settings: | |
| - host: macos-latest | |
| target: x86_64-apple-darwin | |
| build: pnpm build --target x86_64-apple-darwin | |
| - host: windows-latest | |
| build: pnpm build --target x86_64-pc-windows-msvc | |
| target: x86_64-pc-windows-msvc | |
| - host: windows-latest | |
| build: pnpm build --target i686-pc-windows-msvc | |
| target: i686-pc-windows-msvc | |
| - host: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| build: pnpm build --target x86_64-unknown-linux-gnu | |
| - host: macos-latest | |
| target: aarch64-apple-darwin | |
| build: pnpm build --target aarch64-apple-darwin | |
| - host: ubuntu-24.04-arm | |
| target: aarch64-unknown-linux-gnu | |
| build: pnpm build --target aarch64-unknown-linux-gnu | |
| - host: ubuntu-latest | |
| target: armv7-unknown-linux-gnueabihf | |
| build: pnpm build --target armv7-unknown-linux-gnueabihf --use-cross | |
| - host: windows-latest | |
| target: aarch64-pc-windows-msvc | |
| build: pnpm build --target aarch64-pc-windows-msvc | |
| name: stable - ${{ matrix.settings.target }} - node@24 | |
| runs-on: ${{ matrix.settings.host }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: setup system dependencies | |
| run: sudo apt-get update && sudo apt-get install -y libxdo-dev libxkbcommon-dev libxi-dev libxtst-dev | |
| if: ${{ matrix.settings.target == 'x86_64-unknown-linux-gnu' || matrix.settings.target == 'aarch64-unknown-linux-gnu' }} | |
| - name: setup pnpm | |
| uses: pnpm/action-setup@v5 | |
| - name: Setup node | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: 24 | |
| cache: pnpm | |
| - name: Install | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| toolchain: stable | |
| targets: ${{ matrix.settings.target }} | |
| - name: Cache cargo | |
| uses: actions/cache@v5 | |
| with: | |
| path: | | |
| ~/.cargo/registry/index/ | |
| ~/.cargo/registry/cache/ | |
| ~/.cargo/git/db/ | |
| ~/.napi-rs | |
| .cargo-cache | |
| target/ | |
| key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} | |
| - uses: mlugg/setup-zig@v2 | |
| if: ${{ contains(matrix.settings.target, 'musl') }} | |
| with: | |
| version: 0.15.2 | |
| - name: Install cross | |
| uses: taiki-e/install-action@v2 | |
| if: ${{ contains(matrix.settings.build, '--use-cross') }} | |
| env: | |
| GITHUB_TOKEN: ${{ github.token }} | |
| with: | |
| tool: cross | |
| - name: Setup toolchain | |
| run: ${{ matrix.settings.setup }} | |
| if: ${{ matrix.settings.setup }} | |
| shell: bash | |
| - name: Install dependencies | |
| run: pnpm install | |
| - name: Setup node x86 | |
| uses: actions/setup-node@v6 | |
| if: matrix.settings.target == 'i686-pc-windows-msvc' | |
| with: | |
| node-version: 22 | |
| cache: pnpm | |
| architecture: x86 | |
| - name: Build | |
| run: ${{ matrix.settings.build }} | |
| shell: bash | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@v7 | |
| if: matrix.settings.target != 'wasm32-wasip1-threads' | |
| with: | |
| name: bindings-${{ matrix.settings.target }} | |
| path: "*.node" | |
| if-no-files-found: error | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@v7 | |
| if: matrix.settings.target == 'wasm32-wasip1-threads' | |
| with: | |
| name: bindings-${{ matrix.settings.target }} | |
| path: "*.wasm" | |
| if-no-files-found: error | |
| test-macOS-windows-binding: | |
| name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} | |
| needs: | |
| - build | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| settings: | |
| - host: windows-latest | |
| target: x86_64-pc-windows-msvc | |
| architecture: x64 | |
| - host: macos-latest | |
| target: x86_64-apple-darwin | |
| architecture: x64 | |
| - host: macos-latest | |
| target: aarch64-apple-darwin | |
| architecture: arm64 | |
| node: | |
| - "22" | |
| - "24" | |
| runs-on: ${{ matrix.settings.host }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: setup pnpm | |
| uses: pnpm/action-setup@v5 | |
| - name: Setup node | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| cache: pnpm | |
| architecture: ${{ matrix.settings.architecture }} | |
| - name: Install dependencies | |
| run: pnpm install | |
| - name: Download artifacts | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: bindings-${{ matrix.settings.target }} | |
| path: . | |
| - name: List packages | |
| run: ls -R . | |
| shell: bash | |
| - name: Test bindings | |
| run: pnpm test | |
| test-linux-binding: | |
| name: Test ${{ matrix.target }} - node@${{ matrix.node }} | |
| needs: | |
| - build | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| target: | |
| - x86_64-unknown-linux-gnu | |
| - aarch64-unknown-linux-gnu | |
| - armv7-unknown-linux-gnueabihf | |
| node: | |
| - "22" | |
| - "24" | |
| runs-on: ${{ contains(matrix.target, 'aarch64') && 'ubuntu-24.04-arm' || 'ubuntu-latest' }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: setup system dependencies | |
| run: sudo apt-get update && sudo apt-get install -y libxdo-dev libxkbcommon-dev libxi-dev libxtst-dev | |
| - name: Install Xvfb on Linux | |
| if: runner.os == 'Linux' | |
| run: | | |
| sudo apt-get install -y xvfb | |
| which Xvfb | |
| # Set DISPLAY env variable | |
| echo "DISPLAY=:99.0" >> $GITHUB_ENV | |
| # Create virtual display with Xvfb | |
| Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & | |
| # Wait for Xvfb to start | |
| sleep 3 | |
| - name: setup pnpm | |
| uses: pnpm/action-setup@v5 | |
| - name: Setup node | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| cache: pnpm | |
| - name: Output docker params | |
| id: docker | |
| run: | | |
| node -e " | |
| if ('${{ matrix.target }}'.startsWith('aarch64')) { | |
| console.log('PLATFORM=linux/arm64') | |
| } else if ('${{ matrix.target }}'.startsWith('armv7')) { | |
| console.log('PLATFORM=linux/arm/v7') | |
| } else { | |
| console.log('PLATFORM=linux/amd64') | |
| } | |
| " >> $GITHUB_OUTPUT | |
| node -e " | |
| if ('${{ matrix.target }}'.endsWith('-musl')) { | |
| console.log('IMAGE=node:${{ matrix.node }}-alpine') | |
| } else { | |
| console.log('IMAGE=node:${{ matrix.node }}-slim') | |
| } | |
| " >> $GITHUB_OUTPUT | |
| echo "PNPM_STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT | |
| - name: Install dependencies | |
| run: pnpm install --force | |
| - name: Download artifacts | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: bindings-${{ matrix.target }} | |
| path: . | |
| - name: List packages | |
| run: ls -R . | |
| shell: bash | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v4 | |
| if: ${{ contains(matrix.target, 'armv7') }} | |
| with: | |
| platforms: all | |
| - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes | |
| if: ${{ contains(matrix.target, 'armv7') }} | |
| - name: Test bindings | |
| uses: tj-actions/docker-run@v2 | |
| with: | |
| image: ${{ steps.docker.outputs.IMAGE }} | |
| name: test-binding | |
| options: "-v ${{ steps.docker.outputs.PNPM_STORE_PATH }}:${{ steps.docker.outputs.PNPM_STORE_PATH }} -v ${{ github.workspace }}:${{ github.workspace }} -w ${{ github.workspace }} --platform ${{ steps.docker.outputs.PLATFORM }}" | |
| args: npm run test | |
| publish: | |
| name: Publish | |
| runs-on: ubuntu-latest | |
| needs: | |
| - lint | |
| - test-macOS-windows-binding | |
| - test-linux-binding | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: setup pnpm | |
| uses: pnpm/action-setup@v5 | |
| - name: Setup node | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: 22 | |
| cache: pnpm | |
| - name: Install dependencies | |
| run: pnpm install | |
| - name: Download all artifacts | |
| uses: actions/download-artifact@v8 | |
| with: | |
| path: artifacts | |
| - name: create npm dirs | |
| run: pnpm napi create-npm-dirs | |
| - name: Move artifacts | |
| run: pnpm artifacts | |
| - name: List packages | |
| run: ls -R ./npm | |
| shell: bash | |
| - name: Publish | |
| run: | | |
| npm config set provenance true | |
| if git log -1 --pretty=%B | grep "^v\?[0-9]\+\.[0-9]\+\.[0-9]\+$"; | |
| then | |
| echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc | |
| npm publish --access public | |
| elif git log -1 --pretty=%B | grep "^v\?[0-9]\+\.[0-9]\+\.[0-9]\+"; | |
| then | |
| echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc | |
| npm publish --tag next --access public | |
| else | |
| echo "Not a release, skipping publish" | |
| fi | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| NPM_TOKEN: ${{ secrets.NPM_TOKEN }} |