row 1.0.0

Row is a command line tool that helps you manage workflows on HPC resources.
Documentation
name: release

permissions:
  contents: write

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

on:
  pull_request:

  push:
    branches:
    - trunk
    tags:
      - "*"

  workflow_dispatch:

defaults:
  run:
    shell: bash

env:
  name: row
  CARGO_TERM_COLOR: always
  CLICOLOR: 1

jobs:
  source:
    name: Build source tarball
    runs-on: ubuntu-24.04

    steps:
    - name: Checkout
      uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
      with:
        path: code

    - name: Determine filename-safe ref from GITHUB_REF_NAME
      run: echo ref="$(echo "${GITHUB_REF_NAME}" | sed  -e 's/\//-/g')" >> "$GITHUB_ENV"

    - name: Copy source
      run: cp -R code "${name}-${ref}"

    - name: Remove .git
      run: rm -rf "${name}-${ref}/.git" && ls -laR "${name}-${ref}"

    - name: Tar/zstd source
      run: tar --zstd -cvf "${name}-${ref}.tar.zst" "${name}-${ref}"

    - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
      with:
        name: source
        path: |
          *.tar.*

  release-notes:
    name: Extract release notes
    runs-on: ubuntu-24.04

    steps:
    - name: Checkout
      uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
      with:
        path: code

    - name: Write release-notes.md
      # 1. Search for the content from the start of the file to the 2nd version heading.
      # 2. Remove the 2nd version heading.
      # 3. Search for the content after the first version heading (removes any description at the
      #    start of the file.
      # 4. Remove the 1st version heading.
      # This leaves the content of the release notes for the current release.
      run: >
        grep -P -m 2 -B 10000 "^## v*\d*\.\d*\.\d*" doc/src/release-notes.md |
        sed '$d' |
        grep -P -A 10000 "^## v*\d*\.\d*\.\d*" |
        sed '1d' |
        tee "${GITHUB_WORKSPACE}/release-notes.md"
      working-directory: code

    - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
      with:
        name: release-notes
        path: |
          release-notes.md

  binary:
    name: Build [${{ matrix.target }}]
    runs-on: ${{ matrix.runner }}
    strategy:
      matrix:
        target:
        - x86_64-unknown-linux-musl
        - aarch64-apple-darwin
        include:
        - target: x86_64-unknown-linux-musl
          runner: ubuntu-22.04
        - target: aarch64-apple-darwin
          runner: macos-14

    steps:
    - name: Checkout
      uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
    - name: Determine filename-safe ref from GITHUB_REF_NAME
      run: echo ref="$(echo "${GITHUB_REF_NAME}" | sed  -e 's/\//-/g')" >> "$GITHUB_ENV"
    - name: Configure Rust
      id: rust_toolchain
      uses: dtolnay/rust-toolchain@0f44b27771c32bda9f458f75a1e241b09791b331
      with:
        toolchain: 1.91.1
        targets: ${{ matrix.target }}
    - name: Cache
      uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # v2.8.1
      with:
        cache-bin: false
        key: ${{ matrix.target }}
    - name: Install musl-tools on Linux
      run: sudo apt-get update --yes && sudo apt-get install --yes musl-tools
      if: contains(matrix.target, 'musl')
    - name: Build
      run: cargo build --locked --bin "${name}" --release --target ${{ matrix.target }}
    - name: Check output
      run: file "target/${{ matrix.target }}/release/${name}"
    - name: Compress
      run: cp "target/${{ matrix.target }}/release/${name}" . && tar --zstd -cvf "${name}-${ref}-${{ matrix.target }}.tar.zst" "${name}"
    - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
      with:
        name: ${{ matrix.target }}
        path: "${{ env.name }}-${{ env.ref }}-${{ matrix.target }}.tar.zst"

  publish_github:
    name: Publish [GitHub]
    needs: [binary, source, release-notes]
    runs-on: ubuntu-24.04

    steps:
    - name: Download artifacts
      uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
      with:
        merge-multiple: true

    - name: List files
      run: ls -lR

    - name: Create release
      uses: softprops/action-gh-release@5be0e66d93ac7ed76da52eca8bb058f665c3a5fe # v2.4.2
      if: startsWith(github.ref, 'refs/tags/')
      with:
        files: |
          *.zst
        body_path: release-notes.md
        make_latest: true
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  publish_cargo:
    name: Publish [Cargo]
    runs-on: ubuntu-24.04
    steps:
    - name: Checkout
      uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
    - name: Configure Rust
      id: rust_toolchain
      uses: dtolnay/rust-toolchain@0f44b27771c32bda9f458f75a1e241b09791b331
      with:
        toolchain: 1.91.1
    - name: Dry run
      run: cargo publish --all-features --dry-run
    - name: Publish to crates.io
      if: startsWith(github.ref, 'refs/tags/')
      run: cargo publish --all-features --token ${{ secrets.CRATES_IO_API_TOKEN }}