bagger 0.1.0-beta.11

Bagger is a CLI implementation of Scoop in Rust
name: CICD
on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - main
permissions:
  contents: write
  pull-requests: write
jobs:
  # format and lint check
  ci_style_check:
    name: Code Style Check
    runs-on: windows-latest
    steps:
      - name: Checkout Source
        uses: actions/checkout@v4

      - name: Rust Setup
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: stable
          components: clippy, rustfmt

      - name: Format Check
        run: cargo fmt -- --check

      - name: Clippy Check
        run: cargo clippy

  # tests and build
  ci_test_build:
    name: Test Build
    needs: ci_style_check
    strategy:
      fail-fast: false
      matrix:
        include:
          - target: x86_64-pc-windows-msvc
          - target: i686-pc-windows-msvc
          - target: aarch64-pc-windows-msvc
    runs-on: windows-latest
    steps:
      - name: Checkout Source
        uses: actions/checkout@v4

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

      - name: Tests Check
        run: cargo test --workspace

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

  # Create/Update release PR
  cd_release_please:
    name: Release Please
    needs: ci_test_build
    runs-on: ubuntu-latest
    if: github.repository == 'vincentmathis/bagger' && github.ref == 'refs/heads/main' && github.event_name == 'push'
    outputs:
      release_created: ${{ steps.release.outputs.release_created }}
      tag_name: ${{ steps.release.outputs.tag_name }}
    steps:
      - uses: google-github-actions/release-please-action@v3
        id: release
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          release-type: rust
          # Pinned: release-please cannot increment beta suffixes itself
          # (it would produce 0.1.1-beta.x); bump this with Cargo.toml.
          release-as: 0.1.0-beta.11

  # Build production artifacts
  cd_release_build:
    name: Release Build
    needs: cd_release_please
    if: ${{ needs.cd_release_please.outputs.release_created == 'true' }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - target: x86_64-pc-windows-msvc
            os: windows-latest
            name: bagger-x86_64-pc-windows-msvc.zip

          - target: i686-pc-windows-msvc
            os: windows-latest
            name: bagger-i686-pc-windows-msvc.zip

          - target: aarch64-pc-windows-msvc
            os: windows-latest
            name: bagger-aarch64-pc-windows-msvc.zip

    runs-on: ${{ matrix.os }}
    continue-on-error: true
    steps:
      - name: Checkout Source
        uses: actions/checkout@v4

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

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

      - name: Strip artifacts [Linux]
        if: matrix.os == 'ubuntu-latest'
        shell: bash
        run: |

          case ${{ matrix.target }} in
            aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
          esac

          STRIP="strip"
          case ${{ matrix.target }} in
            aarch64-unknown-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;;
          esac;
          "${STRIP}" target/${{ matrix.target }}/release/bagger

      - name: Prepare artifacts [Windows]
        if: matrix.os == 'windows-latest'
        run: |

          cd target/${{ matrix.target }}/release
          7z a ../../../${{ matrix.name }} bagger.exe
          cd -

      - name: Prepare artifacts [-nix]
        if: matrix.os != 'windows-latest'
        run: |

          cd target/${{ matrix.target }}/release
          tar czvf ../../../${{ matrix.name }} bagger
          cd -

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.name }}
          path: ${{ matrix.name }}

  # Create GitHub release with Rust build targets and release notes
  cd_attach_artifacts:
    name: Release Artifacts
    needs: [cd_release_please, cd_release_build]
    runs-on: ubuntu-latest
    steps:
      - name: Prepare Artifacts
        uses: actions/download-artifact@v4

      - name: Prepare Checksums
        run: for file in bagger-*/bagger-*; do openssl dgst -sha256 -r "$file" | awk '{print $1}' > "${file}.sha256"; done

      - name: Publish Release
        run: gh release edit ${{ needs.cd_release_please.outputs.tag_name }} --draft=false --repo=vincentmathis/bagger
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Attach Artifacts
        uses: softprops/action-gh-release@v2
        with:
          files: bagger-*/bagger-*
          tag_name: ${{ needs.cd_release_please.outputs.tag_name }}