commitbot 0.6.4

A CLI assistant that generates commit and PR messages from your diffs using LLMs.
Documentation
name: Release Assets

run-name: Release Assets (${{ inputs.tag }})

on:
  workflow_dispatch:
    inputs:
      tag:
        description: "Existing release tag to build and upload assets for"
        required: true
        type: string
      source_run_id:
        description: "Optional parent release workflow run id"
        required: false
        type: string
      source_run_url:
        description: "Optional parent release workflow run URL"
        required: false
        type: string

permissions:
  contents: write

env:
  CARGO_TERM_COLOR: always

jobs:
  build-release-assets:
    name: ${{ matrix.name }}
    runs-on: ${{ matrix.runner }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - name: Linux arm64
            runner: ubuntu-24.04-arm
            target: aarch64-unknown-linux-gnu
            archive_ext: tar.gz
            binary_name: commitbot
            install_cmd: ""
            linker: ""
          - name: Linux x86_64
            runner: ubuntu-24.04
            target: x86_64-unknown-linux-gnu
            archive_ext: tar.gz
            binary_name: commitbot
            install_cmd: ""
            linker: ""
          - name: Amazon Linux / CentOS / RHEL arm64
            runner: ubuntu-24.04-arm
            target: aarch64-unknown-linux-musl
            archive_ext: tar.gz
            binary_name: commitbot
            install_cmd: sudo apt-get update && sudo apt-get install -y musl-tools
            linker: musl-gcc
          - name: Amazon Linux / CentOS / RHEL x86_64
            runner: ubuntu-24.04
            target: x86_64-unknown-linux-musl
            archive_ext: tar.gz
            binary_name: commitbot
            install_cmd: sudo apt-get update && sudo apt-get install -y musl-tools
            linker: musl-gcc
          - name: Windows x86_64
            runner: ubuntu-24.04
            target: x86_64-pc-windows-gnu
            archive_ext: zip
            binary_name: commitbot.exe
            install_cmd: sudo apt-get update && sudo apt-get install -y mingw-w64
            linker: ""

    steps:
      - name: Resolve release tag
        id: meta
        shell: bash
        run: |
          set -euo pipefail

          if [ -n "${{ inputs.tag || '' }}" ]; then
            echo "tag=${{ inputs.tag }}" >> "$GITHUB_OUTPUT"
          else
            echo "No release tag was provided." >&2
            exit 1
          fi

      - name: Check out tagged source
        uses: actions/checkout@v7
        with:
          ref: ${{ steps.meta.outputs.tag }}

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

      - name: Install target-specific build tooling
        if: matrix.install_cmd != ''
        shell: bash
        run: ${{ matrix.install_cmd }}

      - name: Run tests
        if: matrix.target == 'x86_64-unknown-linux-gnu'
        run: cargo test --locked --all-features

      - name: Build release binary
        shell: bash
        env:
          CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER: ${{ matrix.target == 'aarch64-unknown-linux-musl' && matrix.linker || '' }}
          CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER: ${{ matrix.target == 'x86_64-unknown-linux-musl' && matrix.linker || '' }}
        run: cargo build --locked --release --target ${{ matrix.target }}

      - name: Package tar.gz archive
        if: matrix.archive_ext == 'tar.gz'
        shell: bash
        run: |
          set -euo pipefail
          asset="commitbot-${{ steps.meta.outputs.tag }}-${{ matrix.target }}.tar.gz"
          tar -C "target/${{ matrix.target }}/release" -czf "$asset" "${{ matrix.binary_name }}"
          echo "ASSET_PATH=$asset" >> "$GITHUB_ENV"

      - name: Package zip archive
        if: matrix.archive_ext == 'zip'
        shell: bash
        run: |
          set -euo pipefail
          asset="commitbot-${{ steps.meta.outputs.tag }}-${{ matrix.target }}.zip"
          cd "target/${{ matrix.target }}/release"
          zip "../../../${asset}" "${{ matrix.binary_name }}"
          cd -
          echo "ASSET_PATH=$asset" >> "$GITHUB_ENV"

      - name: Upload asset to GitHub release
        env:
          GH_TOKEN: ${{ github.token }}
        run: gh release upload "${{ steps.meta.outputs.tag }}" "$ASSET_PATH" --clobber

      - name: Add run summary
        shell: bash
        run: |
          {
            echo "## Release Assets"
            echo
            echo "- Tag: \`${{ steps.meta.outputs.tag }}\`"
            echo "- Target: \`${{ matrix.target }}\`"
            if [[ -n "${{ inputs.source_run_url }}" ]]; then
              echo "- Triggered by: ${{ inputs.source_run_url }}"
            fi
          } >> "$GITHUB_STEP_SUMMARY"

  publish-release:
    name: Publish release
    needs: build-release-assets
    runs-on: ubuntu-24.04
    steps:
      - name: Check out source
        uses: actions/checkout@v7
        with:
          ref: ${{ inputs.tag }}

      - name: Publish release and trigger Homebrew tap update
        env:
          GH_TOKEN: ${{ github.token }}
          HOMEBREW_TAP_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
        shell: bash
        run: bash devops/publish-if-complete.sh "${{ inputs.tag }}"