Skip to content

ci: add support for arm64 Linux #530

ci: add support for arm64 Linux

ci: add support for arm64 Linux #530

Workflow file for this run

name: CI
on:
pull_request:
push:
branches:
- master
jobs:
Build:
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }}
runs-on: ${{ matrix.os }}
# prettier-ignore
name: ${{ matrix.os }}-${{ matrix.node_arch }}-${{ matrix.dockerfile }}-${{ matrix.distro }}
strategy:
fail-fast: false
matrix:
os:
- ubuntu-20.04
- windows-2019
node_arch:
- x64
cpp_arch:
- x64
dockerfile:
- ""
distro:
- ""
native:
- true
include:
- os: windows-2019
node_arch: ia32
cpp_arch: amd64_x86
native: true
# - os: windows-2022
# node_arch: x64
# arch: arm64
# cpp_arch: amd64_arm64
- os: macos-13
node_arch: x64
cpp_arch: x64
native: true
- os: macos-14
node_arch: arm64
cpp_arch: amd64_arm64
native: true
# Musl Alpine
- os: ubuntu-24.04
dockerfile: docker/alpine.dockerfile
node_arch: x64
cpp_arch: x64
native: false
# Debian Arm
- os: ubuntu-24.04
node_arch: arm64
cpp_arch: amd64_arm64
distro: bookworm
native: false
# Musl Alpine Arm
- os: ubuntu-24.04
node_arch: arm64
cpp_arch: amd64_arm64
distro: alpine_latest
native: false
env:
npm_config_arch: ${{ matrix.node_arch }}
npm_config_target_arch: ${{ matrix.node_arch }}
setup_node_arch: ${{ matrix.node_arch }}
steps:
- uses: actions/checkout@v4
- name: Cache
uses: actions/cache@v4
with:
path: |
./node_modules/
~/vcpkg
# prettier-ignore
key: "cache-OS:${{ matrix.os }}-arch:${{ matrix.node_arch}}-${{hashFiles('./pnpm-lock.yaml', './vcpkg.json', './CMakeLists.txt') }}"
restore-keys: |
"cache-OS:${{ matrix.os }}-arch:${{ matrix.node_arch }}-"
- name: Env map
run: |
if [ "${{ matrix.node_arch }}" = "ia32" ]; then
echo "setup_node_arch=x86" > $GITHUB_ENV
fi
shell: bash
- name: Setup Cpp
if: ${{ matrix.native }}
uses: aminya/setup-cpp@v1
with:
vcvarsall: ${{ contains(matrix.os, 'windows') }}
cmake: true
ninja: true
python: true
vcpkg: true
architecture: ${{ matrix.cpp_arch }}
- name: Install Mac-OS Dependencies
if: ${{ contains(matrix.os, 'macos') }}
run: |
brew install gnutls autoconf automake libtool
- uses: pnpm/action-setup@v4
if: ${{ matrix.native }}
with:
version: 9
- name: Install Node 20
if: ${{ matrix.native }}
uses: actions/setup-node@v4
with:
node-version: 20
architecture: ${{ env.setup_node_arch }}
- name: Install and Build Native
if: ${{ matrix.native }}
run: pnpm install
- name: Build JavaScript
if: ${{ matrix.native }}
run: pnpm run build.js
- name: Install Node 10
if: ${{ matrix.native && matrix.os != 'macos-14' }}
uses: actions/setup-node@v4
with:
node-version: 10
architecture: ${{ env.setup_node_arch }}
- name: Build Native
if: ${{ matrix.native && matrix.node_arch != 'ia32' }}
run: npm run build.native
- name: Build Native Windows 32
if: ${{ matrix.os == 'windows-2019' && matrix.node_arch == 'ia32' }}
run:
node ./node_modules/@aminya/cmake-ts/build/main.js named-configs
windows-x86
- name: Use Node 20
if: ${{ matrix.native }}
uses: actions/setup-node@v4
with:
node-version: 20
architecture: ${{ env.setup_node_arch }}
- name: Prebuild Docker
if: ${{ matrix.dockerfile }}
run: |
docker build -t zeromq -f ${{ matrix.dockerfile }} .
docker create --name zeromq-temp zeromq
mkdir -p ./build
docker cp zeromq-temp:/app/build ./
docker rm -f zeromq-temp
- name: Build Linux Arm64
if: ${{ matrix.distro }}
uses: uraimo/[email protected]
with:
arch: aarch64
distro: ${{ matrix.distro }}
githubToken: ${{ github.token }}
setup: |
mkdir -p "${PWD}/build"
dockerRunArgs: |
--volume "${PWD}/build:/build"
env: |
VCPKG_FORCE_SYSTEM_BINARIES: 1
install: |
set -x
case "${{ matrix.distro }}" in
fedora*)
dnf update -q -y
dnf install -y \
bash \
build-essential \
curl \
git \
g++ \
make \
ninja-build \
pkg-config \
unzip \
zip \
python3 \
tar \
cmake \
ninja-build \
automake \
autoconf \
libtool \
nodejs
;;
alpine*)
apk update
apk add --no-cache bash build-base curl git g++ make ninja-build pkgconfig unzip zip python3 tar cmake musl-dev automake autoconf libtool nodejs npm
cp /usr/lib/ninja-build/bin/ninja /usr/bin/ninja
;;
*)
# Default case (Ubuntu/Debian)
apt-get update -q -y
apt-get install --no-install-recommends -y \
bash \
build-essential \
curl \
git \
g++ \
make \
ninja-build \
pkg-config \
unzip \
zip \
python3 \
tar \
cmake \
ninja-build \
automake \
autoconf \
libtool \
nodejs \
npm
;;
esac
npm i -g pnpm
run: |
pnpm install && \
pnpm run build
- name: Upload build
uses: actions/upload-artifact@v4
with:
path: ./build
name: build-${{ strategy.job-index }}
overwrite: true
- name: Lint
if: "${{ contains(matrix.os, 'ubuntu') && matrix.native }}"
run: pnpm run lint-test
- name: Test
if: ${{ matrix.native }}
uses: nick-fields/retry@v3
with:
timeout_minutes: 5
max_attempts: 3
shell: bash
command: |
pnpm run test.unit || (rm -rf ./tmp && mkdir -p ./tmp && exit 1)
rm -rf ./tmp && mkdir -p ./tmp
- name: Test Electron Windows/MacOS
if: "${{ !contains(matrix.os, 'ubuntu') && matrix.native }}"
uses: nick-fields/retry@v3
with:
timeout_minutes: 5
max_attempts: 1
command: |
pnpm run test.electron.main
continue-on-error: true
- name: Test Electron Linux
if: "${{ contains(matrix.os, 'ubuntu') && matrix.native }}"
uses: nick-fields/retry@v3
with:
timeout_minutes: 5
max_attempts: 1
command: |
sudo apt-get install xvfb
xvfb-run --auto-servernum pnpm run test.electron.main
continue-on-error: true
Package:
runs-on: ubuntu-latest
needs: Build
steps:
- name: Merge Artifacts
uses: actions/upload-artifact/merge@v4
with:
name: build
pattern: build-*
delete-merged: true
- uses: actions/checkout@v4
- name: Place build
uses: actions/download-artifact@v4
with:
name: build
path: ./build
- name: Install Node
uses: actions/setup-node@v4
with:
node-version-file: "./.nvmrc"
- name: Install Pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Pack Zeromq
run: |
pnpm install
pnpm pack
- name: Upload Pack
uses: actions/upload-artifact@v4
with:
path: ./*.tgz
name: pack
overwrite: true
SmokeTest:
runs-on: ${{ matrix.os }}
needs: Package
strategy:
fail-fast: false
matrix:
os:
- ubuntu-24.04
- windows-2022
- macos-13
node-version:
- 10
- 22
include:
- os: macos-14
node-version: 22
steps:
- name: Install Node
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Install Yarn 1
if: matrix.node-version == 10
run: |
npm i -g yarn@^1
- name: Install Yarn Latest
if: matrix.node-version == 22
run: |
npm i -g yarn@latest
- name: Install Pnpm 5
if: matrix.node-version == 10
uses: pnpm/action-setup@v4
with:
version: 5
- name: Install Pnpm 9
if: matrix.node-version == 22
uses: pnpm/action-setup@v4
with:
version: 9
- uses: actions/checkout@v4
- name: Download Pack
uses: actions/download-artifact@v4
with:
name: pack
- name: Smoke Test
run: bash ./script/smoke-test.bash