From e00045e0904c653820c92f3c898e1372a19959c5 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Thu, 4 Jul 2024 17:43:29 -0700 Subject: [PATCH] ci: use template --- .github/workflows/ci.yml | 364 ++++++++++++++++++++++++++++++++++ .github/workflows/release.yml | 201 ------------------- 2 files changed, 364 insertions(+), 201 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..3da4cc7 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,364 @@ +name: CI +env: + DEBUG: napi:* + APP_NAME: package-template + MACOSX_DEPLOYMENT_TARGET: '10.13' +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: + 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 --use-napi-cross + - host: ubuntu-latest + target: x86_64-unknown-linux-musl + build: pnpm build --target x86_64-unknown-linux-musl -x + - host: macos-14 + target: aarch64-apple-darwin + build: pnpm build --target aarch64-apple-darwin + - host: ubuntu-latest + target: aarch64-unknown-linux-gnu + build: pnpm build --target aarch64-unknown-linux-gnu --use-napi-cross + - host: ubuntu-latest + target: armv7-unknown-linux-gnueabihf + build: pnpm build --target armv7-unknown-linux-gnueabihf --use-napi-cross + - host: ubuntu-latest + target: aarch64-linux-android + build: pnpm build --target aarch64-linux-android + - host: ubuntu-latest + target: armv7-linux-androideabi + build: pnpm build --target armv7-linux-androideabi + - host: ubuntu-latest + target: aarch64-unknown-linux-musl + build: pnpm build --target aarch64-unknown-linux-musl -x + - host: windows-latest + target: aarch64-pc-windows-msvc + build: pnpm build --target aarch64-pc-windows-msvc + # - host: ubuntu-latest + # target: wasm32-wasip1-threads + # build: pnpm build --target wasm32-wasip1-threads + name: stable - ${{ matrix.settings.target }} - node@20 + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v4 + - name: setup pnpm + uses: pnpm/action-setup@v4 + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - name: Install + uses: dtolnay/rust-toolchain@stable + 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/ + ~/.napi-rs + .cargo-cache + target/ + key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} + - uses: goto-bus-stop/setup-zig@v2 + if: ${{ contains(matrix.settings.target, 'musl') }} + with: + version: 0.12.0 + - 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@v4 + if: matrix.settings.target == 'i686-pc-windows-msvc' + with: + node-version: 20 + cache: pnpm + architecture: x86 + - name: Build + run: ${{ matrix.settings.build }} + shell: bash + - name: Upload artifact + uses: actions/upload-artifact@v4 + 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@v4 + if: matrix.settings.target == 'wasm32-wasip1-threads' + with: + name: bindings-${{ matrix.settings.target }} + path: "*.wasm" + if-no-files-found: error + build-freebsd: + runs-on: macos-13 + name: Build FreeBSD + steps: + - uses: actions/checkout@v4 + - name: Build + id: build + uses: cross-platform-actions/action@v0.24.0 + env: + DEBUG: napi:* + RUSTUP_IO_THREADS: 1 + with: + operating_system: freebsd + version: '13.2' + memory: 8G + cpu_count: 3 + environment_variables: 'DEBUG RUSTUP_IO_THREADS' + shell: bash + run: | + sudo pkg install -y -f curl node libnghttp2 npm + sudo npm install -g corepack + curl https://sh.rustup.rs -sSf --output rustup.sh + sh rustup.sh -y --profile minimal --default-toolchain beta + corepack prepare + corepack enable + source "$HOME/.cargo/env" + echo "~~~~ rustc --version ~~~~" + rustc --version + echo "~~~~ node -v ~~~~" + node -v + echo "~~~~ pnpm --version ~~~~" + pnpm --version + pwd + ls -lah + whoami + env + freebsd-version + pnpm install + pnpm build + rm -rf node_modules + rm -rf target + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: bindings-freebsd + path: ${{ env.APP_NAME }}.*.node + 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: + - '18' + - '20' + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v4 + - name: setup pnpm + uses: pnpm/action-setup@v4 + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + cache: pnpm + architecture: ${{ matrix.settings.architecture }} + - name: Install dependencies + run: pnpm install + - name: Download artifacts + uses: actions/download-artifact@v4 + 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 + - x86_64-unknown-linux-musl + - aarch64-unknown-linux-gnu + - aarch64-unknown-linux-musl + - armv7-unknown-linux-gnueabihf + node: + - '18' + - '20' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: setup pnpm + uses: pnpm/action-setup@v4 + - name: Setup node + uses: actions/setup-node@v4 + 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 + # use --force to download the all platform/arch dependencies + - name: Install dependencies + run: pnpm install --force + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: bindings-${{ matrix.target }} + path: . + - name: List packages + run: ls -R . + shell: bash + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: all + - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + - name: Test bindings + uses: addnab/docker-run-action@v3 + with: + image: ${{ steps.docker.outputs.IMAGE }} + 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 }} + run: npm run test + test-wasi: + name: Test WASI target + needs: + - build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: setup pnpm + uses: pnpm/action-setup@v4 + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - name: Install dependencies + run: pnpm install + # - name: Download artifacts + # uses: actions/download-artifact@v4 + # with: + # name: bindings-wasm32-wasip1-threads + # path: . + - name: List packages + run: ls -R . + shell: bash + - name: Test bindings + run: pnpm test + env: + NAPI_RS_FORCE_WASI: 1 + publish: + name: Publish + runs-on: ubuntu-latest + needs: + - build-freebsd + - test-macOS-windows-binding + - test-linux-binding + - test-wasi + steps: + - uses: actions/checkout@v4 + - name: setup pnpm + uses: pnpm/action-setup@v4 + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - name: Install dependencies + run: pnpm install + - name: Download all artifacts + uses: actions/download-artifact@v4 + 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 }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 12d2987..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,201 +0,0 @@ -name: Release NAPI - -on: - workflow_dispatch: - push: - branches: - - main - -env: - DEBUG: 'napi:*' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - check: - name: Check version - runs-on: ubuntu-latest - outputs: - version: ${{ env.version }} - version_changed: ${{ steps.version.outputs.changed }} - steps: - - uses: taiki-e/checkout-action@v1 - - - name: Check version changes - uses: EndBug/version-check@v2 - id: version - with: - static-checking: localIsNew - file-url: https://unpkg.com/react-server-action@latest/package.json - file-name: package.json - - - name: Set version name - if: steps.version.outputs.changed == 'true' - run: | - echo "Version change found! New version: ${{ steps.version.outputs.version }} (${{ steps.version.outputs.version_type }})" - echo "version=${{ steps.version.outputs.version }}" >> $GITHUB_ENV - - build: - needs: check - if: needs.check.outputs.version_changed == 'true' - env: - version: ${{ needs.check.outputs.version }} - outputs: - version: ${{ env.version }} - strategy: - fail-fast: false - matrix: - include: - - os: windows-latest - target: x86_64-pc-windows-msvc - - - os: windows-latest - target: aarch64-pc-windows-msvc - - - os: ubuntu-latest - target: x86_64-unknown-linux-gnu - - - os: ubuntu-latest - target: x86_64-unknown-linux-musl - - - os: ubuntu-latest - target: aarch64-unknown-linux-gnu - - - os: ubuntu-latest - target: aarch64-unknown-linux-musl - - - os: ubuntu-latest - target: armv7-unknown-linux-gnueabihf - - - os: macos-latest - target: x86_64-apple-darwin - - - os: macos-latest - target: aarch64-apple-darwin - - - os: ubuntu-latest - target: wasm32-wasip1-threads - - name: Package ${{ matrix.target }} - runs-on: ${{ matrix.os }} - steps: - - uses: taiki-e/checkout-action@v1 - - - uses: ./.github/actions/pnpm - - - name: Add Rust Target - run: rustup target add ${{ matrix.target }} - - - uses: goto-bus-stop/setup-zig@v2 - if: ${{ contains(matrix.target, 'musl') }} - with: - version: 0.13.0 - - - name: Build with zig cross - if: ${{ contains(matrix.target, 'musl') }} - run: pnpm build -x --target ${{ matrix.target }} - - - name: Build with napi cross - if: ${{ contains(matrix.target, 'gnu') }} - run: pnpm build --use-napi-cross --target ${{ matrix.target }} - - - name: Build - if: ${{ !contains(matrix.target, 'gnu') && !contains(matrix.target, 'musl') }} - run: pnpm build --target ${{ matrix.target }} - - - name: Test - if: matrix.target == 'x86_64-pc-windows-msvc' || matrix.target == 'aarch64-apple-darwin' || matrix.target == 'wasm32-wasip1-threads' - run: pnpm test - - - name: Output docker params - if: ${{ contains(matrix.target, 'linux') }} - 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:lts-alpine') - } else { - console.log('IMAGE=node:lts-slim') - } - " >> $GITHUB_OUTPUT - echo "PNPM_STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - if: ${{ contains(matrix.target, 'linux') }} - with: - platforms: all - - - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - if: ${{ contains(matrix.target, 'linux') }} - - - name: Run linux test - uses: addnab/docker-run-action@v3 - if: ${{ contains(matrix.target, 'linux') }} - with: - image: ${{ steps.docker.outputs.IMAGE }} - options: -v ${{ steps.docker.outputs.PNPM_STORE_PATH }}:${{ steps.docker.outputs.PNPM_STORE_PATH }} -v ${{ github.workspace }}:/oxc_resolver -w /oxc_resolver --platform ${{ steps.docker.outputs.PLATFORM }} - run: | - corepack enable - pnpm test - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: bindings-${{ matrix.target }} - path: | - napi/*.node - napi/*.wasm - - publish: - name: Publish NAPI - runs-on: ubuntu-latest - permissions: - id-token: write # for `npm publish --provenance` - needs: - - build - steps: - - uses: taiki-e/checkout-action@v1 - - - name: corepack - run: corepack enable - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version-file: .node-version - cache: pnpm - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Download Artifacts - uses: actions/download-artifact@v4 - with: - path: artifacts - - - name: Prepare dirs and artifacts - run: | - pnpm napi create-npm-dirs - pnpm napi artifacts --build-output-dir napi - - - name: Publish npm packages as latest - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - shell: bash - run: | - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - pnpm napi pre-publish --no-gh-release -t npm - npm publish --tag latest --provenance --access public