moonup 0.4.3

Manage multiple MoonBit installations
Documentation
name: CICD
on:
  workflow_dispatch:
  pull_request:
    paths-ignore:
      - ".vscode"
      - "*.md"
  push:
    branches:
      - main
permissions:
  contents: write
  pull-requests: write
jobs:
  # format and lint check
  ci_style_check:
    name: Code Style Check
    runs-on: ubuntu-latest
    env:
      SCCACHE_GHA_ENABLED: true
      RUSTC_WRAPPER: sccache
    steps:
      - name: Checkout Source
        uses: actions/checkout@v5

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

      - name: Cache Setup
        uses: mozilla-actions/sccache-action@v0.0.9
        with:
            version: "v0.12.0"

      - 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:
          - {
              name: "Windows",
              target: x86_64-pc-windows-msvc,
              os: windows-latest,
              zip: moonup-x86_64-pc-windows-msvc.zip,
            }
          - {
              name: "Linux",
              target: x86_64-unknown-linux-gnu,
              os: ubuntu-latest,
              zip: moonup-x86_64-unknown-linux-gnu.tar.gz,
            }
          - {
              name: "macOS ARM",
              target: aarch64-apple-darwin,
              os: macos-latest,
              zip: moonup-aarch64-apple-darwin.tar.gz,
            }
          - {
              name: "macOS",
              target: x86_64-apple-darwin,
              os: macos-15-intel,
              zip: moonup-x86_64-apple-darwin.tar.gz,
            }

    runs-on: ${{ matrix.os }}
    env:
      SCCACHE_GHA_ENABLED: true
      RUSTC_WRAPPER: sccache
    steps:
      - name: Checkout Source
        uses: actions/checkout@v5

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

      - name: Cache Setup
        uses: mozilla-actions/sccache-action@v0.0.9
        with:
            version: "v0.12.0"

      - name: Tests Check
        if: matrix.os != 'ubuntu-latest' || matrix.os != 'macos-15-intel'
        run: cargo test

      # - name: Tests Check (Live)
      #   if: matrix.os == 'ubuntu-latest'
      #   run: cargo test --features 'test-liveinstall'

      - 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 == 'chawyehsu/moonup' && github.ref == 'refs/heads/main' && github.event_name == 'push'
    steps:
      - uses: google-github-actions/release-please-action@v3
        id: release
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          release-type: rust
          release-as: 0.4.3
    outputs:
      release_created: ${{ steps.release.outputs.release_created }}
      tag_name: ${{ steps.release.outputs.tag_name }}

  # 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:
          - {
              name: "Windows",
              target: x86_64-pc-windows-msvc,
              os: windows-latest,
              zip: moonup-x86_64-pc-windows-msvc.zip,
            }
          - {
              name: "Linux",
              target: x86_64-unknown-linux-gnu,
              os: ubuntu-latest,
              zip: moonup-x86_64-unknown-linux-gnu.tar.gz,
            }
          - {
              name: "macOS ARM",
              target: aarch64-apple-darwin,
              os: macos-latest,
              zip: moonup-aarch64-apple-darwin.tar.gz,
            }
          - {
              name: "macOS",
              target: x86_64-apple-darwin,
              os: macos-15-intel,
              zip: moonup-x86_64-apple-darwin.tar.gz,
            }

    runs-on: ${{ matrix.os }}
    continue-on-error: true
    env:
      SCCACHE_GHA_ENABLED: true
      RUSTC_WRAPPER: sccache
    steps:
      - name: Checkout Source
        uses: actions/checkout@v5

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

      - name: Cache Setup
        uses: mozilla-actions/sccache-action@v0.0.9
        with:
            version: "v0.12.0"

      - 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/moonup
          "${STRIP}" target/${{ matrix.target }}/release/moonup-shim

      - name: Prepare Artifacts [Windows]
        if: matrix.os == 'windows-latest'
        run: |
          cp target/${{ matrix.target }}/release/moonup.exe .
          cp target/${{ matrix.target }}/release/moonup-shim.exe .
          7z a ${{ matrix.zip }} moonup.exe moonup-shim.exe LICENSE README.md

      - name: Prepare Artifacts [Unix]
        if: matrix.os != 'windows-latest'
        run: |
          cp target/${{ matrix.target }}/release/moonup .
          cp target/${{ matrix.target }}/release/moonup-shim .
          tar czvf ${{ matrix.zip }} moonup moonup-shim LICENSE README.md

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

  # 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: Download Artifacts
        uses: actions/download-artifact@v5

      - name: Prepare Checksums
        run: for file in moonup-*/moonup-*; 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=chawyehsu/moonup
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

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

  # Publish to Crates.io
  cd_cargo_publish:
    name: Publish Cargo Package
    runs-on: ubuntu-latest
    needs: [cd_attach_artifacts]
    permissions:
      id-token: write
    steps:
      - name: Checkout Source
        uses: actions/checkout@v5

      - name: Setup crates.io Auth
        id: auth
        uses: rust-lang/crates-io-auth-action@v1

      - name: Cargo Publish
        run: cargo publish --registry crates-io
        env:
          CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}