[FEATURE] split napi-rs part and data recovery for Rust project #18
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: Build & Test & publich node package "@miniben90/x-win" | |
env: | |
DEBUG: napi:* | |
APP_NAME: x-win | |
MACOSX_DEPLOYMENT_TARGET: '10.13' | |
on: | |
push: | |
branches: | |
- main | |
tags-ignore: | |
- '**' | |
paths-ignore: | |
- '**/*.md' | |
- LICENSE | |
- '**/*.gitignore' | |
- .editorconfig | |
- docs/** | |
pull_request: null | |
release: | |
types: [published] | |
jobs: | |
build: | |
strategy: | |
fail-fast: false | |
matrix: | |
node-version: [20] | |
settings: | |
# Build matrix for MacOS (x64) | |
- host: macos-latest | |
target: x86_64-apple-darwin | |
build: | | |
yarn build --target x86_64-apple-darwin | |
strip -x *.node | |
# Build matrix for MacOS (arm64) | |
- host: macos-latest | |
target: aarch64-apple-darwin | |
build: | | |
yarn build --target aarch64-apple-darwin | |
strip -x *.node | |
# Build matrix for Windows (x64) | |
- host: windows-latest | |
target: x86_64-pc-windows-msvc | |
build: yarn build | |
# Build matrix for Windows (x32) | |
- host: windows-latest | |
target: i686-pc-windows-msvc | |
build: yarn build --target i686-pc-windows-msvc | |
architecture: 'x86' | |
# Build matrix for Windows (arm64) | |
- host: windows-latest | |
target: aarch64-pc-windows-msvc | |
build: yarn build --target aarch64-pc-windows-msvc | |
# Build for linux (using Ubuntu) (x64) | |
- host: ubuntu-latest | |
target: x86_64-unknown-linux-gnu | |
build: |- | |
set -e && | |
yarn build --target x86_64-unknown-linux-gnu && | |
strip *.node | |
# Build for linux (using Ubuntu) (x64) | |
- host: ubuntu-latest | |
target: x86_64-unknown-linux-musl | |
build: |- | |
set -e && | |
yarn build --target x86_64-unknown-linux-musl && | |
strip *.node | |
# Disabled problem with lxcb | |
# # Build for linux (using Ubuntu) (arm64) | |
# - host: ubuntu-latest | |
# target: aarch64-unknown-linux-gnu | |
# docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 | |
# build: |- | |
# set -e && | |
# sudo echo "deb [arch=arm64] http://ports.ubuntu.com/ jammy main" > /etc/apt/sources.list.d/arm64-ports.list && | |
# sudo apt-get update && | |
# sudo apt-get upgrade -y --fix-missing && | |
# sudo apt-get install -y --fix-missing --no-install-recommends gcc make gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu && | |
# sudo apt-get install -y --fix-missing --no-install-recommends libx11-dev libx11-dev:arm64 libx11-xcb-dev libx11-xcb-dev:arm64 libxcb1-dev libxcb1-dev:arm64 libxcb-ewmh-dev libxcb-ewmh-dev:arm64 libxcb-randr0-dev libxcb-randr0-dev:arm64 && | |
# yarn install && | |
# yarn build --target aarch64-unknown-linux-gnu && | |
# aarch64-unknown-linux-gnu-strip *.node | |
name: stable - ${{ matrix.settings.target }} - node@${{ matrix.node-version }} | |
runs-on: ${{ matrix.settings.host }} | |
steps: | |
# # Install lib dev required for compilation of the project | |
# - name: (Linux) update dist | |
# if: ${{ matrix.settings.host == 'ubuntu-latest' && !matrix.settings.docker }} | |
# run: sudo apt-get update | |
# # Install deps. to compile the project on aarch64 gnu | |
# - name: (Linux Aarch64) Install aarch64 for building cross-platform | |
# if: ${{ matrix.settings.host == 'ubuntu-latest' && matrix.settings.target == 'aarch64-unknown-linux-gnu' }} | |
# run: | | |
# sudo dpkg --add-architecture arm64 | |
# sudo apt-get install -y gcc make gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu | |
# Install lib dev required for compilation of the project | |
- name: (Linux) Install libx11 & libxcb for building | |
if: ${{ matrix.settings.host == 'ubuntu-latest' && !matrix.settings.docker }} | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y libx11-dev libxcb-ewmh-dev libxcb-randr0-dev | |
# Add actions/checkout | |
- uses: actions/checkout@v4 | |
# Setup node version from matrix.node and install deps | |
- name: Setup node | |
if: ${{ !matrix.settings.docker }} | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node-version }} | |
check-latest: true | |
cache: yarn | |
architecture: ${{ matrix.settings.architecture || '' }} | |
# Setup yarn with ia32 for windows x86 | |
- name: Setup node x86 | |
if: ${{ matrix.settings.target == 'i686-pc-windows-msvc' }} | |
run: yarn config set supportedArchitectures.cpu "ia32" | |
shell: bash | |
# Install Rust version | |
- name: Install Rust | |
if: ${{ !matrix.settings.docker }} | |
uses: dtolnay/rust-toolchain@stable | |
with: | |
toolchain: stable | |
targets: ${{ matrix.settings.target }} | |
# Set Cache cargo | |
- name: Cache cargo | |
uses: actions/cache@v3 | |
with: | |
path: | | |
~/.cargo/registry/index/ | |
~/.cargo/registry/cache/ | |
~/.cargo/git/db/ | |
.cargo-cache | |
target/ | |
key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} | |
# Install deps | |
- name: Install dependencies | |
if: ${{ !matrix.settings.docker }} | |
run: yarn install | |
# Lint Rust code | |
- name: Ceheck lint Rust | |
run: cargo fmt -- --check | |
# Check clippy code | |
- name: Check clippy code | |
run: cargo clippy -- -D warnings | |
# Build the project | |
- name: Build | |
if: ${{ !matrix.settings.docker }} | |
run: ${{ matrix.settings.build }} | |
shell: bash | |
# Build docker | |
- name: Build (Docker) | |
if: ${{ matrix.settings.docker }} | |
uses: addnab/docker-run-action@v3 | |
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 }} | |
# Upload artifact for the next steps (macos and test) | |
- name: Upload artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: bindings-${{ matrix.settings.target }} | |
path: ${{ github.workspace }}/${{ env.APP_NAME }}.*.node | |
if-no-files-found: error | |
test: | |
name: Test bindings on ${{ matrix.settings.target }} (${{ matrix.settings.host }}) - node@${{ matrix.node-version }} | |
needs: | |
- build | |
strategy: | |
fail-fast: false | |
matrix: | |
settings: | |
- host: windows-latest | |
target: x86_64-pc-windows-msvc | |
- host: windows-latest | |
target: i686-pc-windows-msvc | |
architecture: 'x86' | |
- host: macos-latest | |
target: aarch64-apple-darwin | |
- host: macos-latest | |
target: x86_64-apple-darwin | |
architecture: 'x64' | |
- host: ubuntu-latest | |
target: x86_64-unknown-linux-gnu | |
image: miniben90/ubuntu-dummy-desktop:latest | |
node-version: [18, 20] | |
runs-on: ${{ matrix.settings.host }} | |
steps: | |
- uses: actions/checkout@v4 | |
# Setup yarn to run as x86_64 for darwin arm64 | |
- name: Setup node x86_64 | |
if: ${{ matrix.settings.target == 'x86_64-apple-darwin' }} | |
run: arch -x86_64 zsh | |
# Setup node version from matrix.node and install deps | |
- name: Setup node | |
if: ${{ !matrix.settings.image }} | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node-version }} | |
check-latest: true | |
cache: yarn | |
architecture: ${{ matrix.settings.architecture || '' }} | |
# Setup yarn with ia32 for windows x86 | |
- name: Setup node x86 | |
if: ${{ matrix.settings.target == 'i686-pc-windows-msvc' }} | |
run: yarn config set supportedArchitectures.cpu "ia32" | |
shell: bash | |
# Install deps | |
- name: Install dependencies | |
run: yarn install | |
# Download artifacts | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: bindings-${{ matrix.settings.target }} | |
path: . | |
- name: Open finder to have an active window (MacOS) | |
if: ${{ matrix.settings.host == 'macos-latest' }} | |
run: open . | |
- name: Open explorer to have an active window (windows) | |
if: ${{ matrix.settings.host == 'windows-latest' }} | |
run: explorer . | |
- name: Test bindings | |
if: ${{ !matrix.settings.image }} | |
run: yarn test | |
- name: Test bindings on docker | |
if: ${{ matrix.settings.image }} | |
uses: addnab/docker-run-action@v3 | |
with: | |
image: ${{ matrix.settings.image }} | |
options: --user 0:0 -v ${{ github.workspace }}/.github/docker-ubuntu-install.sh:/usr/local/docker-ubuntu-install.sh -v ${{ github.workspace }}:/work -w /work | |
run: | | |
Xvfb :0 & | |
sleep 1 | |
gpg-agent --daemon | |
sleep 1 | |
xfce4-session & | |
sleep 1 | |
sh /usr/local/docker-ubuntu-install.sh ${{ matrix.node-version }} | |
cd /work | |
yarn test | |
universal-macOS: | |
name: Build universal macOS binary | |
needs: | |
- build | |
- test | |
runs-on: macos-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup node | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
check-latest: true | |
cache: yarn | |
- name: Install dependencies | |
run: yarn install | |
- name: Download macOS x64 artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: bindings-x86_64-apple-darwin | |
path: artifacts | |
- name: Download macOS arm64 artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: bindings-aarch64-apple-darwin | |
path: artifacts | |
- name: Combine binaries | |
run: yarn universal | |
- name: Upload artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: bindings-universal-apple-darwin | |
path: ${{ github.workspace }}/${{ env.APP_NAME }}.*.node | |
if-no-files-found: error | |
publish: | |
if: ${{ github.event_name == 'release' && github.ref_type == 'tag' }} | |
name: Publish ${{ github.ref_name }} (${{ github.ref }}) | |
runs-on: ubuntu-latest | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
TAG: ${{ github.ref_name }} | |
needs: | |
- build | |
- test | |
- universal-macOS | |
steps: | |
- uses: actions/checkout@v4 | |
# Setup node for publishing on npmjs | |
- name: Setup node | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
check-latest: true | |
cache: yarn | |
registry-url: 'https://registry.npmjs.org' | |
scope: '@miniben90' | |
# Install dependencies | |
- name: Install dependencies | |
run: yarn install | |
# Update package.json and Cargo.toml version | |
- name: Set version to package.json | |
run: node .scripts/before-publish.cjs | |
# Download artifacts from build part | |
- name: Download all artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
path: artifacts | |
# Move artifacts at there places | |
- name: Move artifacts | |
run: yarn artifacts | |
# Publish packages on npmjs | |
- name: Publish packages | |
run: npm publish --access public |