dufs 0.45.0

Dufs is a distinctive utility file server
name: Release

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

jobs:
  release:
    name: Publish to Github Releases
    permissions:
      contents: write
    outputs:
      rc: ${{ steps.check-tag.outputs.rc }}

    strategy:
      matrix:
        include:
        - target: aarch64-unknown-linux-musl
          os: ubuntu-latest
          use-cross: true
          cargo-flags: ""
        - target: aarch64-apple-darwin
          os: macos-latest
          use-cross: true
          cargo-flags: ""
        - target: aarch64-pc-windows-msvc
          os: windows-latest
          use-cross: true
          cargo-flags: ""
        - target: x86_64-apple-darwin
          os: macos-latest
          cargo-flags: ""
        - target: x86_64-pc-windows-msvc
          os: windows-latest
          cargo-flags: ""
        - target: x86_64-unknown-linux-musl
          os: ubuntu-latest
          use-cross: true
          cargo-flags: ""
        - target: i686-unknown-linux-musl
          os: ubuntu-latest
          use-cross: true
          cargo-flags: ""
        - target: i686-pc-windows-msvc
          os: windows-latest
          use-cross: true
          cargo-flags: ""
        - target: armv7-unknown-linux-musleabihf
          os: ubuntu-latest
          use-cross: true
          cargo-flags: ""
        - target: arm-unknown-linux-musleabihf
          os: ubuntu-latest
          use-cross: true
          cargo-flags: ""

    runs-on: ${{matrix.os}}
    env:
      BUILD_CMD: cargo

    steps:
    - uses: actions/checkout@v4

    - name: Check Tag
      id: check-tag
      shell: bash
      run: |
        ver=${GITHUB_REF##*/}
        echo "version=$ver" >> $GITHUB_OUTPUT
        if [[ "$ver" =~ [0-9]+.[0-9]+.[0-9]+$ ]]; then
          echo "rc=false" >> $GITHUB_OUTPUT
        else
          echo "rc=true" >> $GITHUB_OUTPUT
        fi


    - name: Install Rust Toolchain Components
      uses: dtolnay/rust-toolchain@stable
      with:
        targets: ${{ matrix.target }}

    - name: Install cross
      if: matrix.use-cross
      uses: taiki-e/install-action@v2
      with:
        tool: cross

    - name: Overwrite build command env variable
      if: matrix.use-cross
      shell: bash
      run: echo "BUILD_CMD=cross" >> $GITHUB_ENV
  
    - name: Show Version Information (Rust, cargo, GCC)
      shell: bash
      run: |
        gcc --version || true
        rustup -V
        rustup toolchain list
        rustup default
        cargo -V
        rustc -V
      
    - name: Build
      shell: bash
      run: $BUILD_CMD build --locked --release --target=${{ matrix.target }} ${{ matrix.cargo-flags }}

    - name: Build Archive
      shell: bash
      id: package
      env:
        target: ${{ matrix.target }}
        version:  ${{ steps.check-tag.outputs.version }}
      run: |
        set -euxo pipefail

        bin=${GITHUB_REPOSITORY##*/}
        dist_dir=`pwd`/dist
        name=$bin-$version-$target
        executable=target/$target/release/$bin

        if [[ "$RUNNER_OS" == "Windows" ]]; then
          executable=$executable.exe
        fi

        mkdir $dist_dir
        cp $executable $dist_dir
        cd $dist_dir

        if [[ "$RUNNER_OS" == "Windows" ]]; then
            archive=$dist_dir/$name.zip
            7z a $archive *
            echo "archive=dist/$name.zip" >> $GITHUB_OUTPUT
        else
            archive=$dist_dir/$name.tar.gz
            tar -czf $archive *
            echo "archive=dist/$name.tar.gz" >> $GITHUB_OUTPUT
        fi

    - name: Publish Archive
      uses: softprops/action-gh-release@v2
      if: ${{ startsWith(github.ref, 'refs/tags/') }}
      with:
        draft: false
        files: ${{ steps.package.outputs.archive }}
        prerelease: ${{ steps.check-tag.outputs.rc == 'true' }}

  docker:
    name: Publish to Docker Hub
    if: startsWith(github.ref, 'refs/tags/')
    runs-on: ubuntu-latest
    needs: release
    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Login to DockerHub
        uses: docker/login-action@v3
        with:
          username: ${{ github.repository_owner	}}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          file: Dockerfile-release
          build-args: |
            REPO=${{ github.repository }}
            VER=${{ github.ref_name }}
          platforms: |
            linux/amd64
            linux/arm64
            linux/386
            linux/arm/v7
          push: ${{ needs.release.outputs.rc == 'false' }}
          tags: ${{ github.repository }}:latest, ${{ github.repository }}:${{ github.ref_name }}

  publish-crate:
    name: Publish to crates.io
    if: ${{ needs.release.outputs.rc == 'false' }}
    runs-on: ubuntu-latest
    needs: release
    steps:
      - uses: actions/checkout@v4

      - uses: dtolnay/rust-toolchain@stable

      - name: Publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_API_TOKEN }}
        run: cargo publish