Run rolling release CI jobs one at a time
Rolling release / server linux-x64 (push) Failing after 6m5s
Rolling release / server linux-arm64 (push) Has been skipped
Rolling release / server darwin-arm64 (push) Has been skipped
Rolling release / server darwin-x64 (push) Has been skipped
Rolling release / server win32-x64 (push) Has been skipped
Rolling release / client linux-x64 (push) Has been skipped
Rolling release / client linux-arm64 (push) Has been skipped
Rolling release / client darwin-arm64 (push) Has been skipped
Rolling release / client win32-x64 (push) Has been skipped
Rolling release / Publish rolling release (push) Has been skipped
CI / test (push) Has been cancelled

Replace parallel matrix builds with a linear needs: chain so only a single
server or client job occupies a runner at once.
This commit is contained in:
2026-07-11 00:36:57 -04:00
parent 5cc32baf8d
commit 410cd71a0d
+217 -81
View File
@@ -1,8 +1,8 @@
# peardock — rolling release
# - peardock-server: Bare standalone (bare-build --standalone, embeds all modules)
# - peardock-client: full Pear GUI (Electron Forge package / AppImage / zip)
# peardock — rolling release (sequential: one job at a time)
# - peardock-server: Bare standalone
# - peardock-client: full Pear GUI (Electron Forge)
#
# Secret: RELEASE_TOKEN (Gitea PAT with release write)
# Secret: RELEASE_TOKEN
# Optional: GITEA_URL
name: Rolling release
@@ -20,24 +20,14 @@ env:
NODE_VERSION: '22'
RELEASE_TAG: rolling
# Jobs are chained with needs: so only one runs at a time (no matrix fan-out).
jobs:
build-server:
name: server / ${{ matrix.host }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
host: linux-x64
- os: ubuntu-latest
host: linux-arm64
- os: ubuntu-latest
host: darwin-arm64
- os: ubuntu-latest
host: darwin-x64
- os: ubuntu-latest
host: win32-x64
runs-on: ${{ matrix.os }}
# ── Servers (Bare; cross-pack from Ubuntu) ──────────────────────────
server-linux-x64:
name: server linux-x64
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
@@ -46,48 +36,110 @@ jobs:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run make:server:${{ matrix.host }}
- name: Stage server binary
- run: npm run make:server:linux-x64
- name: Stage
run: cp out/server/linux-x64/peardock-server peardock-server-linux-x64
- uses: actions/upload-artifact@v4
with:
name: peardock-server-linux-x64
path: peardock-server-linux-x64
retention-days: 7
server-linux-arm64:
name: server linux-arm64
needs: [server-linux-x64]
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run make:server:linux-arm64
- name: Stage
run: cp out/server/linux-arm64/peardock-server peardock-server-linux-arm64
- uses: actions/upload-artifact@v4
with:
name: peardock-server-linux-arm64
path: peardock-server-linux-arm64
retention-days: 7
server-darwin-arm64:
name: server darwin-arm64
needs: [server-linux-arm64]
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run make:server:darwin-arm64
- name: Stage
run: cp out/server/darwin-arm64/peardock-server peardock-server-darwin-arm64
- uses: actions/upload-artifact@v4
with:
name: peardock-server-darwin-arm64
path: peardock-server-darwin-arm64
retention-days: 7
server-darwin-x64:
name: server darwin-x64
needs: [server-darwin-arm64]
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run make:server:darwin-x64
- name: Stage
run: cp out/server/darwin-x64/peardock-server peardock-server-darwin-x64
- uses: actions/upload-artifact@v4
with:
name: peardock-server-darwin-x64
path: peardock-server-darwin-x64
retention-days: 7
server-win32-x64:
name: server win32-x64
needs: [server-darwin-x64]
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run make:server:win32-x64
- name: Stage
run: |
set -e
dir="out/server/${{ matrix.host }}"
ls -la "$dir"
if [ -f "$dir/peardock-server.exe" ]; then
cp "$dir/peardock-server.exe" "peardock-server-${{ matrix.host }}.exe"
if [ -f out/server/win32-x64/peardock-server.exe ]; then
cp out/server/win32-x64/peardock-server.exe peardock-server-win32-x64.exe
else
cp "$dir/peardock-server" "peardock-server-${{ matrix.host }}"
cp out/server/win32-x64/peardock-server peardock-server-win32-x64
fi
- uses: actions/upload-artifact@v4
with:
name: peardock-server-${{ matrix.host }}
path: peardock-server-${{ matrix.host }}*
if-no-files-found: error
name: peardock-server-win32-x64
path: peardock-server-win32-x64*
retention-days: 7
build-client:
name: client / ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
platform: linux
arch: x64
host: linux-x64
- os: ubuntu-latest
platform: linux
arch: arm64
host: linux-arm64
# macOS / Windows need matching runners for native Electron rebuild
- os: macos-latest
platform: darwin
arch: arm64
host: darwin-arm64
- os: windows-latest
platform: win32
arch: x64
host: win32-x64
runs-on: ${{ matrix.os }}
# ── Clients (full Pear GUI; one OS runner at a time) ────────────────
client-linux-x64:
name: client linux-x64
needs: [server-win32-x64]
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
@@ -96,42 +148,129 @@ jobs:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- name: Electron Forge make (full Pear GUI)
run: npx electron-forge make --platform ${{ matrix.platform }} --arch ${{ matrix.arch }}
- run: npx electron-forge make --platform linux --arch x64
- name: Stage client artifacts
shell: bash
run: |
set -euo pipefail
mkdir -p staged
# Prefer AppImage / zip / dir from forge make + package output
if compgen -G "out/make/**/*.AppImage" > /dev/null; then
cp out/make/**/*.AppImage "staged/peardock-client-${{ matrix.host }}.AppImage" || true
# flatten globs
find out/make -name '*.AppImage' -exec cp {} "staged/peardock-client-${{ matrix.host }}.AppImage" \;
fi
if compgen -G "out/make/**/*.zip" > /dev/null; then
find out/make -name '*.zip' -exec cp {} "staged/peardock-client-${{ matrix.host }}.zip" \;
fi
if compgen -G "out/make/**/*.deb" > /dev/null; then
find out/make -name '*.deb' -exec cp {} "staged/peardock-client-${{ matrix.host }}.deb" \;
fi
# Packaged app directory (always present after package/make)
find out/make -name '*.AppImage' -exec cp {} staged/peardock-client-linux-x64.AppImage \; 2>/dev/null || true
find out/make -name '*.zip' -exec cp {} staged/peardock-client-linux-x64.zip \; 2>/dev/null || true
find out/make -name '*.deb' -exec cp {} staged/peardock-client-linux-x64.deb \; 2>/dev/null || true
dir=$(find out -maxdepth 1 -type d -name 'peardock-*' | head -1)
if [ -n "$dir" ] && [ ! -f "staged/peardock-client-${{ matrix.host }}.zip" ]; then
(cd out && zip -ry "../staged/peardock-client-${{ matrix.host }}.zip" "$(basename "$dir")")
if [ -n "${dir:-}" ] && [ ! -f staged/peardock-client-linux-x64.zip ]; then
(cd out && zip -ry "../staged/peardock-client-linux-x64.zip" "$(basename "$dir")")
fi
ls -la staged/
test -n "$(ls -A staged)"
test -n "$(ls -A staged)"
- uses: actions/upload-artifact@v4
with:
name: peardock-client-${{ matrix.host }}
name: peardock-client-linux-x64
path: staged/*
if-no-files-found: error
retention-days: 7
client-linux-arm64:
name: client linux-arm64
needs: [client-linux-x64]
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npx electron-forge make --platform linux --arch arm64
- name: Stage client artifacts
shell: bash
run: |
set -euo pipefail
mkdir -p staged
find out/make -name '*.AppImage' -exec cp {} staged/peardock-client-linux-arm64.AppImage \; 2>/dev/null || true
find out/make -name '*.zip' -exec cp {} staged/peardock-client-linux-arm64.zip \; 2>/dev/null || true
find out/make -name '*.deb' -exec cp {} staged/peardock-client-linux-arm64.deb \; 2>/dev/null || true
dir=$(find out -maxdepth 1 -type d -name 'peardock-*' | head -1)
if [ -n "${dir:-}" ] && [ ! -f staged/peardock-client-linux-arm64.zip ]; then
(cd out && zip -ry "../staged/peardock-client-linux-arm64.zip" "$(basename "$dir")")
fi
ls -la staged/
test -n "$(ls -A staged)"
- uses: actions/upload-artifact@v4
with:
name: peardock-client-linux-arm64
path: staged/*
retention-days: 7
client-darwin-arm64:
name: client darwin-arm64
needs: [client-linux-arm64]
runs-on: macos-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npx electron-forge make --platform darwin --arch arm64
- name: Stage client artifacts
shell: bash
run: |
set -euo pipefail
mkdir -p staged
find out/make -name '*.zip' -exec cp {} staged/peardock-client-darwin-arm64.zip \; 2>/dev/null || true
find out/make -name '*.dmg' -exec cp {} staged/peardock-client-darwin-arm64.dmg \; 2>/dev/null || true
dir=$(find out -maxdepth 1 -type d -name 'peardock-*' | head -1)
if [ -n "${dir:-}" ] && [ ! -f staged/peardock-client-darwin-arm64.zip ]; then
(cd out && zip -ry "../staged/peardock-client-darwin-arm64.zip" "$(basename "$dir")")
fi
ls -la staged/
test -n "$(ls -A staged)"
- uses: actions/upload-artifact@v4
with:
name: peardock-client-darwin-arm64
path: staged/*
retention-days: 7
client-win32-x64:
name: client win32-x64
needs: [client-darwin-arm64]
runs-on: windows-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- run: npm ci
- run: npx electron-forge make --platform win32 --arch x64
- name: Stage client artifacts
shell: bash
run: |
set -euo pipefail
mkdir -p staged
find out/make -name '*.zip' -exec cp {} staged/peardock-client-win32-x64.zip \; 2>/dev/null || true
find out/make -name '*.msix' -exec cp {} staged/peardock-client-win32-x64.msix \; 2>/dev/null || true
dir=$(find out -maxdepth 1 -type d -name 'peardock-*' | head -1)
if [ -n "${dir:-}" ] && [ ! -f staged/peardock-client-win32-x64.zip ]; then
(cd out && zip -ry "../staged/peardock-client-win32-x64.zip" "$(basename "$dir")")
fi
ls -la staged/
test -n "$(ls -A staged)"
- uses: actions/upload-artifact@v4
with:
name: peardock-client-win32-x64
path: staged/*
retention-days: 7
# ── Publish rolling tag ─────────────────────────────────────────────
publish:
name: Publish rolling release
needs: [build-server, build-client]
needs: [client-win32-x64]
runs-on: ubuntu-latest
if: github.event_name == 'workflow_dispatch' || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master'
steps:
@@ -147,10 +286,8 @@ jobs:
set -euo pipefail
mkdir -p out/server out/client dist/rolling-stage
find artifacts -type f | sort
# Servers
find artifacts -type f -name 'peardock-server-*' | while read -r f; do
base=$(basename "$f")
# peardock-server-linux-x64
host=${base#peardock-server-}
host=${host%.exe}
mkdir -p "out/server/$host"
@@ -160,8 +297,7 @@ jobs:
cp "$f" "out/server/$host/peardock-server"
fi
done
# Clients — copy into dist stage with original names
find artifacts -type f \( -name 'peardock-client-*' -o -name '*.AppImage' -o -name '*.zip' -o -name '*.deb' \) | while read -r f; do
find artifacts -type f \( -name 'peardock-client-*' -o -name '*.AppImage' -o -name '*.zip' -o -name '*.deb' -o -name '*.dmg' -o -name '*.msix' \) | while read -r f; do
cp -a "$f" dist/rolling-stage/
done
find out -type f | sort