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: 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 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: RUST_TARGET: ${{ matrix.target }} - name: Build CLI 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