just 1.50.0

🤖 Just a command runner
Documentation
name: Release

on:
  push:
    tags:
    - '*'

defaults:
  run:
    shell: bash

env:
  RUSTFLAGS: --deny warnings

jobs:
  prerelease:
    runs-on: ubuntu-latest

    outputs:
      value: ${{ steps.prerelease.outputs.value }}

    steps:
    - name: Prerelease Check
      id: prerelease
      run: |
        if [[ ${{ github.ref_name }} =~ ^[0-9]+[.][0-9]+[.][0-9]+$ ]]; then
            echo value=false >> $GITHUB_OUTPUT
        else
            echo value=true >> $GITHUB_OUTPUT
        fi

  package:
    strategy:
      matrix:
        target:
        - aarch64-apple-darwin
        - aarch64-pc-windows-msvc
        - aarch64-unknown-linux-musl
        - arm-unknown-linux-musleabihf
        - armv7-unknown-linux-musleabihf
        - loongarch64-unknown-linux-musl
        - riscv64gc-unknown-linux-musl
        - x86_64-apple-darwin
        - x86_64-pc-windows-msvc
        - x86_64-unknown-linux-musl
        include:
        - target: aarch64-apple-darwin
          os: macos-latest
          target_rustflags: ''
        - target: aarch64-pc-windows-msvc
          os: windows-latest
          target_rustflags: ''
        - target: aarch64-unknown-linux-musl
          os: ubuntu-latest
          target_rustflags: '--codegen linker=aarch64-linux-gnu-gcc'
        - target: arm-unknown-linux-musleabihf
          os: ubuntu-latest
          target_rustflags: '--codegen linker=arm-linux-gnueabihf-gcc'
        - target: armv7-unknown-linux-musleabihf
          os: ubuntu-latest
          target_rustflags: '--codegen linker=arm-linux-gnueabihf-gcc'
        - target: loongarch64-unknown-linux-musl
          os: ubuntu-latest
          target_rustflags: '--codegen linker=loongarch64-linux-gnu-gcc-14'
        - target: riscv64gc-unknown-linux-musl
          os: ubuntu-latest
          target_rustflags: '--codegen linker=riscv64-linux-gnu-gcc'
        - target: x86_64-apple-darwin
          os: macos-latest
          target_rustflags: ''
        - target: x86_64-pc-windows-msvc
          os: windows-latest
        - target: x86_64-unknown-linux-musl
          os: ubuntu-latest
          target_rustflags: ''

    runs-on: ${{matrix.os}}

    needs:
    - prerelease

    steps:
    - uses: actions/checkout@v6

    - name: Install Target Dependencies
      run: |
        case ${{ matrix.target }} in
          aarch64-pc-windows-msvc)
            rustup target add aarch64-pc-windows-msvc
            ;;
          aarch64-unknown-linux-musl)
            sudo apt-get update
            sudo apt-get install gcc-aarch64-linux-gnu libc6-dev-i386
            ;;
          arm-unknown-linux-musleabihf|armv7-unknown-linux-musleabihf)
            sudo apt-get update
            sudo apt-get install gcc-arm-linux-gnueabihf
            ;;
          loongarch64-unknown-linux-musl)
            sudo apt-get update
            sudo apt-get install gcc-14-loongarch64-linux-gnu
            ;;
          riscv64gc-unknown-linux-musl)
            sudo apt-get update
            sudo apt-get install gcc-riscv64-linux-gnu
            ;;
        esac

    - name: Generate Manpage
      run: |
        set -euxo pipefail
        cargo build
        mkdir -p man
        ./target/debug/just --man > man/just.1

    - name: Package
      id: package
      env:
        TARGET: ${{ matrix.target }}
        REF: ${{ github.ref }}
        OS: ${{ matrix.os }}
        TARGET_RUSTFLAGS: ${{ matrix.target_rustflags }}
      run: ./bin/package
      shell: bash

    - name: Publish Archive
      uses: softprops/action-gh-release@v2.6.1
      if: ${{ startsWith(github.ref, 'refs/tags/') }}
      with:
        draft: false
        files: ${{ steps.package.outputs.archive }}
        prerelease: ${{ needs.prerelease.outputs.value }}
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

    - name: Publish Changelog
      uses: softprops/action-gh-release@v2.6.1
      if: >-
        ${{
          startsWith(github.ref, 'refs/tags/')
          && matrix.target == 'x86_64-unknown-linux-musl'
        }}
      with:
        draft: false
        files: CHANGELOG.md
        prerelease: ${{ needs.prerelease.outputs.value }}
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

    - name: Upload Artifacts
      if: >-
        ${{
          matrix.target == 'aarch64-unknown-linux-musl'
          || matrix.target == 'x86_64-unknown-linux-musl'
        }}
      uses: actions/upload-artifact@v7
      with:
        name: ${{ matrix.target }}
        path: ${{ steps.package.outputs.archive }}

  checksum:
    runs-on: ubuntu-latest

    needs:
    - package
    - prerelease

    steps:
    - name: Download Release Archives
      env:
        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: >-
        gh release download
        --repo casey/just
        --pattern '*'
        --dir release
        ${{ github.ref_name }}

    - name: Create Checksums
      run: |
        cd release
        shasum -a 256 * > ../SHA256SUMS

    - name: Publish Checksums
      uses: softprops/action-gh-release@v2.6.1
      with:
        draft: false
        files: SHA256SUMS
        prerelease: ${{ needs.prerelease.outputs.value }}
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  docker:
    runs-on: ubuntu-latest

    needs:
    - package
    - prerelease

    permissions:
      contents: read
      packages: write

    steps:
    - uses: actions/checkout@v6

    - name: Log in to GitHub Container Registry
      uses: docker/login-action@v4
      with:
        registry: ghcr.io
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v4

    - name: Download x86_64 Artifact
      uses: actions/download-artifact@v8
      with:
        name: x86_64-unknown-linux-musl

    - name: Download aarch64 Artifact
      uses: actions/download-artifact@v8
      with:
        name: aarch64-unknown-linux-musl

    - name: Extract Binaries
      run: |
        mkdir -p amd64 arm64
        tar xzf just-${{ github.ref_name }}-x86_64-unknown-linux-musl.tar.gz --directory amd64 just
        tar xzf just-${{ github.ref_name }}-aarch64-unknown-linux-musl.tar.gz --directory arm64 just

    - name: Determine Tags
      id: tags
      run: |
        VERSION=${{ github.ref_name }}
        TAGS=ghcr.io/casey/just:${VERSION}
        if [[ ${{ needs.prerelease.outputs.value }} == false ]]; then
          TAGS=${TAGS},ghcr.io/casey/just:latest
        fi
        echo tags=${TAGS} >> $GITHUB_OUTPUT

    - name: Build and Push
      uses: docker/build-push-action@v7
      with:
        context: .
        file: etc/Dockerfile
        platforms: linux/amd64,linux/arm64
        push: true
        tags: ${{ steps.tags.outputs.tags }}

  pages:
    runs-on: ubuntu-latest

    needs:
    - prerelease

    permissions:
      contents: write

    steps:
    - uses: actions/checkout@v6

    - uses: Swatinem/rust-cache@v2

    - name: Install `mdbook`
      run: cargo install --locked mdbook@0.4.52

    - name: Install `mdbook-linkcheck`
      run: cargo install --locked mdbook-linkcheck@0.7.7

    - name: Build book
      run: |
        cargo run --package generate-book
        mdbook build book/en
        mdbook build book/zh

    - name: Deploy Pages
      uses: peaceiris/actions-gh-pages@v4
      if: ${{ needs.prerelease.outputs.value == 'false' }}
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_branch: gh-pages
        publish_dir: www