From 6f35ab7b8b9a75dfb59bfb7d286324f0299c0f4f Mon Sep 17 00:00:00 2001 From: arabian Date: Wed, 28 Jan 2026 21:20:56 +0300 Subject: [PATCH] update github workflows --- .github/workflows/git-archive.yml | 84 +++++++++++++++++++++++++++ .github/workflows/git-deb.yml | 53 +++++++++++++++++ .github/workflows/release-archive.yml | 8 --- 3 files changed, 137 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/git-archive.yml create mode 100644 .github/workflows/git-deb.yml diff --git a/.github/workflows/git-archive.yml b/.github/workflows/git-archive.yml new file mode 100644 index 0000000..a1a047e --- /dev/null +++ b/.github/workflows/git-archive.yml @@ -0,0 +1,84 @@ +name: Git archive + +permissions: + contents: write + packages: write + +on: + push: + branches: [main, master] + workflow_dispatch: + +jobs: + build-and-upload: + runs-on: ubuntu-latest + + steps: + - name: Install apt deps (jq/zip + dev-libs) + run: | + sudo apt-get update + sudo apt-get install -y \ + zip jq \ + libpipewire-0.3-dev \ + libclang-dev \ + libasound2-dev + + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Rust toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Extract all binary names + id: cargo-meta + run: | + set -euo pipefail + BIN_NAMES=$(cargo metadata --no-deps --format-version 1 \ + | jq -r '.packages[0].targets[] | select(.kind[] | contains("bin")) | .name') + # сохраним построчно в выход + echo "bin_names<> $GITHUB_OUTPUT + echo "$BIN_NAMES" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Build all release binaries + run: cargo build --release --locked + + - name: Package all binaries into one archive + shell: bash + run: | + set -euo pipefail + COMMIT_SHA="${{ github.sha }}" + ARCHIVE_NAME="pwsp-${COMMIT_SHA}-linux-x64.zip" + echo "Creating archive: $ARCHIVE_NAME" + + FILES=() + while IFS= read -r BIN; do + [ -z "$BIN" ] && continue + FILES+=("target/release/$BIN") + done <<< "${{ steps.cargo-meta.outputs.bin_names }}" + + if [ "${#FILES[@]}" -eq 0 ]; then + echo "Error: no binaries were discovered via cargo metadata." >&2 + exit 1 + fi + + for f in "${FILES[@]}"; do + if [ ! -f "$f" ]; then + echo "Error: expected binary not found: $f" >&2 + exit 1 + fi + echo "Will add: $f" + done + + zip -j "$ARCHIVE_NAME" "${FILES[@]}" + + - name: Upload archive as artifact + uses: actions/upload-artifact@v4 + with: + name: archive + path: pwsp-*.zip + retention-days: 7 diff --git a/.github/workflows/git-deb.yml b/.github/workflows/git-deb.yml new file mode 100644 index 0000000..b94b2ca --- /dev/null +++ b/.github/workflows/git-deb.yml @@ -0,0 +1,53 @@ +name: Git deb + +permissions: + contents: write + packages: write + +on: + push: + branches: [main, master] + workflow_dispatch: + +jobs: + build-and-upload: + runs-on: ubuntu-latest + + steps: + - name: Install apt deps (jq/zip + dev-libs) + run: | + sudo apt-get update + sudo apt-get install -y \ + zip jq \ + libpipewire-0.3-dev \ + libclang-dev \ + libasound2-dev + + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Rust toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Build all release binaries + run: cargo build --release --locked + + - name: Install cargo-deb and create .deb + shell: bash + run: | + set -euo pipefail + cargo install --locked cargo-deb + export PATH="$HOME/.cargo/bin:$PATH" + + cargo-deb + + - name: Upload .deb(s) as artifacts + uses: actions/upload-artifact@v4 + with: + name: deb-packages + path: target/debian/*.deb + retention-days: 7 diff --git a/.github/workflows/release-archive.yml b/.github/workflows/release-archive.yml index 00a8f6a..4ff68fd 100644 --- a/.github/workflows/release-archive.yml +++ b/.github/workflows/release-archive.yml @@ -32,7 +32,6 @@ jobs: run: | set -euo pipefail - # приоритет 1: входной параметр workflow_dispatch INPUT_TAG="${{ github.event.inputs.tag || '' }}" if [ -n "$INPUT_TAG" ]; then echo "Using input tag: $INPUT_TAG" @@ -40,7 +39,6 @@ jobs: exit 0 fi - # приоритет 2: если запущено событием release EVENT_TAG="${{ github.event.release.tag_name || '' }}" if [ -n "$EVENT_TAG" ]; then echo "Using event tag: $EVENT_TAG" @@ -48,14 +46,12 @@ jobs: exit 0 fi - # приоритет 3: если GITHUB_REF — refs/tags/... if [[ "${GITHUB_REF:-}" =~ ^refs/tags/(.+)$ ]]; then echo "Using GITHUB_REF tag: ${BASH_REMATCH[1]}" echo "tag=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT exit 0 fi - # приоритет 4: пробуем получить последний релиз через API echo "No tag in input/event/GITHUB_REF — querying latest release via API..." LATEST_JSON=$(curl -sSf -H "Authorization: Bearer $GITHUB_TOKEN" -H "Accept: application/vnd.github+json" "https://api.github.com/repos/${{ github.repository }}/releases/latest" || true) TAG_NAME=$(echo "$LATEST_JSON" | jq -r '.tag_name // empty') @@ -91,7 +87,6 @@ jobs: set -euo pipefail BIN_NAMES=$(cargo metadata --no-deps --format-version 1 \ | jq -r '.packages[0].targets[] | select(.kind[] | contains("bin")) | .name') - # сохраним построчно в выход echo "bin_names<> $GITHUB_OUTPUT echo "$BIN_NAMES" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT @@ -107,7 +102,6 @@ jobs: ARCHIVE_NAME="pwsp-${TAG}-linux-x64.zip" echo "Creating archive: $ARCHIVE_NAME" - # читаем построчно список бинарников и формируем массив файлов FILES=() while IFS= read -r BIN; do [ -z "$BIN" ] && continue @@ -119,7 +113,6 @@ jobs: exit 1 fi - # проверим, что все бинарники действительно есть for f in "${FILES[@]}"; do if [ ! -f "$f" ]; then echo "Error: expected binary not found: $f" >&2 @@ -128,7 +121,6 @@ jobs: echo "Will add: $f" done - # создаём архив с бинарниками внутри как просто pwsp-gui, pwsp-daemon, pwsp-cli zip -j "$ARCHIVE_NAME" "${FILES[@]}" - name: Upload release archive