nex-pkg 0.25.9

Package manager UX for nix-darwin + homebrew
Documentation
name: Release

on:
  push:
    tags:
      - 'v*.*.*'

jobs:
  publish-crate:
    env:
      FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
    name: Publish to crates.io
    runs-on: ubuntu-latest
    # Don't block the release if crate is already published
    continue-on-error: true
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9
        with:
          toolchain: stable
      - name: Publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
        run: cargo publish --allow-dirty

  build-binaries:
    env:
      FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
      PKL_VERSION: "0.31.1"
    name: Build ${{ matrix.target }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - target: aarch64-apple-darwin
            os: macos-latest
          - target: x86_64-apple-darwin
            os: macos-latest
          - target: x86_64-unknown-linux-gnu
            os: ubuntu-latest
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9
        with:
          toolchain: stable
          targets: ${{ matrix.target }}

      - name: Install cross-compilation tools
        if: matrix.target == 'aarch64-unknown-linux-gnu'
        run: |
          sudo apt-get update
          sudo apt-get install -y gcc-aarch64-linux-gnu
          echo "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV

      - name: Build
        run: cargo build --release --target ${{ matrix.target }}

      - name: Download private Pkl evaluator
        shell: bash
        run: |
          set -euo pipefail
          case "${{ matrix.target }}" in
            aarch64-apple-darwin) pkl_asset="pkl-macos-aarch64" ;;
            x86_64-apple-darwin) pkl_asset="pkl-macos-amd64" ;;
            x86_64-unknown-linux-gnu) pkl_asset="pkl-linux-amd64" ;;
            aarch64-unknown-linux-gnu) pkl_asset="pkl-linux-aarch64" ;;
            *) echo "unsupported target ${{ matrix.target }}" >&2; exit 1 ;;
          esac
          mkdir -p target/pkl
          curl -fsSL             "https://github.com/apple/pkl/releases/download/${PKL_VERSION}/${pkl_asset}"             -o target/pkl/pkl
          chmod 0755 target/pkl/pkl
          curl -fsSL             "https://raw.githubusercontent.com/apple/pkl/${PKL_VERSION}/LICENSE.txt"             -o target/pkl/LICENSE.txt
          curl -fsSL             "https://raw.githubusercontent.com/apple/pkl/${PKL_VERSION}/THIRD-PARTY-NOTICES.txt"             -o target/pkl/THIRD-PARTY-NOTICES.txt

      - name: Package
        shell: bash
        run: |
          set -euo pipefail
          package="nex-${{ matrix.target }}"
          staging="target/package/${package}"
          mkdir -p "$staging/bin" "$staging/libexec/nex" "$staging/share/doc/nex/third-party/pkl"
          cp "target/${{ matrix.target }}/release/nex" "$staging/bin/nex"
          cp target/pkl/pkl "$staging/libexec/nex/pkl"
          cp target/pkl/LICENSE.txt "$staging/share/doc/nex/third-party/pkl/LICENSE.txt"
          cp target/pkl/THIRD-PARTY-NOTICES.txt "$staging/share/doc/nex/third-party/pkl/THIRD-PARTY-NOTICES.txt"
          cp THIRD-PARTY-NOTICES.md "$staging/share/doc/nex/THIRD-PARTY-NOTICES.md"
          tar -C target/package -czf "nex-${{ matrix.target }}.tar.gz" "$package"

      - name: Upload artifact
        uses: actions/upload-artifact@v7
        with:
          name: nex-${{ matrix.target }}
          path: nex-${{ matrix.target }}.tar.gz

  github-release:
    env:
      FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
    name: GitHub Release
    needs: [publish-crate, build-binaries]
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v6

      - uses: actions/download-artifact@v8
        with:
          merge-multiple: true

      - name: Generate checksums
        run: |
          sha256sum nex-*.tar.gz > checksums.sha256

      - name: Create Release
        env:
          GH_TOKEN: ${{ github.token }}
        run: |
          gh release create ${{ github.ref_name }} \
            --title "${{ github.ref_name }}" \
            --generate-notes \
            nex-*.tar.gz checksums.sha256