awsbck 0.3.9

Utility to backup a folder to AWS S3, once or periodically.
name: Release builds

on:
  release:
    types: [published]

jobs:
  build-windows:
    runs-on: windows-latest
    name: Release build for Windows
    steps:
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - uses: actions/checkout@v4
      - name: Build release binary
        run: cargo build --release
        env:
          RUSTFLAGS: '-C target-feature=+crt-static'
      - uses: actions/upload-artifact@v4
        with:
          name: awsbck-windows
          path: target/release/awsbck.exe

  build-macos:
    runs-on: macos-latest
    name: Release build for macOS
    steps:
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - uses: actions/checkout@v4
      - name: Build release binary
        run: cargo build --release
        env:
          LZMA_API_STATIC: 'true'
      - uses: actions/upload-artifact@v4
        with:
          name: awsbck-macos
          path: target/release/awsbck

  build-macos-arm:
    runs-on: macos-latest
    name: Release build for macOS aarch64
    steps:
      - uses: maxim-lobanov/setup-xcode@v1
        with:
          xcode-version: '14.2'
      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: aarch64-apple-darwin
      - uses: Swatinem/rust-cache@v2
      - uses: actions/checkout@v4
      - name: Build release binary
        run: |
          SDKROOT=$(xcrun -sdk macosx13.1 --show-sdk-path) \
          MACOS_DEPLOYMENT_TARGET=$(xcrun -sdk macosx13.1 --show-sdk-platform-version) \
          cargo build --release --target=aarch64-apple-darwin
        env:
          LZMA_API_STATIC: 'true'
      - uses: actions/upload-artifact@v4
        with:
          name: awsbck-macos-aarch64
          path: target/aarch64-apple-darwin/release/awsbck

  build-linux:
    runs-on: ubuntu-latest
    name: Release build for linux x86_64
    steps:
      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: x86_64-unknown-linux-musl
      - uses: Swatinem/rust-cache@v2
      - name: Install musl tools
        run: |
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends musl-tools
      - uses: actions/checkout@v4
      - name: Build release binary
        run: cargo build --release --target x86_64-unknown-linux-musl
      - uses: actions/upload-artifact@v4
        with:
          name: awsbck-linux
          path: target/x86_64-unknown-linux-musl/release/awsbck

  build-arm:
    name: Release builds for linux ARM
    runs-on: ubuntu-latest
    strategy:
      matrix:
        include:
          - target: aarch64-unknown-linux-musl
            arch: aarch64
          - target: armv7-unknown-linux-gnueabihf
            arch: armv7
    steps:
      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}
      - uses: Swatinem/rust-cache@v2
      - run: cargo install cross --git https://github.com/cross-rs/cross
      - uses: actions/checkout@v4
      - run: cross build --release --target ${{ matrix.target }}
      - uses: actions/upload-artifact@v4
        with:
          name: awsbck-${{ matrix.arch }}
          path: target/${{ matrix.target }}/release/awsbck

  build-docker:
    needs: [build-linux, build-arm]
    name: Create docker container
    runs-on: ubuntu-latest
    permissions:
      packages: write
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-qemu-action@v3
      - uses: docker/setup-buildx-action@v3
      - uses: actions/download-artifact@v4
        with:
          name: awsbck-linux
          path: linux_amd64/awsbck
      - uses: actions/download-artifact@v4
        with:
          name: awsbck-aarch64
          path: linux_arm64/awsbck
      - uses: actions/download-artifact@v4
        with:
          name: awsbck-armv7
          path: linux_arm/awsbck
      - name: Login to Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Docker metadata for root image
        id: meta-root
        uses: docker/metadata-action@v5
        with:
          images: ghcr.io/${{ github.repository_owner }}/awsbck
          flavor: |
            latest=false
          tags: |
            type=semver,pattern=root-{{version}}
            type=semver,pattern=root-{{major}}.{{minor}}
            type=raw,value=root-latest
      - name: Build and push for root image
        uses: docker/build-push-action@v5
        with:
          push: true
          context: .
          file: Dockerfile.root
          tags: ${{ steps.meta-root.outputs.tags }}
          labels: ${{ steps.meta-root.outputs.labels }}
          platforms: linux/amd64,linux/arm64,linux/arm/v7
      - name: Docker metadata # generates tags (version number and "latest") and labels
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ghcr.io/${{ github.repository_owner }}/awsbck
          tags: |
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          push: true
          context: .
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          platforms: linux/amd64,linux/arm64,linux/arm/v7

  update-release:
    needs: [build-linux, build-arm, build-windows, build-macos, build-macos-arm]
    name: Update GitHub release
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: extract version from Cargo.toml
        uses: SebRollen/toml-action@v1.2.0
        id: version
        with:
          file: Cargo.toml
          field: package.version
      - name: download all artifacts
        uses: actions/download-artifact@v4
        with:
          path: artifacts
      - name: create release directory
        run: mkdir release
      - name: create release files
        run: |
          tar -C ./artifacts/awsbck-linux -czvf ./release/awsbck-v${{ steps.version.outputs.value }}-linux-x64.tar.gz awsbck
          tar -C ./artifacts/awsbck-aarch64 -czvf ./release/awsbck-v${{ steps.version.outputs.value }}-linux-aarch64.tar.gz awsbck
          tar -C ./artifacts/awsbck-armv7 -czvf ./release/awsbck-v${{ steps.version.outputs.value }}-linux-armv7.tar.gz awsbck
          zip -j ./release/awsbck-v${{ steps.version.outputs.value }}-windows.zip ./artifacts/awsbck-windows/awsbck.exe
          zip -j ./release/awsbck-v${{ steps.version.outputs.value }}-macos.zip ./artifacts/awsbck-macos/awsbck
          zip -j ./release/awsbck-v${{ steps.version.outputs.value }}-macos-aarch64.zip ./artifacts/awsbck-macos-aarch64/awsbck
      - name: upload linux-x64 to release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: release/awsbck-v${{ steps.version.outputs.value }}-linux-x64.tar.gz
          tag: ${{ github.ref }}
      - name: upload linux-aarch64 to release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: release/awsbck-v${{ steps.version.outputs.value }}-linux-aarch64.tar.gz
          tag: ${{ github.ref }}
      - name: upload linux-armv7 to release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: release/awsbck-v${{ steps.version.outputs.value }}-linux-armv7.tar.gz
          tag: ${{ github.ref }}
      - name: upload windows to release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: release/awsbck-v${{ steps.version.outputs.value }}-windows.zip
          tag: ${{ github.ref }}
      - name: upload macos to release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: release/awsbck-v${{ steps.version.outputs.value }}-macos.zip
          tag: ${{ github.ref }}
      - name: upload macos-aarch64 to release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: release/awsbck-v${{ steps.version.outputs.value }}-macos-aarch64.zip
          tag: ${{ github.ref }}