omnyssh 1.0.0

TUI SSH dashboard & server manager
name: Release

# Срабатывает только при пуше тега вида v1.0.0, v1.2.3 и т.д.
on:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'

env:
  CARGO_TERM_COLOR: always
  RUST_BACKTRACE: 1

jobs:
  # ── 1. Проверка качества (те же чеки что и в CI) ───────────────────────────
  ci:
    name: CI checks
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy, rustfmt

      - uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ci-cargo-${{ hashFiles('**/Cargo.lock') }}

      - run: cargo test --verbose
      - run: cargo clippy -- -D warnings
      - run: cargo fmt --check

  # ── 2. Сборка релизных бинарников ──────────────────────────────────────────
  #
  # Четыре платформы собираются параллельно и независимо.
  # Каждый job загружает свой архив как GitHub Actions artifact,
  # который финальный job "publish" потом прикрепляет к Release.
  #
  # Маппинг runner → target:
  #   ubuntu-latest  → x86_64-unknown-linux-gnu  (нативно)
  #   macos-latest   → x86_64-apple-darwin        (ARM runner, кросс-компиляция)
  #   macos-latest   → aarch64-apple-darwin        (Apple Silicon runner, нативно)
  #   windows-latest → x86_64-pc-windows-msvc      (нативно)
  build:
    name: Build · ${{ matrix.target }}
    needs: ci
    runs-on: ${{ matrix.runner }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - target:  x86_64-unknown-linux-gnu
            runner:  ubuntu-latest
            binary:  omny
            archive: omny-x86_64-unknown-linux-gnu.tar.gz

          - target:  x86_64-apple-darwin
            runner:  macos-latest
            binary:  omny
            archive: omny-x86_64-apple-darwin.tar.gz

          - target:  aarch64-apple-darwin
            runner:  macos-latest
            binary:  omny
            archive: omny-aarch64-apple-darwin.tar.gz

          - target:  x86_64-pc-windows-msvc
            runner:  windows-latest
            binary:  omny.exe
            archive: omny-x86_64-pc-windows-msvc.zip

    steps:
      - uses: actions/checkout@v4

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

      - uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ matrix.target }}-cargo-

      # Сборка релизного бинарника (оптимизированный, stripped)
      - name: Build release binary
        run: cargo build --release --locked --target ${{ matrix.target }}

      # Упаковка для Unix (tar.gz)
      - name: Package (Unix)
        if: runner.os != 'Windows'
        run: |
          cd target/${{ matrix.target }}/release
          tar czf "${{ matrix.archive }}" ${{ matrix.binary }}
          mv "${{ matrix.archive }}" "${{ github.workspace }}/"

      # Упаковка для Windows (zip)
      - name: Package (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          cd target/${{ matrix.target }}/release
          Compress-Archive -Path ${{ matrix.binary }} -DestinationPath "${{ github.workspace }}/${{ matrix.archive }}"

      # Загружаем архив как артефакт — publish job его скачает
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.archive }}
          path: ${{ matrix.archive }}
          retention-days: 1
          if-no-files-found: error

  # ── 3. Создание GitHub Release и прикрепление бинарников ───────────────────
  publish:
    name: Publish GitHub Release
    needs: build
    runs-on: ubuntu-latest
    permissions:
      contents: write   # нужно для создания Release

    steps:
      - uses: actions/checkout@v4

      # Скачиваем все 4 архива из предыдущих jobs
      - name: Download all artifacts
        uses: actions/download-artifact@v4
        with:
          path: artifacts
          merge-multiple: true

      # Проверяем что все файлы на месте
      - name: List artifacts
        run: ls -lh artifacts/

      # Извлекаем блок текущего релиза из CHANGELOG.md
      # (от первого "## [X.Y.Z]" до следующего "## [")
      - name: Extract changelog entry
        id: changelog
        run: |
          VERSION="${GITHUB_REF_NAME#v}"   # убираем "v" из тега
          BODY=$(awk "/^## \[${VERSION}\]/{found=1; next} found && /^## \[/{exit} found{print}" CHANGELOG.md)
          # Передаём многострочный текст через GITHUB_OUTPUT
          {
            echo 'body<<CHANGELOG_EOF'
            echo "$BODY"
            echo 'CHANGELOG_EOF'
          } >> "$GITHUB_OUTPUT"

      # Создаём Release и прикрепляем все бинарники одним шагом
      - name: Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          name: OmnySSH ${{ github.ref_name }}
          body: ${{ steps.changelog.outputs.body }}
          draft: false
          prerelease: false
          fail_on_unmatched_files: true
          files: |
            artifacts/omny-x86_64-unknown-linux-gnu.tar.gz
            artifacts/omny-x86_64-apple-darwin.tar.gz
            artifacts/omny-aarch64-apple-darwin.tar.gz
            artifacts/omny-x86_64-pc-windows-msvc.zip