rskiller 0.2.1

Find and clean Rust project build artifacts and caches with parallel processing
Documentation
name: Release

on:
  push:
    tags:
      - 'v*'
  workflow_dispatch:
    inputs:
      tag:
        description: 'Tag to release'
        required: true
        default: 'v0.2.0'

env:
  CARGO_TERM_COLOR: always
  RUST_BACKTRACE: 1

jobs:
  create-release:
    name: Create Release
    runs-on: ubuntu-latest
    outputs:
      upload_url: ${{ steps.create_release.outputs.upload_url }}
      release_id: ${{ steps.create_release.outputs.id }}
    steps:
      - name: Get tag
        id: tag
        run: |
          if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
            echo "TAG=${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT
          else
            echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
          fi

      - name: Checkout code
        uses: actions/checkout@v4

      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ steps.tag.outputs.TAG }}
          release_name: rskiller ${{ steps.tag.outputs.TAG }}
          body: |
            ## What's Changed
            
            ### Features
            - Multi-threaded parallel processing for improved performance
            - Enhanced configuration system with TOML/JSON support
            - Comprehensive cleanup and scanning capabilities
            
            ### Installation
            
            #### Quick Install (Unix/Linux/macOS)
            ```bash
            curl -sSL https://raw.githubusercontent.com/NakaSato/rskiller/main/install.sh | bash
            ```
            
            #### Quick Install (Windows PowerShell)
            ```powershell
            iwr -useb https://raw.githubusercontent.com/NakaSato/rskiller/main/install.ps1 | iex
            ```
            
            #### Package Managers
            ```bash
            # Cargo
            cargo install rskiller
            
            # Homebrew (macOS/Linux)
            brew install rskiller
            
            # Chocolatey (Windows)
            choco install rskiller
            
            # Scoop (Windows)
            scoop install rskiller
            ```
            
            #### Manual Installation
            Download the appropriate binary for your platform below, extract it, and place it in your PATH.
            
            ### Checksums
            See assets below for SHA256 checksums.
            
            **Full Changelog**: https://github.com/NakaSato/rskiller/compare/v0.1.0...${{ steps.tag.outputs.TAG }}
          draft: false
          prerelease: false

  build:
    name: Build ${{ matrix.target }}
    runs-on: ${{ matrix.os }}
    needs: create-release
    strategy:
      fail-fast: false
      matrix:
        include:
          # Linux
          - target: x86_64-unknown-linux-gnu
            os: ubuntu-latest
            name: rskiller-linux-x64.tar.gz
            
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-latest
            name: rskiller-linux-arm64.tar.gz
            
          # macOS
          - target: x86_64-apple-darwin
            os: macos-latest
            name: rskiller-macos-x64.tar.gz
            
          - target: aarch64-apple-darwin
            os: macos-latest
            name: rskiller-macos-arm64.tar.gz
            
          # Windows
          - target: x86_64-pc-windows-msvc
            os: windows-latest
            name: rskiller-windows-x64.zip
            ext: .exe

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

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

      - name: Install cross-compilation tools
        if: matrix.target == 'aarch64-unknown-linux-gnu'
        run: |
          sudo apt-get update
          sudo apt-get install -y gcc-aarch64-linux-gnu

      - name: Configure cross-compilation
        if: matrix.target == 'aarch64-unknown-linux-gnu'
        run: |
          echo '[target.aarch64-unknown-linux-gnu]' >> ~/.cargo/config.toml
          echo 'linker = "aarch64-linux-gnu-gcc"' >> ~/.cargo/config.toml

      - name: Cache cargo dependencies
        uses: actions/cache@v3
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            target/
          key: ${{ runner.os }}-cargo-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-${{ matrix.target }}-
            ${{ runner.os }}-cargo-

      - name: Build binary
        run: |
          cargo build --release --target ${{ matrix.target }}

      - name: Prepare binary (Unix)
        if: matrix.os != 'windows-latest'
        run: |
          mkdir -p release
          cp target/${{ matrix.target }}/release/rskiller release/
          cd release
          tar -czf ../${{ matrix.name }} rskiller
          cd ..
          sha256sum ${{ matrix.name }} > ${{ matrix.name }}.sha256

      - name: Prepare binary (Windows)
        if: matrix.os == 'windows-latest'
        run: |
          mkdir release
          cp target/${{ matrix.target }}/release/rskiller.exe release/
          cd release
          7z a ../${{ matrix.name }} rskiller.exe
          cd ..
          certutil -hashfile ${{ matrix.name }} SHA256 > ${{ matrix.name }}.sha256

      - name: Upload Release Asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create-release.outputs.upload_url }}
          asset_path: ./${{ matrix.name }}
          asset_name: ${{ matrix.name }}
          asset_content_type: application/octet-stream

      - name: Upload Checksum
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create-release.outputs.upload_url }}
          asset_path: ./${{ matrix.name }}.sha256
          asset_name: ${{ matrix.name }}.sha256
          asset_content_type: text/plain

  # Create packages for distribution
  create-packages:
    name: Create Packages
    runs-on: ubuntu-latest
    needs: [create-release, build]
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Download Linux x64 binary
        uses: actions/download-artifact@v3
        with:
          name: rskiller-linux-x64
          path: ./binaries/

      - name: Create Debian package
        run: |
          # Create package structure
          mkdir -p debian-pkg/DEBIAN
          mkdir -p debian-pkg/usr/bin
          mkdir -p debian-pkg/usr/share/doc/rskiller
          mkdir -p debian-pkg/usr/share/man/man1

          # Download and extract binary
          wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/rskiller-linux-x64.tar.gz
          tar -xzf rskiller-linux-x64.tar.gz
          cp rskiller debian-pkg/usr/bin/
          chmod +x debian-pkg/usr/bin/rskiller

          # Create control file
          cat > debian-pkg/DEBIAN/control << EOF
          Package: rskiller
          Version: ${{ github.ref_name }}
          Section: utils
          Priority: optional
          Architecture: amd64
          Maintainer: NakaSato <nakasato@example.com>
          Description: Find and clean Rust project build artifacts and caches
           rskiller is a command-line tool for finding and cleaning Rust project
           build artifacts, target directories, and other cache files to free up
           disk space. It features parallel processing, interactive mode, and
           comprehensive configuration options.
          Homepage: https://github.com/NakaSato/rskiller
          EOF

          # Create package
          dpkg-deb --build debian-pkg
          mv debian-pkg.deb rskiller_${{ github.ref_name }}_amd64.deb

      - name: Create RPM spec and package
        run: |
          # This would require more setup for RPM building
          # For now, we'll create a simple tarball that can be converted to RPM
          mkdir -p rpm-pkg/usr/bin
          cp rskiller rpm-pkg/usr/bin/
          cd rpm-pkg
          tar -czf ../rskiller-${{ github.ref_name }}-1.x86_64.tar.gz usr/
          cd ..

      - name: Upload Debian Package
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create-release.outputs.upload_url }}
          asset_path: ./rskiller_${{ github.ref_name }}_amd64.deb
          asset_name: rskiller_${{ github.ref_name }}_amd64.deb
          asset_content_type: application/vnd.debian.binary-package

  # Update Homebrew formula
  update-homebrew:
    name: Update Homebrew Formula
    runs-on: ubuntu-latest
    needs: [create-release, build]
    if: startsWith(github.ref, 'refs/tags/v')
    steps:
      - name: Update Homebrew formula
        uses: mislav/bump-homebrew-formula-action@v2
        with:
          formula-name: rskiller
          homebrew-tap: NakaSato/homebrew-tap
          base-branch: main
          download-url: https://github.com/NakaSato/rskiller/releases/download/${{ github.ref_name }}/rskiller-macos-x64.tar.gz
          commit-message: |
            rskiller ${{ github.ref_name }}

            Created by https://github.com/mislav/bump-homebrew-formula-action
        env:
          COMMITTER_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}

  # Publish to crates.io
  publish-crate:
    name: Publish to crates.io
    runs-on: ubuntu-latest
    needs: create-release
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Publish to crates.io
        run: cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
        continue-on-error: true  # Don't fail if already published