| name: release |
| on: |
| workflow_dispatch: |
| |
| jobs: |
| build: |
| strategy: |
| fail-fast: false |
| matrix: |
| include: |
| # Windows |
| - os: windows-latest |
| target: x86_64-pc-windows-msvc |
| binary: lightningcss.exe |
| - os: windows-latest |
| target: aarch64-pc-windows-msvc |
| binary: lightningcss.exe |
| # Mac OS |
| - os: macos-latest |
| target: x86_64-apple-darwin |
| strip: strip -x # Must use -x on macOS. This produces larger results on linux. |
| binary: lightningcss |
| |
| name: build-${{ matrix.target }} |
| runs-on: ${{ matrix.os }} |
| steps: |
| - uses: actions/checkout@v3 |
| - name: Install Node.JS |
| uses: actions/setup-node@v3 |
| with: |
| node-version: 18 |
| - name: Install Rust |
| uses: dtolnay/rust-toolchain@stable |
| |
| - name: Setup rust target |
| run: rustup target add ${{ matrix.target }} |
| |
| - uses: bahmutov/npm-install@v1.8.32 |
| - name: Build release |
| run: yarn build-release |
| env: |
| RUST_TARGET: ${{ matrix.target }} |
| - name: Build CLI |
| run: | |
| cargo build --release --features cli --target ${{ matrix.target }} |
| node -e "require('fs').renameSync('target/${{ matrix.target }}/release/${{ matrix.binary }}', '${{ matrix.binary }}')" |
| - name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034 |
| if: ${{ matrix.strip }} |
| run: ${{ matrix.strip }} *.node ${{ matrix.binary }} |
| - name: Upload artifacts |
| uses: actions/upload-artifact@v4 |
| with: |
| name: bindings-${{ matrix.target }} |
| path: | |
| *.node |
| ${{ matrix.binary }} |
| |
| build-apple-silicon: |
| name: build-apple-silicon |
| runs-on: macos-latest |
| steps: |
| - uses: actions/checkout@v3 |
| - name: Install Node.JS |
| uses: actions/setup-node@v3 |
| with: |
| node-version: 18 |
| - name: Install Rust |
| uses: dtolnay/rust-toolchain@stable |
| |
| - name: Setup rust target |
| run: rustup target add aarch64-apple-darwin |
| |
| - uses: bahmutov/npm-install@v1.8.32 |
| - name: Build release |
| run: yarn build-release |
| env: |
| RUST_TARGET: aarch64-apple-darwin |
| JEMALLOC_SYS_WITH_LG_PAGE: 14 |
| - name: Build CLI |
| run: | |
| export CC=$(xcrun -f clang); |
| export CXX=$(xcrun -f clang++); |
| SYSROOT=$(xcrun --sdk macosx --show-sdk-path); |
| export CFLAGS="-isysroot $SYSROOT -isystem $SYSROOT"; |
| export MACOSX_DEPLOYMENT_TARGET="10.9"; |
| cargo build --release --features cli --target aarch64-apple-darwin |
| mv target/aarch64-apple-darwin/release/lightningcss lightningcss |
| env: |
| JEMALLOC_SYS_WITH_LG_PAGE: 14 |
| - name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034 |
| run: strip -x *.node lightningcss |
| - name: Upload artifacts |
| uses: actions/upload-artifact@v4 |
| with: |
| name: bindings-aarch64-apple-darwin |
| path: | |
| *.node |
| lightningcss |
| |
| build-linux: |
| strategy: |
| fail-fast: false |
| matrix: |
| include: |
| - target: x86_64-unknown-linux-gnu |
| strip: strip |
| image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian |
| setup: npm install --global yarn@1 |
| - target: aarch64-unknown-linux-gnu |
| strip: llvm-strip |
| image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 |
| - target: aarch64-linux-android |
| strip: llvm-strip |
| image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 |
| - target: armv7-unknown-linux-gnueabihf |
| strip: llvm-strip |
| image: ghcr.io/napi-rs/napi-rs/nodejs-rust@sha256:c22284b2d79092d3e885f64ede00f6afdeb2ccef7e2b6e78be52e7909091cd57 |
| - target: aarch64-unknown-linux-musl |
| image: ghcr.io/napi-rs/napi-rs/nodejs-rust@sha256:78c9ab1f117f8c535b93c4b91a2f19063dda6e4dba48a6187df49810625992c1 |
| strip: aarch64-linux-musl-strip |
| - target: x86_64-unknown-linux-musl |
| image: ghcr.io/napi-rs/napi-rs/nodejs-rust@sha256:78c9ab1f117f8c535b93c4b91a2f19063dda6e4dba48a6187df49810625992c1 |
| strip: strip |
| |
| name: build-${{ matrix.target }} |
| runs-on: ubuntu-latest |
| container: |
| image: ${{ matrix.image }} |
| |
| steps: |
| - uses: actions/checkout@v3 |
| - name: Install Node.JS |
| uses: actions/setup-node@v3 |
| with: |
| node-version: 18 |
| - name: Install Rust |
| uses: dtolnay/rust-toolchain@stable |
| |
| - name: Setup Android NDK |
| if: ${{ matrix.target == 'aarch64-linux-android' }} |
| run: | |
| sudo apt update && sudo apt install unzip -y |
| cd /tmp |
| wget -q https://dl.google.com/android/repository/android-ndk-r28-linux.zip -O /tmp/ndk.zip |
| unzip ndk.zip |
| |
| - name: Setup cross compile toolchain |
| if: ${{ matrix.setup }} |
| run: ${{ matrix.setup }} |
| |
| - name: Setup rust target |
| run: rustup target add ${{ matrix.target }} |
| |
| - uses: bahmutov/npm-install@v1.8.32 |
| - name: Build release |
| run: yarn build-release |
| env: |
| ANDROID_NDK_LATEST_HOME: /tmp/android-ndk-r28 |
| RUST_TARGET: ${{ matrix.target }} |
| - name: Build CLI |
| env: |
| ANDROID_NDK_LATEST_HOME: /tmp/android-ndk-r28 |
| run: | |
| yarn napi build --bin lightningcss --release --features cli --target ${{ matrix.target }} |
| mv target/${{ matrix.target }}/release/lightningcss lightningcss |
| - name: Strip debug symbols # https://github.com/rust-lang/rust/issues/46034 |
| if: ${{ matrix.strip }} |
| run: ${{ matrix.strip }} *.node lightningcss |
| - name: Upload artifacts |
| uses: actions/upload-artifact@v4 |
| with: |
| name: bindings-${{ matrix.target }} |
| path: | |
| *.node |
| lightningcss |
| |
| build-freebsd: |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v3 |
| - 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 |
| 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 yarn |
| curl https://sh.rustup.rs -sSf --output rustup.sh |
| sh rustup.sh -y --profile minimal --default-toolchain beta |
| source "$HOME/.cargo/env" |
| echo "~~~~ rustc --version ~~~~" |
| rustc --version |
| echo "~~~~ node -v ~~~~" |
| node -v |
| echo "~~~~ yarn --version ~~~~" |
| yarn --version |
| yarn install || true |
| yarn build-release |
| strip -x *.node |
| cargo build --release --features cli |
| mv target/release/lightningcss lightningcss |
| node -e "require('.')" |
| ./lightningcss --help |
| rm -rf node_modules |
| rm -rf target |
| rm -rf .yarn/cache |
| |
| - name: Upload artifacts |
| uses: actions/upload-artifact@v4 |
| with: |
| name: bindings-x86_64-unknown-freebsd |
| path: | |
| *.node |
| lightningcss |
| |
| build-wasm: |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@v3 |
| - name: Install Node.JS |
| uses: actions/setup-node@v3 |
| with: |
| node-version: 18 |
| - uses: bahmutov/npm-install@v1.8.32 |
| - name: Install Rust |
| uses: dtolnay/rust-toolchain@stable |
| with: |
| targets: wasm32-unknown-unknown |
| - name: Setup rust target |
| run: rustup target add wasm32-unknown-unknown |
| - name: Install wasm-opt |
| run: | |
| curl -L -O https://github.com/WebAssembly/binaryen/releases/download/version_111/binaryen-version_111-x86_64-linux.tar.gz |
| tar -xf binaryen-version_111-x86_64-linux.tar.gz |
| - name: Build wasm |
| run: | |
| export PATH="$PATH:./binaryen-version_111/bin" |
| yarn wasm:build-release |
| - name: Upload artifacts |
| uses: actions/upload-artifact@v4 |
| with: |
| name: wasm |
| path: wasm/lightningcss_node.wasm |
| |
| release: |
| runs-on: ubuntu-latest |
| name: Build and release |
| needs: |
| - build |
| - build-linux |
| - build-apple-silicon |
| - build-freebsd |
| - build-wasm |
| steps: |
| - uses: actions/checkout@v3 |
| - uses: bahmutov/npm-install@v1.8.32 |
| - name: Download artifacts |
| uses: actions/download-artifact@v4 |
| with: |
| path: artifacts |
| - name: Show artifacts |
| run: ls -R artifacts |
| - name: Build npm packages |
| run: | |
| node scripts/build-npm.js |
| cp artifacts/wasm/* wasm/. |
| node scripts/build-wasm.js |
| - run: echo //registry.npmjs.org/:_authToken=${NPM_TOKEN} > ~/.npmrc |
| env: |
| NPM_TOKEN: ${{ secrets.NPM_TOKEN }} |
| - name: Publish to npm |
| run: | |
| for pkg in npm/*; do |
| echo "Publishing $pkg..." |
| cd $pkg; |
| npm publish; |
| cd ../..; |
| done |
| cd wasm |
| echo "Publishing lightningcss-wasm..."; |
| npm publish |
| cd .. |
| cd cli |
| echo "Publishing lightningcss-cli..."; |
| npm publish |
| cd .. |
| echo "Publishing lightningcss..."; |
| npm publish |
| |
| release-crates: |
| runs-on: ubuntu-latest |
| name: Release Rust crate |
| steps: |
| - uses: actions/checkout@v3 |
| - uses: bahmutov/npm-install@v1.8.32 |
| - name: Install Rust |
| uses: dtolnay/rust-toolchain@stable |
| - run: cargo login ${CRATES_IO_TOKEN} |
| env: |
| CRATES_IO_TOKEN: ${{ secrets.CRATES_IO_TOKEN }} |
| - run: | |
| cargo install cargo-workspaces |
| cargo workspaces publish --no-remove-dev-deps --from-git -y |