name: Release Oxlint on: workflow_dispatch: push: branches: - main paths: - npm/oxlint/package.json # Please only commit this file, so we don't need to wait for all the other CI jobs to finish. concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: check: name: Check version runs-on: ubuntu-latest outputs: version_changed: ${{ steps.version.outputs.changed }} version: ${{ steps.version.outputs.version }} steps: - uses: taiki-e/checkout-action@v1 - name: Check version changes uses: EndBug/version-check@v2 id: version with: static-checking: localIsNew file-url: https://unpkg.com/oxlint@latest/package.json file-name: npm/oxlint/package.json - name: Print version if: steps.version.outputs.changed == 'true' run: | echo "Version change found! New version: ${{ steps.version.outputs.version }}" build: needs: check if: needs.check.outputs.version_changed == 'true' strategy: matrix: include: - os: windows-latest target: x86_64-pc-windows-msvc code-target: win32-x64 - os: windows-latest target: aarch64-pc-windows-msvc code-target: win32-arm64 - os: ubuntu-latest target: x86_64-unknown-linux-gnu code-target: linux-x64-gnu - os: ubuntu-latest target: aarch64-unknown-linux-gnu code-target: linux-arm64-gnu - os: ubuntu-latest target: x86_64-unknown-linux-musl code-target: linux-x64-musl - os: ubuntu-latest target: aarch64-unknown-linux-musl code-target: linux-arm64-musl - os: macos-latest target: x86_64-apple-darwin code-target: darwin-x64 - os: macos-latest target: aarch64-apple-darwin code-target: darwin-arm64 name: Package ${{ matrix.code-target }} runs-on: ${{ matrix.os }} defaults: run: shell: bash env: OXC_VERSION: ${{ needs.check.outputs.version }} steps: - uses: taiki-e/checkout-action@v1 - name: Install cross uses: taiki-e/install-action@cross - name: Rust Cache uses: Swatinem/rust-cache@v2 with: shared-key: release-${{ matrix.target }} - name: Add Rust Target run: rustup target add ${{ matrix.target }} - name: Build shell: bash run: | # Need to support 16kb-aligned pages for aarch64 systems, # Asahi Linux & Raspberry Pi OS use a 16k page size. # https://github.com/oxc-project/oxc/issues/3783 case ${{ matrix.target }} in aarch64-*) export JEMALLOC_SYS_WITH_LG_PAGE=16 ;; esac; cross build --release --target=${{ matrix.target }} --bin oxlint --features allocator cross build -p oxc_language_server --bin oxc_language_server --release --target=${{ matrix.target }} # The binaries are zipped to fix permission loss https://github.com/actions/upload-artifact#permission-loss - name: Archive Binaries if: runner.os == 'Windows' run: | OXLINT_BIN_NAME=oxlint-${{ matrix.code-target }} mv target/${{ matrix.target }}/release/oxlint.exe $OXLINT_BIN_NAME.exe 7z a $OXLINT_BIN_NAME.zip $OXLINT_BIN_NAME.exe OXLS_BIN_NAME=oxc_language_server-${{ matrix.code-target }} mv target/${{ matrix.target }}/release/oxc_language_server.exe $OXLS_BIN_NAME.exe 7z a $OXLS_BIN_NAME.zip $OXLS_BIN_NAME.exe # The binaries are zipped to fix permission loss https://github.com/actions/upload-artifact#permission-loss - name: Archive Binaries if: runner.os != 'Windows' run: | OXLINT_BIN_NAME=oxlint-${{ matrix.code-target }} mv target/${{ matrix.target }}/release/oxlint $OXLINT_BIN_NAME tar czf $OXLINT_BIN_NAME.tar.gz $OXLINT_BIN_NAME OXLS_BIN_NAME=oxc_language_server-${{ matrix.code-target }} mv target/${{ matrix.target }}/release/oxc_language_server $OXLS_BIN_NAME tar czf $OXLS_BIN_NAME.tar.gz $OXLS_BIN_NAME - name: Upload Binary uses: actions/upload-artifact@v4 with: if-no-files-found: error name: binaries-${{ matrix.code-target }} path: | *.zip *.tar.gz publish: name: Publish needs: [check, build] runs-on: ubuntu-latest permissions: contents: write # for softprops/action-gh-release@v1 id-token: write # for `pnpm publish --provenance` steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # for changelog - uses: Boshen/setup-rust@main with: restore-cache: false tools: cargo-release-oxc - name: Run id: run run: | mkdir -p target cargo release-oxc changelog --release oxlint { echo 'CHANGELOG<> $GITHUB_OUTPUT - uses: actions/download-artifact@v4 with: merge-multiple: true - name: Unzip uses: montudor/action-zip@v1 with: args: unzip -qq *.zip -d . - name: Untar run: ls *.gz | xargs -i tar xf {} - uses: ./.github/actions/pnpm - name: Generate npm packages run: | node npm/oxlint/scripts/generate-packages.mjs cat npm/oxlint/package.json for package in npm/oxlint*; do cat $package/package.json ; echo ; done - name: Publish npm packages as latest env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} # NOTE: The trailing slash on $package/ changes it to publishing the directory run: | for package in npm/oxlint* do pnpm publish $package/ --provenance --access public --no-git-checks echo '----' done - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: body: ${{ steps.run.outputs.CHANGELOG }} draft: false files: oxlint-* name: oxlint v${{ needs.check.outputs.version }} tag_name: oxlint_v${{ needs.check.outputs.version }} fail_on_unmatched_files: true target_commitish: ${{ github.sha }} - name: wait 1 minute for smoke test run: sleep 60s smoke: needs: [check, publish] strategy: matrix: include: - os: windows-latest - os: ubuntu-latest - os: ubuntu-latest container: node:18-alpine # musl - os: macos-latest name: Smoke Test ${{ matrix.os }} ${{ matrix.container }} runs-on: ${{ matrix.os }} container: ${{ matrix.container }} steps: - name: Test run: | touch test.js ldd --version || true npx oxlint@${{ needs.check.outputs.version }} ./test.js eslint-plugin-oxlint: needs: [check, publish] name: Update eslint-plugin-oxlint runs-on: ubuntu-latest steps: - uses: taiki-e/checkout-action@v1 - uses: benc-uk/workflow-dispatch@v1 with: repo: oxc-project/eslint-plugin-oxlint workflow: bump_oxlint.yml token: ${{ secrets.OXC_BOT_PAT }} ref: main inputs: '{ "version": "${{ needs.check.outputs.version }}" }'