bitsrun 0.5.0

A headless login and logout CLI for 10.0.0.55 at BIT
name: Release

on:
  workflow_dispatch:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'

permissions:
  actions: read
  contents: write

jobs:
  build:
    name: Release for ${{ matrix.target }}
    runs-on: ${{ matrix.os }}

    # Prevent job from running on forks
    if: ${{ !github.event.repository.fork }}

    strategy:
      fail-fast: false
      matrix:
        target:
          - x86_64-unknown-linux-gnu
          - x86_64-unknown-linux-musl
          - aarch64-unknown-linux-gnu
          - aarch64-unknown-linux-musl
          - x86_64-pc-windows-msvc
          - i686-pc-windows-msvc
          - x86_64-apple-darwin
          - aarch64-apple-darwin

        include:
          - target: x86_64-unknown-linux-gnu
            os: ubuntu-22.04
            target-apt-arch: amd64
          - target: x86_64-unknown-linux-musl
            os: ubuntu-22.04
            target-apt-arch: amd64
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-22.04
            target-apt-arch: arm64
          - target: aarch64-unknown-linux-musl
            os: ubuntu-22.04
            target-apt-arch: arm64
          - target: x86_64-pc-windows-msvc
            os: windows-latest
          - target: i686-pc-windows-msvc
            os: windows-latest
          - target: x86_64-apple-darwin
            os: macos-latest
          - target: aarch64-apple-darwin
            os: macos-latest

    env:
      BIN_NAME: bitsrun
      CARGO_BUILD_TARGET: ${{ matrix.target }}
      ARCHIVE_NAME: bitsrun-${{ matrix.target }}

    steps:
      - uses: actions/checkout@master

      - name: Get version from cargo metadata on Linux
        if: startsWith(matrix.os, 'ubuntu')
        id: get_version
        run: echo "version=$(cargo metadata --format-version 1 --no-deps | jq -r '.packages[] | select(.name == "bitsrun").version')" >> "$GITHUB_OUTPUT"

      - name: Set up Ubuntu multiarch
        if: startsWith(matrix.os, 'ubuntu') && matrix.target-apt-arch != 'amd64'
        run: |
          readonly DISTRO_CODENAME=jammy
          sudo dpkg --add-architecture "${{ matrix.target-apt-arch }}"
          sudo sed -i "s/^deb http/deb [arch=$(dpkg-architecture -q DEB_HOST_ARCH)] http/" /etc/apt/sources.list
          sudo sed -i "s/^deb mirror/deb [arch=$(dpkg-architecture -q DEB_HOST_ARCH)] mirror/" /etc/apt/sources.list
          for suite in '' '-updates' '-backports' '-security'; do
            echo "deb [arch=${{ matrix.target-apt-arch }}] http://ports.ubuntu.com/ $DISTRO_CODENAME$suite main universe multiverse" | \
            sudo tee -a /etc/apt/sources.list >/dev/null
          done

      - name: Install musl development files
        if: endsWith(matrix.target, '-musl')
        run: |
          sudo apt-get -yq update
          sudo apt-get -yq install musl-tools musl-dev:${{ matrix.target-apt-arch }}

      - name: Install QEMU and AArch64 cross compiler
        if: startsWith(matrix.target, 'aarch64-unknown-linux')
        run: |
          sudo apt-get -yq update
          # libc6 must be present to run executables dynamically linked
          # against glibc for the target architecture
          sudo apt-get -yq install qemu-user crossbuild-essential-arm64 libc6:arm64

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          target: ${{ env.CARGO_BUILD_TARGET }}

      - name: Build binaries
        run: cargo build --release --target=${{ env.CARGO_BUILD_TARGET }}

      - name: Package binary archives (for Windows)
        if: endsWith(env.CARGO_BUILD_TARGET, '-windows-msvc')
        run: |
          New-Item -ItemType Directory -Force -Path ${{ env.ARCHIVE_NAME }}
          Copy-Item -Path "target/${{ env.CARGO_BUILD_TARGET }}/release/${{ env.BIN_NAME }}.exe" -Destination "${{ env.ARCHIVE_NAME }}/"
          Compress-Archive -Path "${{ env.ARCHIVE_NAME }}/*" -DestinationPath "${{ env.ARCHIVE_NAME }}.zip"

      - name: Package binary archives (for Linux and macOS)
        if: endsWith(env.CARGO_BUILD_TARGET, '-windows-msvc') == false
        run: |
          mkdir "${{ env.ARCHIVE_NAME }}"
          cp target/${{ env.CARGO_BUILD_TARGET }}/release/${{ env.BIN_NAME }} "${{ env.ARCHIVE_NAME }}"
          chmod ugo+x "${{ env.ARCHIVE_NAME }}/${{ env.BIN_NAME }}"
          tar -vczf "${{ env.ARCHIVE_NAME }}.tar.gz" "${{ env.ARCHIVE_NAME }}"/*

      - name: Build and package deb (amd64)
        if: startsWith(env.CARGO_BUILD_TARGET, 'x86_64-unknown-linux')
        run: |
          cargo install cargo-deb
          cargo deb --no-build --target ${{ env.CARGO_BUILD_TARGET }}

      - name: Upload binary for release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: ${{ env.ARCHIVE_NAME }}${{ endsWith(env.CARGO_BUILD_TARGET, '-windows-msvc') && '.zip' || '.tar.gz'}}
          asset_name: ${{env.ARCHIVE_NAME}}-${{ github.ref_name }}${{ endsWith(env.CARGO_BUILD_TARGET, '-windows-msvc') && '.zip' || '.tar.gz'}}
          tag: ${{ github.ref }}

      - name: Upload deb for release
        if: startsWith(env.CARGO_BUILD_TARGET, 'x86_64-unknown-linux')
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: target/${{ env.CARGO_BUILD_TARGET }}/debian/${{ env.BIN_NAME }}_${{ steps.get_version.outputs.version }}-1_${{ matrix.target-apt-arch }}.deb
          asset_name: ${{ env.ARCHIVE_NAME }}_${{ steps.get_version.outputs.version }}-1_${{ matrix.target-apt-arch }}.deb
          tag: ${{ github.ref }}