Skip to content

Merge branch 'master' of https://github.com/rollup/rollup into sync-c… #346

Merge branch 'master' of https://github.com/rollup/rollup into sync-c…

Merge branch 'master' of https://github.com/rollup/rollup into sync-c… #346

name: CI
env:
DEBUG: napi:*
APP_NAME: rollup
MACOSX_DEPLOYMENT_TARGET: '10.13'
on:
push:
branches:
- master
tags:
- 'v*.*.**'
pull_request:
types:
- synchronize
- opened
- reopened
merge_group:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
lint:
name: Lint and Audit
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout Commit
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Setup Node
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: 24.8.0
- name: Install and Cache Node Dependencies
uses: ./.github/actions/install-and-cache-node-deps
- name: Lint
run: npm run ci:lint
- name: Vulnerabilities
run: npm audit
- name: Optional Dependencies
run: npm run test:package
- name: Generated Code
run: |
git restore .
npm run build:ast-converters
git diff HEAD --exit-code --ignore-space-at-eol
build:
strategy:
fail-fast: false
matrix:
settings:
# WASM
- host: ubuntu-latest
target: wasm32-unknown-unknown
name: wasm
is-wasm-build: true
build: npm run build:wasm
path: |
wasm/
.empty
- host: ubuntu-latest
target: wasm32-unknown-unknown
name: wasm-node
is-wasm-build: true
build: npm run build:wasm:node
path: |
wasm-node/
.empty
# Windows
- host: windows-latest
target: x86_64-pc-windows-msvc
env:
RUSTFLAGS: -Ctarget-feature=+crt-static
- host: windows-latest
target: i686-pc-windows-msvc
- host: windows-latest
target: aarch64-pc-windows-msvc
- host: windows-latest
target: x86_64-pc-windows-gnu
msystem: ucrt64
toolchain: ucrt-x86_64
setup: |
rustup default
rustVersion=$(sed -n 's/channel *= *"\(.*\)"/\1/p' rust-toolchain.toml)
rustup install "$rustVersion"
rustup set default-host x86_64-pc-windows-gnu
rustup show
build: >-
set -e &&
which rustup &&
rustup target add x86_64-pc-windows-gnu &&
rustup component add rust-src --toolchain nightly-2025-07-25-x86_64-pc-windows-gnu &&
npm run build:napi -- --release --target x86_64-pc-windows-gnu
env:
MINGW_ARCH: ucrt64
# MacOS
- host: macos-latest
target: x86_64-apple-darwin
- host: macos-latest
target: aarch64-apple-darwin
# Linux
- host: ubuntu-latest
target: x86_64-unknown-linux-gnu
cross: napi
- host: ubuntu-latest
target: x86_64-unknown-linux-musl
cross: zig
- host: ubuntu-latest
target: armv7-unknown-linux-gnueabihf
env:
TARGET_CC: clang
setup: |
sudo apt-get update
sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libatomic1-armhf-cross -y
cross: napi
- host: ubuntu-latest
target: armv7-unknown-linux-musleabihf
cross: zig
- host: ubuntu-latest
target: aarch64-unknown-linux-gnu
env:
TARGET_CC: clang
setup: |
sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu -y
cross: napi
- host: ubuntu-latest
target: aarch64-unknown-linux-musl
cross: zig
- host: ubuntu-latest
target: armv7-linux-androideabi
cross: napi
- host: ubuntu-latest
target: aarch64-linux-android
cross: napi
# There are compile issues when using the cache with Android
cache-cargo: false
- host: ubuntu-latest
target: riscv64gc-unknown-linux-gnu
setup: |
sudo apt-get update
sudo apt-get install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu -y
- host: ubuntu-latest
target: riscv64gc-unknown-linux-musl
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
build: >-
set -e &&
unset CC &&
export TARGET_CC=clang &&
apk add binutils-riscv64 &&
mkdir -p /sysroot-riscv64/etc/apk &&
echo 'https://dl-cdn.alpinelinux.org/alpine/edge/main' > /sysroot-riscv64/etc/apk/repositories &&
apk add -U --initdb --allow-untrusted --arch riscv64 --root /sysroot-riscv64 gcc musl-dev &&
export RUSTFLAGS="
-C link-args=-L$(echo /sysroot-riscv64/usr/lib/gcc/riscv64-alpine-linux-musl/*)
-C link-args=-L/sysroot-riscv64/usr/lib
-C linker=riscv64-alpine-linux-musl-ld
" &&
rustup default nightly-2025-07-25 &&
rustup target add riscv64gc-unknown-linux-musl &&
npm run build:napi -- --release --target riscv64gc-unknown-linux-musl
- host: ubuntu-latest
target: powerpc64le-unknown-linux-gnu
env:
TARGET_CC: clang
setup: |
sudo apt-get update
sudo apt-get install gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu -y
cross: napi
- host: ubuntu-latest
target: s390x-unknown-linux-gnu
env:
CC: clang
TARGET_CC: clang
CFLAGS: -fuse-ld=lld
setup: |
sudo apt-get update
sudo apt-get install gcc-s390x-linux-gnu g++-s390x-linux-gnu -y
cross: napi
- host: ubuntu-latest
target: loongarch64-unknown-linux-gnu
setup: |
sudo apt-get update
sudo apt-get install gcc-13-loongarch64-linux-gnu -y
sudo update-alternatives \
--install /usr/bin/loongarch64-linux-gnu-gcc loongarch64-linux-gnu-gcc /usr/bin/loongarch64-linux-gnu-gcc-13 100 \
--slave /usr/bin/loongarch64-linux-gnu-gcc-ar loongarch64-linux-gnu-gcc-ar /usr/bin/loongarch64-linux-gnu-gcc-ar-13 \
--slave /usr/bin/loongarch64-linux-gnu-gcc-nm loongarch64-linux-gnu-gcc-nm /usr/bin/loongarch64-linux-gnu-gcc-nm-13 \
--slave /usr/bin/loongarch64-linux-gnu-gcc-ranlib loongarch64-linux-gnu-gcc-ranlib /usr/bin/loongarch64-linux-gnu-gcc-ranlib-13 \
--slave /usr/bin/loongarch64-linux-gnu-gcov loongarch64-linux-gnu-gcov /usr/bin/loongarch64-linux-gnu-gcov-13
sudo update-alternatives \
--install /usr/bin/loongarch64-linux-gnu-cpp loongarch64-linux-gnu-cpp /usr/bin/loongarch64-linux-gnu-cpp-13 100
- host: ubuntu-latest
target: aarch64-unknown-linux-ohos
# FreeBSD
- host: ubuntu-latest
target: x86_64-unknown-freebsd
cross: cross
build-std: true
- host: ubuntu-latest
target: aarch64-unknown-freebsd
cross: cross
build-std: true
name: Build ${{ matrix.settings.name || matrix.settings.target }}
runs-on: ${{ matrix.settings.host }}
timeout-minutes: 30
steps:
- name: Checkout Commit
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Setup Node
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
if: ${{ !matrix.settings.docker && matrix.settings.target != 'x86_64-pc-windows-gnu' }}
with:
node-version: 24.8.0
- uses: msys2/setup-msys2@v2
if: ${{ matrix.settings.target == 'x86_64-pc-windows-gnu' }}
with:
msystem: ${{ matrix.settings.msystem }}
install: mingw-w64-${{ matrix.settings.toolchain }}-toolchain base-devel binutils
pacboy: >-
rustup:p
nodejs:p
rust-wasm:p
rust-src:p
update: true
path-type: inherit
release: false
- name: Install Toolchain
uses: dtolnay/rust-toolchain@stable
if: ${{ !matrix.settings.docker }}
with:
toolchain: nightly-2025-07-25
components: ${{ matrix.settings.build-std && 'rust-src' || '' }}
targets: ${{ !matrix.settings.build-std && matrix.settings.target || '' }}
- name: Setup OpenHarmony SDK
if: ${{ contains(matrix.settings.target, 'ohos') }}
uses: openharmony-rs/setup-ohos-sdk@3c181b3244cec76aaec289ab84fb00f55f2fce3f # v0.2.4
- name: Restore Cargo cache
uses: actions/cache/restore@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
if: matrix.settings.cache-cargo != false
with:
path: |
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
.cargo-cache
rust/target/
key: ${{ matrix.settings.name || matrix.settings.target }}-cargo-${{ matrix.settings.host }}-${{ hashFiles('rust/Cargo.lock') }}
restore-keys: ${{ matrix.settings.name || matrix.settings.target }}-cargo-${{ matrix.settings.host }}
- uses: goto-bus-stop/setup-zig@abea47f85e598557f500fa1fd2ab7464fcb39406 # v2.2.1
if: ${{ matrix.settings.cross == 'zig' }}
with:
version: 0.14.1
- name: Install cargo-zigbuild
uses: taiki-e/install-action@5597bc27da443ba8bf9a3bc4e5459ea59177de42 # v2.62.4
if: ${{ matrix.settings.cross == 'zig' }}
env:
GITHUB_TOKEN: ${{ github.token }}
with:
tool: cargo-zigbuild
- name: Install cross
if: ${{ matrix.settings.cross == 'cross' }}
# 0.2.5 is getting old, aarch64-unknown-freebsd support added since then...
run: cargo install --git https://github.com/cross-rs/cross --rev e281947ca900da425e4ecea7483cfde646c8a1ea cross
shell: bash
- name: Setup toolchain
run: ${{ matrix.settings.setup }}
if: ${{ matrix.settings.setup }}
shell: bash
- name: Install and Cache Node Dependencies
uses: ./.github/actions/install-and-cache-node-deps
- name: Build in docker
uses: addnab/docker-run-action@4f65fabd2431ebc8d299f8e5a018d79a769ae185 # v3
if: ${{ matrix.settings.docker }}
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 }}
- name: Msys2 build
if: ${{ matrix.settings.target == 'x86_64-pc-windows-gnu' }}
run: ${{ matrix.settings.build }}
shell: msys2 {0}
- name: Build (Matrix override)
env: ${{ matrix.settings.env || fromJSON('{}') }}
run: ${{ matrix.settings.build }}
if: ${{ !matrix.settings.docker && matrix.settings.build && matrix.settings.target != 'x86_64-pc-windows-gnu' }}
- name: Build (Classic)
env: ${{ matrix.settings.env || fromJSON('{}') }}
run: npm run build:napi -- --release --target ${{ matrix.settings.target }} ${{ matrix.settings.cross == 'zig' && '-x' || matrix.settings.cross == 'napi' && '--use-napi-cross' || matrix.settings.cross == 'cross' && '--use-cross' || '' }} -- ${{ matrix.settings.build-std && '-Zbuild-std=std,core,alloc,panic_unwind -Zbuild-std-features=panic-unwind' || '' }}
if: ${{ !matrix.settings.docker && !matrix.settings.build }}
shell: bash
- name: Save Cargo cache
if: github.ref == 'refs/heads/master' && matrix.settings.cache-cargo != false
uses: actions/cache/save@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
with:
path: |
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
.cargo-cache
rust/target/
key: ${{ matrix.settings.name || matrix.settings.target }}-cargo-${{ matrix.settings.host }}-${{ hashFiles('rust/Cargo.lock') }}
- name: Upload wasm artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: bindings-${{ matrix.settings.name }}
path: ${{ matrix.settings.path }}
if-no-files-found: error
if: ${{ matrix.settings.is-wasm-build }}
- name: Upload napi artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: bindings-${{ matrix.settings.target }}
path: ${{ env.APP_NAME }}.*.node
if-no-files-found: error
if: ${{ !matrix.settings.is-wasm-build }}
# smoke test for some architectures that do not receive the full test suite
smoke-test:
permissions:
packages: write # for caching container images
name: Smoke Test ${{ matrix.settings.target }}
needs:
- build
strategy:
fail-fast: false
matrix:
settings:
- arch: aarch64
distro: alpine_latest
target: aarch64-unknown-linux-musl
- arch: armv7
distro: ubuntu_latest
target: armv7-unknown-linux-gnueabihf
# There is a bug that hangs the build when running npm
# - arch: armv7
# distro: alpine_latest
# target: armv7-unknown-linux-musleabihf
# This one has become very flaky as of late
# - arch: ppc64le
# distro: ubuntu_latest
# target: powerpc64le-unknown-linux-gnu
# use-nvm: true
- arch: s390x
distro: ubuntu_latest
target: s390x-unknown-linux-gnu
use-nvm: true
# I could not find a way to install Node without compiling from source
# - arch: riscv64
# distro: ubuntu_latest
# target: riscv64gc-unknown-linux-gnu
runs-on: ubuntu-latest
timeout-minutes: 120
steps:
- name: Checkout Commit
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Install and Cache Node Dependencies
uses: ./.github/actions/install-and-cache-node-deps
- name: Build JS
run: npm run build:cjs
- name: Download napi artifacts
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: bindings-${{ matrix.settings.target }}
path: dist/
- name: Run Smoke Test
uses: uraimo/run-on-arch-action@d94c13912ea685de38fccc1109385b83fd79427d # v3.0.1
with:
arch: ${{ matrix.settings.arch }}
distro: ${{ matrix.settings.distro }}
githubToken: ${{ github.token }}
install: |
case "${{ matrix.settings.distro }}" in
ubuntu*)
apt-get update -y
apt-get install -y curl git
if [[ -z "${{ matrix.settings.use-nvm }}" ]]; then
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
apt-get install -y nodejs
fi
;;
alpine*)
apk add nodejs npm git
;;
esac
run: |
set -e
if [[ -n "${{ matrix.settings.use-nvm }}" ]]; then
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
source ~/.nvm/nvm.sh
nvm install --lts
fi
echo "Node: $(node -v)"
echo "npm: $(npm -v)"
git config --global --add safe.directory /home/runner/work/rollup/rollup
chmod +x dist/bin/rollup
dist/bin/rollup --version | grep -E 'rollup v[0-9]+\.[0-9]+\.[0-9]+'
mv dist dist-build
node dist-build/bin/rollup --config rollup.config.ts --configPlugin typescript --configTest --forceExit
cp dist-build/rollup.*.node dist/
dist/bin/rollup --version | grep -E 'rollup v[0-9]+\.[0-9]+\.[0-9]+'
test:
name: Test${{ matrix.additionalName || '' }} Node ${{ matrix.node }} (${{ matrix.settings.target }})
needs:
- build
strategy:
fail-fast: false
matrix:
settings:
- host: ubuntu-latest
target: x86_64-unknown-linux-gnu
- host: windows-latest
target: x86_64-pc-windows-msvc
- host: macos-latest
target: aarch64-apple-darwin
- host: ubuntu-24.04-arm
target: aarch64-unknown-linux-gnu
- host: windows-11-arm
target: aarch64-pc-windows-msvc
node:
- '18.20.0'
- 24
include:
- settings:
host: ubuntu-latest
target: x86_64-unknown-linux-gnu
node: 24
command: 'ci:coverage'
additionalName: ' with Coverage'
coverage: true
- settings:
host: ubuntu-latest
target: x86_64-unknown-linux-gnu
node: '18.20.0'
command: 'ci:test:all'
additionalName: ' with Additional Tests'
exclude:
# Windows ARM builds were not provided for a while
- settings:
target: aarch64-pc-windows-msvc
node: '18.20.0'
runs-on: ${{ matrix.settings.host }}
timeout-minutes: 15
steps:
- name: Checkout Commit
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Setup Node
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: ${{ matrix.node }}
check-latest: true
- name: Install and Cache Node Dependencies
uses: ./.github/actions/install-and-cache-node-deps
- name: Download napi artifacts
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: bindings-${{ matrix.settings.target }}
path: .
- name: Download wasm artifacts
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: bindings-wasm
- name: Build and test Rollup
run: npm run ${{ matrix.command || 'ci:test:only' }}
env:
CI: true
- name: Upload coverage
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
if: matrix.coverage
with:
fail_ci_if_error: true
verbose: true
token: ${{ secrets.CODECOV_TOKEN }}
publish:
permissions:
pull-requests: write # for writing comments
issues: write # for writing comments
contents: write # for creating a release
name: Publish
runs-on: ubuntu-latest
timeout-minutes: 15
needs:
- lint
- test
- smoke-test
# This needs to be adapted for Rollup 5
if: startsWith(github.ref_name, 'v4')
steps:
- name: Checkout Commit
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
# Necessary to find the commits included in the release
fetch-depth: 0
- name: Setup Node
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: ${{ matrix.node }}
check-latest: true
- name: Install and Cache Node Dependencies
uses: ./.github/actions/install-and-cache-node-deps
- name: Download all artifacts
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
path: artifacts
- name: Copy wasm files
run: cp -R artifacts/bindings-wasm/wasm .
- name: Build JavaScript
run: npm run build:cjs && cp artifacts/*/*.node dist/ && npm run build:bootstrap
- name: Move artifacts
run: npm run ci:artifacts
- name: Publish
run: |
if git --no-pager log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+$";
then
echo "Publishing regular release"
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
npm publish --access public
elif git --no-pager log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+-[0-9]\+$";
then
echo "Publishing beta release"
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
npm publish --tag beta --access public
else
echo "Not a release, skipping publish"
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
ROLLUP_RELEASE: 'releasing'