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 # 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: 14 - name: Install Rust uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal override: true - name: Setup rust target run: rustup target add ${{ matrix.target }} - uses: bahmutov/npm-install@v1.1.0 - 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@v3 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: 14 - name: Install Rust uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal override: true - name: Setup rust target run: rustup target add aarch64-apple-darwin - uses: bahmutov/npm-install@v1.1.0 - 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@v3 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:lts-debian-zig - target: aarch64-unknown-linux-musl image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine strip: aarch64-linux-musl-strip - target: x86_64-unknown-linux-musl image: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine 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: 14 - name: Install Rust uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal override: true - 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.1.0 - 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@v3 with: name: bindings-${{ matrix.target }} 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: 14 - name: Install Rust uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal override: true target: 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: yarn wasm:build-release - name: Optimize wasm run: | ./binaryen-version_111/bin/wasm-opt wasm/lightningcss_node.wasm -Oz -o wasm/lightningcss_node.opt.wasm mv wasm/lightningcss_node.opt.wasm wasm/lightningcss_node.wasm - name: Upload artifacts uses: actions/upload-artifact@v3 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-wasm steps: - uses: actions/checkout@v3 - uses: bahmutov/npm-install@v1.1.0 - name: Download artifacts uses: actions/download-artifact@v3 with: path: 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@v1 - uses: bahmutov/npm-install@v1.1.0 - name: Install Rust uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal override: true - run: cargo login ${CRATES_IO_TOKEN} env: CRATES_IO_TOKEN: ${{ secrets.CRATES_IO_TOKEN }} - run: | cargo install cargo-workspaces cargo workspaces publish --from-git -y