serbero 0.1.1

Nostr-native dispute coordination daemon for the Mostro ecosystem
Documentation
name: Release

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

permissions:
  contents: write

jobs:
  build:
    name: Build ${{ matrix.binary_name }}
    runs-on: ${{ matrix.runner }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - runner: ubuntu-latest
            target: x86_64-unknown-linux-musl
            binary_name: serbero-linux-x86_64
            apt_packages: ''
            build_cmd: cargo zigbuild
            strip_cmd: strip
          - runner: ubuntu-latest
            target: aarch64-unknown-linux-musl
            binary_name: serbero-linux-arm64
            apt_packages: binutils-aarch64-linux-gnu
            build_cmd: cargo zigbuild
            strip_cmd: aarch64-linux-gnu-strip
          - runner: macos-latest
            target: x86_64-apple-darwin
            binary_name: serbero-macos-x86_64
            apt_packages: ''
            build_cmd: cargo build
            strip_cmd: strip
          - runner: macos-latest
            target: aarch64-apple-darwin
            binary_name: serbero-macos-arm64
            apt_packages: ''
            build_cmd: cargo build
            strip_cmd: strip
          - runner: windows-latest
            target: x86_64-pc-windows-msvc
            binary_name: serbero-windows-x86_64.exe
            apt_packages: ''
            build_cmd: cargo build
            strip_cmd: ''

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust (stable)
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - name: Install Linux strip toolchain
        if: runner.os == 'Linux' && matrix.apt_packages != ''
        run: |
          sudo apt-get update
          sudo apt-get install -y ${{ matrix.apt_packages }}

      - name: Setup Zig (for cargo-zigbuild)
        if: runner.os == 'Linux'
        uses: mlugg/setup-zig@v1
        with:
          version: 0.13.0

      - name: Install cargo-zigbuild
        if: runner.os == 'Linux'
        uses: taiki-e/install-action@v2
        with:
          tool: cargo-zigbuild

      - name: Cache cargo registry and target/
        uses: Swatinem/rust-cache@v2
        with:
          key: release-${{ matrix.target }}

      - name: Build release binary
        shell: bash
        run: ${{ matrix.build_cmd }} --release --target ${{ matrix.target }}

      - name: Stage binary (Linux/macOS)
        if: runner.os != 'Windows'
        shell: bash
        run: |
          bin="target/${{ matrix.target }}/release/serbero"
          "${{ matrix.strip_cmd }}" "$bin"
          mkdir -p dist
          cp "$bin" "dist/${{ matrix.binary_name }}"

      - name: Stage binary (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          $bin = "target/${{ matrix.target }}/release/serbero.exe"
          New-Item -ItemType Directory -Force -Path dist | Out-Null
          Copy-Item $bin "dist/${{ matrix.binary_name }}"

      - name: Upload binary artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.binary_name }}
          path: dist/${{ matrix.binary_name }}
          if-no-files-found: error

  release:
    name: Publish GitHub Release
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Download all binary artifacts
        uses: actions/download-artifact@v4
        with:
          path: artifacts
          merge-multiple: true

      - name: List downloaded artifacts
        run: ls -la artifacts

      - name: Generate checksums.sha256
        working-directory: artifacts
        run: |
          # Only hash the staged binaries. Restricting the glob to
          # `serbero-*` avoids self-inclusion of the output file and
          # survives any future non-binary artifact that happens to
          # land in this directory.
          sha256sum serbero-* > checksums.sha256
          echo "--- checksums.sha256 ---"
          cat checksums.sha256

      - name: Determine prerelease flag from tag
        id: prerelease
        shell: bash
        run: |
          tag="${GITHUB_REF#refs/tags/}"
          if [[ "$tag" == *-rc* || "$tag" == *-beta* ]]; then
            echo "flag=true" >> "$GITHUB_OUTPUT"
          else
            echo "flag=false" >> "$GITHUB_OUTPUT"
          fi

      - name: Publish release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ github.ref_name }}
          name: Serbero ${{ github.ref_name }}
          body: |
            Pre-built binaries for all platforms. See [README](https://github.com/MostroP2P/serbero#quickstart) for setup instructions.
          draft: false
          prerelease: ${{ steps.prerelease.outputs.flag }}
          files: |
            artifacts/serbero-*
            artifacts/checksums.sha256
          fail_on_unmatched_files: true