chore(NODE-5388): add release automation #103
This file contains 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: zstd | |
MACOSX_DEPLOYMENT_TARGET: '10.13' | |
on: | |
push: | |
branches: | |
- main | |
tags-ignore: | |
- '**' | |
paths-ignore: | |
- '**/*.md' | |
- LICENSE | |
- '**/*.gitignore' | |
- .editorconfig | |
- docs/** | |
pull_request: null | |
jobs: | |
build: | |
strategy: | |
fail-fast: false | |
matrix: | |
settings: | |
- host: macos-latest | |
target: x86_64-apple-darwin | |
architecture: x64 | |
build: | | |
npm run build | |
strip -x *.node | |
- host: windows-latest | |
build: npm run build | |
target: x86_64-pc-windows-msvc | |
architecture: x64 | |
- host: ubuntu-latest | |
target: x86_64-unknown-linux-gnu | |
architecture: x64 | |
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine-zig | |
build: >- | |
set -e && | |
rustup target add x86_64-unknown-linux-gnu && | |
npm run build -- --target x86_64-unknown-linux-gnu --zig --zig-abi-suffix 2.12 && | |
llvm-strip -x *.node | |
- host: ubuntu-latest | |
target: x86_64-unknown-linux-musl | |
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine | |
build: set -e && npm run build && strip *.node | |
- host: macos-latest | |
architecture: x64 | |
target: aarch64-apple-darwin | |
build: | | |
sudo rm -Rf /Library/Developer/CommandLineTools/SDKs/*; | |
export CC=$(xcrun -f clang); | |
export CXX=$(xcrun -f clang++); | |
SYSROOT=$(xcrun --sdk macosx --show-sdk-path); | |
export CFLAGS="-isysroot $SYSROOT -isystem $SYSROOT"; | |
npm run build -- --target aarch64-apple-darwin | |
strip -x *.node | |
- host: ubuntu-latest | |
architecture: x64 | |
target: aarch64-unknown-linux-gnu | |
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine-zig | |
build: >- | |
set -e && | |
rustup target add aarch64-unknown-linux-gnu && | |
npm run build -- --target aarch64-unknown-linux-gnu --zig --zig-abi-suffix 2.17 && | |
llvm-strip -x *.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 && | |
npm run build -- --target aarch64-unknown-linux-musl && | |
/aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node | |
name: stable - ${{ matrix.settings.target }} - node@20 | |
runs-on: ${{ matrix.settings.host }} | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Setup node | |
uses: actions/setup-node@v3 | |
with: | |
node-version: 20 | |
check-latest: true | |
cache: npm | |
architecture: ${{ matrix.settings.architecture }} | |
- name: Install | |
uses: actions-rs/toolchain@v1 | |
if: ${{ !matrix.settings.docker }} | |
with: | |
profile: minimal | |
override: true | |
toolchain: stable | |
target: ${{ matrix.settings.target }} | |
- name: Generate Cargo.lock | |
uses: actions-rs/cargo@v1 | |
if: ${{ !matrix.settings.docker }} | |
with: | |
command: generate-lockfile | |
- name: Cache cargo registry | |
uses: actions/cache@v3 | |
with: | |
path: ~/.cargo/registry | |
key: ${{ matrix.settings.target }}-cargo-registry | |
- name: Cache cargo index | |
uses: actions/cache@v3 | |
with: | |
path: ~/.cargo/git | |
key: ${{ matrix.settings.target }}-cargo-index | |
- name: Cache NPM dependencies | |
uses: actions/cache@v3 | |
with: | |
path: node_modules | |
key: npm-cache-build-${{ matrix.settings.target }}-node@16 | |
- name: Setup toolchain | |
run: ${{ matrix.settings.setup }} | |
if: ${{ matrix.settings.setup }} | |
shell: bash | |
- name: Install dependencies | |
run: npm clean-install --ignore-scripts | |
- name: Build in docker | |
uses: addnab/docker-run-action@v3 | |
if: ${{ matrix.settings.docker }} | |
with: | |
image: ${{ matrix.settings.docker }} | |
options: -v ${{ env.HOME }}/.cargo/git:/root/.cargo/git -v ${{ env.HOME }}/.cargo/registry:/root/.cargo/registry -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@v3 | |
with: | |
name: bindings-${{ matrix.settings.target }} | |
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 | |
node: | |
- '12' | |
- '14' | |
- '16' | |
- '18' | |
- '20' | |
runs-on: ${{ matrix.settings.host }} | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Setup node | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node }} | |
check-latest: true | |
cache: npm | |
- name: Cache NPM dependencies | |
uses: actions/cache@v3 | |
with: | |
path: node_modules | |
key: npm-cache-test-${{ matrix.settings.target }}-${{ matrix.node }}-${{ hashFiles('package-lock.json') }} | |
- name: Install dependencies | |
run: npm clean-install --ignore-scripts | |
- name: Download artifacts | |
uses: actions/download-artifact@v3 | |
with: | |
name: bindings-${{ matrix.settings.target }} | |
path: . | |
- name: List packages | |
run: ls -R . | |
shell: bash | |
- name: Test bindings | |
run: npm test | |
test-linux-x64-gnu-binding: | |
name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }} | |
needs: | |
- build | |
strategy: | |
fail-fast: false | |
matrix: | |
node: | |
- '12' | |
- '14' | |
- '16' | |
- '18' | |
- '20' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v2 | |
- name: Setup node | |
uses: actions/setup-node@v2 | |
with: | |
node-version: ${{ matrix.node }} | |
check-latest: true | |
cache: npm | |
- name: Cache NPM dependencies | |
uses: actions/cache@v2 | |
with: | |
path: node_modules | |
key: npm-cache-test-linux-x64-gnu-${{ matrix.node }}-${{ hashFiles('package-lock.json') }} | |
- name: Install dependencies | |
run: npm clean-install --ignore-scripts | |
- name: Download artifacts | |
uses: actions/download-artifact@v2 | |
with: | |
name: bindings-x86_64-unknown-linux-gnu | |
path: . | |
- name: List packages | |
run: ls -R . | |
shell: bash | |
- name: Test bindings | |
run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-slim npm test | |
test-linux-x64-musl-binding: | |
name: Test bindings on x86_64-unknown-linux-musl - node@${{ matrix.node }} | |
needs: | |
- build | |
strategy: | |
fail-fast: false | |
matrix: | |
node: | |
- '12' | |
- '14' | |
- '16' | |
- '18' | |
- '20' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Setup node | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node }} | |
check-latest: true | |
cache: npm | |
- name: Cache NPM dependencies | |
uses: actions/cache@v3 | |
with: | |
path: node_modules | |
key: npm-cache-test-x86_64-unknown-linux-musl-${{ matrix.node }}-${{ hashFiles('package-lock.json') }} | |
- name: Install dependencies | |
run: npm clean-install --ignore-scripts | |
- name: Download artifacts | |
uses: actions/download-artifact@v3 | |
with: | |
name: bindings-x86_64-unknown-linux-musl | |
path: . | |
- name: List packages | |
run: ls -R . | |
shell: bash | |
- name: Test bindings | |
run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-alpine npm test | |
test-linux-aarch64-gnu-binding: | |
name: Test bindings on aarch64-unknown-linux-gnu - node@${{ matrix.node }} | |
needs: | |
- build | |
strategy: | |
fail-fast: false | |
matrix: | |
node: | |
- '12' | |
- '14' | |
- '16' | |
- '18' | |
- '20' | |
runs-on: ubuntu-latest | |
steps: | |
- run: docker run --rm --privileged multiarch/qemu-user-static:register --reset | |
- uses: actions/checkout@v3 | |
- name: Download artifacts | |
uses: actions/download-artifact@v3 | |
with: | |
name: bindings-aarch64-unknown-linux-gnu | |
path: . | |
- name: List packages | |
run: ls -R . | |
shell: bash | |
- name: Cache NPM dependencies | |
uses: actions/cache@v3 | |
with: | |
path: node_modules | |
key: npm-cache-test-linux-aarch64-gnu-${{ matrix.node }}-${{ hashFiles('package-lock.json') }} | |
- name: Install dependencies | |
run: npm clean-install --ignore-scripts | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v2 | |
with: | |
platforms: arm64 | |
- name: Run Emulator | |
run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes | |
- name: Setup and run tests | |
uses: addnab/docker-run-action@v3 | |
with: | |
image: node:${{ matrix.node }}-slim | |
options: '--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build' | |
run: | | |
set -e | |
npm test | |
ls -la | |
test-linux-aarch64-musl-binding: | |
name: Test bindings on aarch64-unknown-linux-musl - node@${{ matrix.node }} | |
needs: | |
- build | |
runs-on: ubuntu-latest | |
steps: | |
- run: docker run --rm --privileged multiarch/qemu-user-static:register --reset | |
- uses: actions/checkout@v3 | |
- name: Download artifacts | |
uses: actions/download-artifact@v3 | |
with: | |
name: bindings-aarch64-unknown-linux-musl | |
path: . | |
- name: List packages | |
run: ls -R . | |
shell: bash | |
- name: Cache NPM dependencies | |
uses: actions/cache@v3 | |
with: | |
path: node_modules | |
key: npm-cache-test-linux-aarch64-musl-${{ matrix.node }}-${{ hashFiles('package-lock.json') }} | |
- name: Install dependencies | |
run: npm clean-install --ignore-scripts | |
- name: Setup and run tests | |
uses: addnab/docker-run-action@v3 | |
with: | |
image: multiarch/alpine:aarch64-latest-stable | |
options: '-v ${{ github.workspace }}:/build -w /build' | |
run: | | |
set -e | |
apk add nodejs npm | |
npm test | |
publish: | |
name: Publish | |
runs-on: ubuntu-latest | |
needs: | |
- test-macOS-windows-binding | |
- test-linux-x64-gnu-binding | |
- test-linux-x64-musl-binding | |
- test-linux-aarch64-gnu-binding | |
- test-linux-aarch64-musl-binding | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 'lts/*' | |
cache: 'npm' | |
registry-url: 'https://registry.npmjs.org' | |
- run: npm install -g npm@latest | |
shell: bash | |
- run: npm clean-install | |
shell: bash | |
- name: Download all artifacts | |
uses: actions/download-artifact@v3 | |
with: | |
path: artifacts | |
- name: Move artifacts | |
run: npm run artifacts | |
- name: List packages | |
run: ls -R ./npm | |
shell: bash | |
- id: release | |
uses: googleapis/release-please-action@v4 | |
- if: ${{ steps.release.outputs.release_created }} | |
run: npm publish --provenance | |
env: | |
# https://docs.npmjs.com/generating-provenance-statements#using-third-party-package-publishing-tools | |
NPM_CONFIG_PROVENANCE: "true" | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |