moonup 0.5.0

Manage multiple MoonBit installations
Documentation
name: CICD
on:
  workflow_dispatch:
  pull_request:
    paths-ignore:
      - ".vscode"
      - "*.md"
  push:
    branches:
      - main
permissions: {}
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@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1

      - name: Rust Setup
        run: rustup component add clippy rustfmt

      - name: Cache Setup
        uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # 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 x86_64",
              target: x86_64-unknown-linux-gnu,
              os: ubuntu-latest,
              zip: moonup-x86_64-unknown-linux-gnu.tar.gz,
            }
          - {
              name: "Linux Aarch64",
              target: aarch64-unknown-linux-gnu,
              os: ubuntu-24.04-arm,
              zip: moonup-aarch64-unknown-linux-gnu.tar.gz,
            }
          - {
              name: "macOS ARM",
              target: aarch64-apple-darwin,
              os: macos-latest,
              zip: moonup-aarch64-apple-darwin.tar.gz,
            }

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

      - name: Cache Setup
        uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # 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 }}

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

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

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

  # 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'
    permissions:
      # Required for creating tags and github releases
      contents: write
      # Required for creating/updating release PR
      pull-requests: write
    steps:
      - uses: google-github-actions/release-please-action@db8f2c60ee802b3748b512940dde88eabd7b7e01 # v3.7.13
        id: release
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          release-type: rust
          release-as: 0.5.0
    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 x86_64",
              target: x86_64-unknown-linux-gnu,
              os: ubuntu-latest,
              zip: moonup-x86_64-unknown-linux-gnu.tar.gz,
            }
          - {
              name: "Linux Aarch64",
              target: aarch64-unknown-linux-gnu,
              os: ubuntu-24.04-arm,
              zip: moonup-aarch64-unknown-linux-gnu.tar.gz,
            }
          - {
              name: "macOS ARM",
              target: aarch64-apple-darwin,
              os: macos-latest,
              zip: moonup-aarch64-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@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1

      - name: Cache Setup
        uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # 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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        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
    permissions:
      # Required for attaching artifacts to github releases
      contents: write
    steps:
      - name: Download Artifacts
        uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0

      - 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@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2.6.2
        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:
      # Required for OIDC trusted publish to crates.io
      id-token: write
    steps:
      - name: Checkout Source
        uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1

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

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