termflix 0.6.0

Terminal animation player with 44 procedurally generated animations, multiple render modes, and true color support
name: Release and Deploy

on:
  workflow_dispatch:

permissions:
  contents: write
  id-token: write

env:
  RUST_VERSION: "1.93.1"

jobs:
  # Build Linux ARM64 using cross
  build-linux-arm64:
    name: Build - Linux ARM64
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v5

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_VERSION }}
          targets: aarch64-unknown-linux-gnu

      - name: Install cross
        run: cargo install cross --git https://github.com/cross-rs/cross

      - name: Build with cross
        run: cross build --release --target aarch64-unknown-linux-gnu

      - name: Prepare artifact
        run: |
          mkdir -p release-binaries
          cp target/aarch64-unknown-linux-gnu/release/termflix release-binaries/termflix-linux-aarch64

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: binary-aarch64-unknown-linux-gnu
          path: release-binaries/termflix-linux-aarch64
          retention-days: 1

  # Build Linux x86_64
  build-linux-x86_64:
    name: Build - Linux x86_64
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v5

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_VERSION }}
          targets: x86_64-unknown-linux-gnu

      - name: Build
        run: cargo build --release --target x86_64-unknown-linux-gnu

      - name: Strip binary
        run: strip target/x86_64-unknown-linux-gnu/release/termflix

      - name: Prepare artifact
        run: |
          mkdir -p release-binaries
          cp target/x86_64-unknown-linux-gnu/release/termflix release-binaries/termflix-linux-x86_64

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: binary-x86_64-unknown-linux-gnu
          path: release-binaries/termflix-linux-x86_64
          retention-days: 1

  # Build Windows x86_64
  build-windows-x86_64:
    name: Build - Windows x86_64
    runs-on: windows-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v5

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_VERSION }}
          targets: x86_64-pc-windows-msvc

      - name: Build
        run: cargo build --release --target x86_64-pc-windows-msvc

      - name: Prepare artifact
        shell: bash
        run: |
          mkdir -p release-binaries
          cp target/x86_64-pc-windows-msvc/release/termflix.exe release-binaries/termflix-windows-x86_64.exe

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: binary-x86_64-pc-windows-msvc
          path: release-binaries/termflix-windows-x86_64.exe
          retention-days: 1

  # Build macOS x86_64
  build-macos-x86_64:
    name: Build - macOS x86_64
    runs-on: macos-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v5

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_VERSION }}
          targets: x86_64-apple-darwin

      - name: Build
        run: cargo build --release --target x86_64-apple-darwin

      - name: Prepare artifact
        run: |
          mkdir -p release-binaries
          cp target/x86_64-apple-darwin/release/termflix release-binaries/termflix-macos-x86_64

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: binary-x86_64-apple-darwin
          path: release-binaries/termflix-macos-x86_64
          retention-days: 1

  # Build macOS ARM64
  build-macos-arm64:
    name: Build - macOS ARM64
    runs-on: macos-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v5

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_VERSION }}
          targets: aarch64-apple-darwin

      - name: Build
        run: cargo build --release --target aarch64-apple-darwin

      - name: Prepare artifact
        run: |
          mkdir -p release-binaries
          cp target/aarch64-apple-darwin/release/termflix release-binaries/termflix-macos-aarch64

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: binary-aarch64-apple-darwin
          path: release-binaries/termflix-macos-aarch64
          retention-days: 1

  # Publish to crates.io
  publish-crates:
    name: Publish to crates.io
    runs-on: ubuntu-latest
    timeout-minutes: 15
    needs: [build-linux-arm64, build-linux-x86_64, build-windows-x86_64, build-macos-x86_64, build-macos-arm64]
    steps:
      - uses: actions/checkout@v5

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_VERSION }}

      - name: Get version
        id: version
        run: |
          CARGO_VERSION=$(cargo metadata --format-version 1 --no-deps | jq -r '.packages[0].version')
          echo "version=$CARGO_VERSION" >> $GITHUB_OUTPUT

      - name: Dry run publish
        run: cargo publish --dry-run

      - name: Publish to crates.io
        run: cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }} || echo "Version may already exist, continuing..."
        continue-on-error: true
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

  # Create GitHub Release
  github-release:
    name: Create GitHub Release
    runs-on: ubuntu-latest
    timeout-minutes: 15
    needs: [build-linux-arm64, build-linux-x86_64, build-windows-x86_64, build-macos-x86_64, build-macos-arm64]
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v5

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_VERSION }}

      - name: Get version
        id: get_version
        run: |
          version=$(cargo metadata --format-version 1 --no-deps | jq -r '.packages[0].version')
          echo "version=$version" >> $GITHUB_OUTPUT

      - name: Download binary artifacts
        uses: actions/download-artifact@v4
        with:
          pattern: binary-*
          path: binaries
          merge-multiple: true

      - name: List binaries
        run: ls -lh binaries/

      - name: Create or update GitHub Release
        env:
          GITHUB_TOKEN: ${{ github.token }}
        run: |
          VERSION="v${{ steps.get_version.outputs.version }}"
          if gh release view "$VERSION" --repo '${{ github.repository }}' >/dev/null 2>&1; then
            gh release delete "$VERSION" --repo '${{ github.repository }}' --yes
          fi
          gh release create "$VERSION" \
            --repo '${{ github.repository }}' \
            --generate-notes \
            --latest

      - name: Upload binaries to Release
        env:
          GITHUB_TOKEN: ${{ github.token }}
        run: |
          gh release upload \
            'v${{ steps.get_version.outputs.version }}' binaries/* \
            --repo '${{ github.repository }}' \
            --clobber

      - name: Discord notification
        if: success()
        env:
          DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
        uses: Ilshidur/action-discord@master
        with:
          args: '🎬 termflix v${{ steps.get_version.outputs.version }} released! https://github.com/${{ github.repository }}/releases/tag/v${{ steps.get_version.outputs.version }}'
        continue-on-error: true