This PR updates the CI workflows related to NAPI-RS. So far, we've been using a custom ghcr.io based image, but these run on Node v18. With this PR, I created a new project using `napi new`, with GitHub Actions workflow setup. Then essentially ported the changes from that new project to this project (as minimal as possible). The main goal was to be able to bump NAPI-RS related dependencies _and_ get an insiders release out. The images used in these CI jobs were blockers to get an actual (insiders) release out. ## Test plan 1. CI still passes 2. Added a dry-run on the prepare release workflow to test that we got through the entire workflow without issues
361 lines
12 KiB
YAML
361 lines
12 KiB
YAML
name: Prepare Release
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
dry_run:
|
|
description: Skip creating the draft GitHub release
|
|
required: false
|
|
default: true
|
|
type: boolean
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
|
|
env:
|
|
APP_NAME: tailwindcss-oxide
|
|
NODE_VERSION: 24
|
|
PNPM_VERSION: '9.6.0'
|
|
OXIDE_LOCATION: ./crates/node
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
build:
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
# Windows
|
|
- os: windows-latest
|
|
target: x86_64-pc-windows-msvc
|
|
- os: windows-latest
|
|
target: aarch64-pc-windows-msvc
|
|
# macOS
|
|
- os: macos-latest
|
|
target: x86_64-apple-darwin
|
|
strip: strip -x # Must use -x on macOS. This produces larger results on linux.
|
|
- os: macos-latest
|
|
target: aarch64-apple-darwin
|
|
page-size: 14
|
|
strip: strip -x # Must use -x on macOS. This produces larger results on linux.
|
|
# Android
|
|
- os: ubuntu-latest
|
|
target: aarch64-linux-android
|
|
strip: ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip
|
|
- os: ubuntu-latest
|
|
target: armv7-linux-androideabi
|
|
strip: ${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip
|
|
# Linux
|
|
- os: ubuntu-latest
|
|
target: x86_64-unknown-linux-gnu
|
|
strip: strip
|
|
build-flags: --use-napi-cross
|
|
- os: ubuntu-latest
|
|
target: aarch64-unknown-linux-gnu
|
|
strip: aarch64-linux-gnu-strip
|
|
build-flags: --use-napi-cross
|
|
- os: ubuntu-latest
|
|
target: armv7-unknown-linux-gnueabihf
|
|
strip: arm-linux-gnueabihf-strip
|
|
build-flags: --use-napi-cross
|
|
- os: ubuntu-latest
|
|
target: aarch64-unknown-linux-musl
|
|
strip-zig: true
|
|
build-flags: -x
|
|
- os: ubuntu-latest
|
|
target: x86_64-unknown-linux-musl
|
|
strip: strip
|
|
build-flags: -x
|
|
|
|
name: Build ${{ matrix.target }} (oxide)
|
|
runs-on: ${{ matrix.os }}
|
|
timeout-minutes: 15
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- uses: pnpm/action-setup@v6
|
|
with:
|
|
version: ${{ env.PNPM_VERSION }}
|
|
|
|
- name: Use Node.js ${{ env.NODE_VERSION }}
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
cache: 'pnpm'
|
|
|
|
- name: Install gcc-arm-linux-gnueabihf
|
|
if: ${{ matrix.target == 'armv7-unknown-linux-gnueabihf' }}
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
|
|
|
|
- name: Install binutils-aarch64-linux-gnu
|
|
if: ${{ matrix.target == 'aarch64-unknown-linux-gnu' }}
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install binutils-aarch64-linux-gnu -y
|
|
|
|
# Cargo already skips downloading dependencies if they already exist
|
|
- name: Cache cargo
|
|
uses: actions/cache@v5
|
|
with:
|
|
path: |
|
|
~/.cargo/bin/
|
|
~/.cargo/registry/index/
|
|
~/.cargo/registry/cache/
|
|
~/.cargo/git/db/
|
|
~/.napi-rs
|
|
.cargo-cache
|
|
target/
|
|
key: ${{ runner.os }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
|
|
# Cache the `oxide` Rust build
|
|
- name: Cache oxide build
|
|
uses: actions/cache@v5
|
|
with:
|
|
path: |
|
|
./crates/node/*.node
|
|
./crates/node/*.wasm
|
|
./crates/node/index.d.ts
|
|
./crates/node/index.js
|
|
./crates/node/browser.js
|
|
./crates/node/tailwindcss-oxide.wasi-browser.js
|
|
./crates/node/tailwindcss-oxide.wasi.cjs
|
|
./crates/node/wasi-worker-browser.mjs
|
|
./crates/node/wasi-worker.mjs
|
|
key: ${{ runner.os }}-${{ matrix.target }}-oxide-${{ hashFiles('./crates/**/*') }}
|
|
|
|
- uses: mlugg/setup-zig@v2
|
|
if: ${{ contains(matrix.target, 'musl') }}
|
|
with:
|
|
version: 0.14.1
|
|
|
|
- name: Install cargo-zigbuild
|
|
uses: taiki-e/install-action@v2
|
|
if: ${{ contains(matrix.target, 'musl') }}
|
|
env:
|
|
GITHUB_TOKEN: ${{ github.token }}
|
|
with:
|
|
tool: cargo-zigbuild
|
|
|
|
- name: Setup rust target
|
|
run: rustup target add ${{ matrix.target }}
|
|
|
|
- name: Install dependencies
|
|
run: pnpm install --ignore-scripts --filter=!./playgrounds/*
|
|
|
|
- name: Build release
|
|
run: pnpm run --filter ${{ env.OXIDE_LOCATION }} build:platform --target=${{ matrix.target }} ${{ matrix.build-flags }}
|
|
env:
|
|
RUST_TARGET: ${{ matrix.target }}
|
|
JEMALLOC_SYS_WITH_LG_PAGE: ${{ matrix.page-size }}
|
|
|
|
- name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034
|
|
if: ${{ matrix.strip || matrix.strip-zig }}
|
|
env:
|
|
STRIP_COMMAND: ${{ matrix.strip }}
|
|
STRIP_ZIG: ${{ matrix.strip-zig }}
|
|
run: |
|
|
if [ "$STRIP_ZIG" = "true" ]; then
|
|
for file in ${{ env.OXIDE_LOCATION }}/*.node; do
|
|
zig objcopy --strip-all "$file" "$file.stripped"
|
|
mv "$file.stripped" "$file"
|
|
done
|
|
exit 0
|
|
fi
|
|
|
|
eval "$STRIP_COMMAND ${{ env.OXIDE_LOCATION }}/*.node"
|
|
|
|
- name: Upload artifacts
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: bindings-${{ matrix.target }}
|
|
path: ${{ env.OXIDE_LOCATION }}/*.node
|
|
|
|
build-freebsd:
|
|
name: Build x86_64-unknown-freebsd (OXIDE)
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
- name: Build FreeBSD
|
|
uses: cross-platform-actions/action@v0.25.0
|
|
env:
|
|
DEBUG: napi:*
|
|
RUSTUP_HOME: /usr/local/rustup
|
|
CARGO_HOME: /usr/local/cargo
|
|
RUSTUP_IO_THREADS: 1
|
|
RUST_TARGET: x86_64-unknown-freebsd
|
|
with:
|
|
operating_system: freebsd
|
|
version: '14.0'
|
|
memory: 13G
|
|
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 pnpm@${{ env.PNPM_VERSION }} --unsafe-perm=true
|
|
curl -sSf https://static.rust-lang.org/rustup/archive/1.27.1/x86_64-unknown-freebsd/rustup-init --output rustup-init
|
|
chmod +x rustup-init
|
|
./rustup-init -y --profile minimal
|
|
source "$HOME/.cargo/env"
|
|
pnpm install --ignore-scripts --filter=!./playgrounds/* || true
|
|
echo "~~~~ rustc --version ~~~~"
|
|
rustc --version
|
|
echo "~~~~ node -v ~~~~"
|
|
node -v
|
|
echo "~~~~ pnpm --version ~~~~"
|
|
pnpm --version
|
|
pnpm run --filter ${{ env.OXIDE_LOCATION }} build:platform
|
|
strip -x ${{ env.OXIDE_LOCATION }}/*.node
|
|
ls -la ${{ env.OXIDE_LOCATION }}
|
|
- name: Upload artifacts
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: bindings-x86_64-unknown-freebsd
|
|
path: ${{ env.OXIDE_LOCATION }}/*.node
|
|
|
|
prepare:
|
|
runs-on: macos-14
|
|
timeout-minutes: 15
|
|
name: Build and release Tailwind CSS
|
|
|
|
permissions:
|
|
contents: write # for softprops/action-gh-release to create GitHub release
|
|
# https://docs.npmjs.com/generating-provenance-statements#publishing-packages-with-provenance-via-github-actions
|
|
id-token: write
|
|
|
|
needs:
|
|
- build
|
|
- build-freebsd
|
|
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
fetch-depth: 20
|
|
|
|
- run: git fetch --tags -f
|
|
|
|
- name: Resolve version
|
|
id: vars
|
|
run: |
|
|
echo "TAG_NAME=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
|
|
|
|
- uses: pnpm/action-setup@v6
|
|
with:
|
|
version: ${{ env.PNPM_VERSION }}
|
|
|
|
- name: Use Node.js ${{ env.NODE_VERSION }}
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
cache: 'pnpm'
|
|
registry-url: 'https://registry.npmjs.org'
|
|
|
|
# Cargo already skips downloading dependencies if they already exist
|
|
- name: Cache cargo
|
|
uses: actions/cache@v5
|
|
with:
|
|
path: |
|
|
~/.cargo/bin/
|
|
~/.cargo/registry/index/
|
|
~/.cargo/registry/cache/
|
|
~/.cargo/git/db/
|
|
target/
|
|
key: ${{ runner.os }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
|
|
# Cache the `oxide` Rust build
|
|
- name: Cache oxide build
|
|
uses: actions/cache@v5
|
|
with:
|
|
path: |
|
|
./crates/node/*.node
|
|
./crates/node/*.wasm
|
|
./crates/node/index.d.ts
|
|
./crates/node/index.js
|
|
./crates/node/browser.js
|
|
./crates/node/tailwindcss-oxide.wasi-browser.js
|
|
./crates/node/tailwindcss-oxide.wasi.cjs
|
|
./crates/node/wasi-worker-browser.mjs
|
|
./crates/node/wasi-worker.mjs
|
|
key: ${{ runner.os }}-${{ matrix.target }}-oxide-${{ hashFiles('./crates/**/*') }}
|
|
|
|
- name: Setup WASM target
|
|
run: rustup target add wasm32-wasip1-threads
|
|
|
|
- name: Install dependencies
|
|
run: pnpm --filter=!./playgrounds/* install
|
|
|
|
- name: Download artifacts
|
|
uses: actions/download-artifact@v7
|
|
with:
|
|
path: ${{ env.OXIDE_LOCATION }}
|
|
|
|
- name: Move artifacts
|
|
run: |
|
|
cd ${{ env.OXIDE_LOCATION }}
|
|
cp bindings-x86_64-pc-windows-msvc/* ./npm/win32-x64-msvc/
|
|
cp bindings-aarch64-pc-windows-msvc/* ./npm/win32-arm64-msvc/
|
|
cp bindings-x86_64-apple-darwin/* ./npm/darwin-x64/
|
|
cp bindings-aarch64-apple-darwin/* ./npm/darwin-arm64/
|
|
cp bindings-aarch64-linux-android/* ./npm/android-arm64/
|
|
cp bindings-armv7-linux-androideabi/* ./npm/android-arm-eabi/
|
|
cp bindings-aarch64-unknown-linux-gnu/* ./npm/linux-arm64-gnu/
|
|
cp bindings-aarch64-unknown-linux-musl/* ./npm/linux-arm64-musl/
|
|
cp bindings-armv7-unknown-linux-gnueabihf/* ./npm/linux-arm-gnueabihf/
|
|
cp bindings-x86_64-unknown-linux-gnu/* ./npm/linux-x64-gnu/
|
|
cp bindings-x86_64-unknown-linux-musl/* ./npm/linux-x64-musl/
|
|
cp bindings-x86_64-unknown-freebsd/* ./npm/freebsd-x64/
|
|
|
|
- name: Build Tailwind CSS
|
|
run: pnpm run build
|
|
env:
|
|
FEATURES_ENV: stable
|
|
|
|
- name: Run pre-publish optimizations scripts
|
|
run: node ./scripts/pre-publish-optimizations.mjs
|
|
|
|
- name: Lock pre-release versions
|
|
run: node ./scripts/lock-pre-release-versions.mjs
|
|
|
|
- name: Get release notes
|
|
run: |
|
|
RELEASE_NOTES=$(node ./scripts/release-notes.mjs)
|
|
echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
|
|
echo "$RELEASE_NOTES" >> $GITHUB_ENV
|
|
echo "EOF" >> $GITHUB_ENV
|
|
|
|
- name: Upload standalone artifacts
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: tailwindcss-standalone
|
|
path: packages/@tailwindcss-standalone/dist/
|
|
|
|
- name: Upload npm package tarballs
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: npm-package-tarballs
|
|
path: dist/*.tgz
|
|
|
|
- name: Prepare GitHub Release
|
|
if: ${{ !inputs.dry_run }}
|
|
uses: softprops/action-gh-release@v2
|
|
with:
|
|
draft: true
|
|
tag_name: ${{ env.TAG_NAME }}
|
|
body: |
|
|
${{ env.RELEASE_NOTES }}
|
|
files: |
|
|
packages/@tailwindcss-standalone/dist/sha256sums.txt
|
|
packages/@tailwindcss-standalone/dist/tailwindcss-linux-arm64
|
|
packages/@tailwindcss-standalone/dist/tailwindcss-linux-arm64-musl
|
|
packages/@tailwindcss-standalone/dist/tailwindcss-linux-x64
|
|
packages/@tailwindcss-standalone/dist/tailwindcss-linux-x64-musl
|
|
packages/@tailwindcss-standalone/dist/tailwindcss-macos-arm64
|
|
packages/@tailwindcss-standalone/dist/tailwindcss-macos-x64
|
|
packages/@tailwindcss-standalone/dist/tailwindcss-windows-x64.exe
|