Compare commits

...

2 commits

Author SHA1 Message Date
3fcac6818a Merge pull request 'fix(stale-claims): avoid SIGPIPE 141 — pass file path не pipe' (#612) from feat/stale-claims-sigpipe-fix into main
Reviewed-on: #612
2026-05-27 22:06:45 +00:00
lekss361
8c9d1344cc fix(stale-claims): avoid SIGPIPE 141 — pass file path не pipe
Root cause: `cat $ISSUES_TMP | python3 <<EOF ... sys.exit(0)` — Python exits
0 early, cat получает SIGPIPE, set -o pipefail → script exits 141 = failure.

Fix: передача file path через env var вместо stdin pipe. Python читает файл
напрямую. No pipe → no SIGPIPE.

Verified локально на VPS с bot-qa token: exit 0, '[OK] 0 wip issues —
nothing to do'.

Also remove diagnostic steps from workflow (added в PR #611, нужно для
поиска root cause, теперь убираем).

Refs: PR #611 (diagnostic), runs #1514-1520 failures.
2026-05-28 01:05:56 +03:00
2 changed files with 7 additions and 25 deletions

View file

@ -28,18 +28,6 @@ jobs:
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Diagnostic — runner environment
run: |
echo "=== runner environment ==="
echo "shell: $SHELL"
echo "bash: $(bash --version | head -1)"
echo "python3: $(python3 --version 2>&1 || echo 'NOT INSTALLED')"
echo "curl: $(curl --version | head -1)"
echo "mktemp: $(mktemp --version | head -1 2>&1 || echo 'no --version')"
echo "pwd: $(pwd)"
echo "ls scripts/: $(ls scripts/ 2>&1)"
echo "script exists: $(test -f scripts/cleanup-stale-claims.sh && echo yes || echo no)"
- name: Run cleanup script - name: Run cleanup script
env: env:
FORGEJO_TOKEN: ${{ secrets.FORGEJO_BOT_QA_TOKEN }} FORGEJO_TOKEN: ${{ secrets.FORGEJO_BOT_QA_TOKEN }}
@ -47,14 +35,5 @@ jobs:
FORGEJO_REPO: lekss361/gendesign FORGEJO_REPO: lekss361/gendesign
STALE_HOURS: 4 STALE_HOURS: 4
run: | run: |
echo "=== env check ==="
echo "FORGEJO_TOKEN length: ${#FORGEJO_TOKEN}"
echo "FORGEJO_URL: $FORGEJO_URL"
echo "FORGEJO_REPO: $FORGEJO_REPO"
echo "STALE_HOURS: $STALE_HOURS"
echo "=== check token works ==="
curl -sS -H "Authorization: token $FORGEJO_TOKEN" "$FORGEJO_URL/api/v1/user" | head -c 200
echo ""
echo "=== run script with -x trace ==="
chmod +x scripts/cleanup-stale-claims.sh chmod +x scripts/cleanup-stale-claims.sh
bash -x scripts/cleanup-stale-claims.sh ./scripts/cleanup-stale-claims.sh

View file

@ -65,8 +65,10 @@ for PAGE in 1 2 3 4 5 6 7 8 9 10; do
fi fi
done done
# Парсим JSON # Парсим JSON — читаем файл прямо в Python через env var (не через pipe `cat | python3`).
cat "$ISSUES_TMP" | python3 <<'PYEOF' # При pipe + sys.exit(0) после print, cat получает SIGPIPE → script exits 141 под
# set -o pipefail. Передача path через env var не использует pipe → no SIGPIPE.
ISSUES_FILE="$ISSUES_TMP" python3 <<'PYEOF'
import json, os, subprocess, sys, datetime import json, os, subprocess, sys, datetime
cutoff = int(os.environ.get("CUTOFF", "0")) cutoff = int(os.environ.get("CUTOFF", "0"))
@ -75,7 +77,8 @@ if cutoff == 0:
sys.exit(1) sys.exit(1)
# Read pagination output — multiple JSON arrays separated by "---PAGE_END---" # Read pagination output — multiple JSON arrays separated by "---PAGE_END---"
raw = sys.stdin.read() with open(os.environ["ISSUES_FILE"]) as f:
raw = f.read()
pages = [p.strip() for p in raw.split("---PAGE_END---") if p.strip()] pages = [p.strip() for p in raw.split("---PAGE_END---") if p.strip()]
data = [] data = []
for p in pages: for p in pages: