diff --git a/.gitea/workflows/anno-apply-pr.yml b/.gitea/workflows/anno-apply-pr.yml index 8e9af64..c72fec8 100644 --- a/.gitea/workflows/anno-apply-pr.yml +++ b/.gitea/workflows/anno-apply-pr.yml @@ -44,8 +44,8 @@ jobs: import fs from "node:fs"; const ev = JSON.parse(fs.readFileSync(process.env.EVENT_JSON, "utf8")); - const repoObj = ev?.repository || {}; + const cloneUrl = repoObj?.clone_url || (repoObj?.html_url ? (repoObj.html_url.replace(/\/$/,"") + ".git") : ""); @@ -112,7 +112,7 @@ jobs: source /tmp/anno.env if [[ "$LABEL_NAME" != "state/approved" && "$LABEL_NAME" != "workflow_dispatch" ]]; then echo "ℹ️ label=$LABEL_NAME => skip" - echo 'SKIP=1' >> /tmp/anno.env + echo "SKIP=1" >> /tmp/anno.env exit 0 fi echo "✅ proceed (issue=$ISSUE_NUMBER)" @@ -128,6 +128,7 @@ jobs: git remote add origin "$CLONE_URL" git fetch --depth 1 origin "$DEFAULT_BRANCH" git -c advice.detachedHead=false checkout -q FETCH_HEAD + git log -1 --oneline - name: Install deps run: | @@ -135,23 +136,35 @@ jobs: source /tmp/anno.env [[ "${SKIP:-0}" != "1" ]] || { echo "ℹ️ skipped"; exit 0; } npm ci - - test -f scripts/apply-annotation-ticket.mjs || { echo "❌ missing scripts/apply-annotation-ticket.mjs on main"; exit 1; } + + - name: Check apply script exists + run: | + set -euo pipefail + source /tmp/anno.env + [[ "${SKIP:-0}" != "1" ]] || { echo "ℹ️ skipped"; exit 0; } + test -f scripts/apply-annotation-ticket.mjs || { + echo "❌ missing scripts/apply-annotation-ticket.mjs on $DEFAULT_BRANCH" + ls -la scripts | sed -n '1,200p' || true + exit 1 + } - name: Build dist (needed for --verify) run: | set -euo pipefail - # génère dist + para-index.json (via postbuild) + source /tmp/anno.env + [[ "${SKIP:-0}" != "1" ]] || { echo "ℹ️ skipped"; exit 0; } + npm run build:clean test -f dist/para-index.json || { echo "❌ missing dist/para-index.json after build" - ls -la dist | sed -n '1,160p' + ls -la dist | sed -n '1,200p' || true exit 1 } echo "✅ dist/para-index.json present" - + - name: Apply ticket on bot branch (strict+verify, commit) + continue-on-error: true env: FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }} BOT_GIT_NAME: ${{ secrets.BOT_GIT_NAME }} @@ -160,6 +173,7 @@ jobs: set -euo pipefail source /tmp/anno.env [[ "${SKIP:-0}" != "1" ]] || { echo "ℹ️ skipped"; exit 0; } + test -n "${FORGE_TOKEN:-}" || { echo "❌ Missing secret FORGE_TOKEN"; exit 1; } git config user.name "${BOT_GIT_NAME:-archicratie-bot}" @@ -181,12 +195,16 @@ jobs: RC=$? set -e - tail -n 160 "$LOG" || true + echo "APPLY_RC=$RC" >> /tmp/anno.env + + echo "== apply log (tail) ==" + tail -n 180 "$LOG" || true END_SHA="$(git rev-parse HEAD)" + if [[ "$RC" -ne 0 ]]; then - echo "APPLY_RC=$RC" >> /tmp/anno.env - exit "$RC" + echo "NOOP=0" >> /tmp/anno.env + exit 0 fi if [[ "$START_SHA" == "$END_SHA" ]]; then @@ -196,13 +214,42 @@ jobs: echo "END_SHA=$END_SHA" >> /tmp/anno.env fi + - name: Comment issue on failure (strict/verify/etc) + if: ${{ always() }} + env: + FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }} + run: | + set -euo pipefail + source /tmp/anno.env + [[ "${SKIP:-0}" != "1" ]] || { echo "ℹ️ skipped"; exit 0; } + + RC="${APPLY_RC:-0}" + if [[ "$RC" == "0" ]]; then + echo "ℹ️ no failure detected" + exit 0 + fi + + BODY="$(tail -n 160 /tmp/apply.log | sed 's/\r$//')" + MSG="❌ apply-annotation-ticket a échoué (rc=${RC}).\n\n\`\`\`\n${BODY}\n\`\`\`\n" + + PAYLOAD="$(node --input-type=module -e 'console.log(JSON.stringify({body: process.argv[1]||""}))' "$MSG")" + + curl -fsS -X POST \ + -H "Authorization: token $FORGE_TOKEN" \ + -H "Content-Type: application/json" \ + "$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER/comments" \ + --data-binary "$PAYLOAD" + - name: Comment issue if no-op (already applied) + if: ${{ always() }} env: FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }} run: | set -euo pipefail source /tmp/anno.env [[ "${SKIP:-0}" != "1" ]] || exit 0 + + [[ "${APPLY_RC:-0}" == "0" ]] || exit 0 [[ "${NOOP:-0}" == "1" ]] || exit 0 MSG="ℹ️ Ticket #${ISSUE_NUMBER} : rien à appliquer (déjà présent / dédupliqué)." @@ -215,12 +262,15 @@ jobs: --data-binary "$PAYLOAD" - name: Push bot branch + if: ${{ always() }} env: FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }} run: | set -euo pipefail source /tmp/anno.env [[ "${SKIP:-0}" != "1" ]] || exit 0 + + [[ "${APPLY_RC:-0}" == "0" ]] || { echo "ℹ️ apply failed -> skip push"; exit 0; } [[ "${NOOP:-0}" == "0" ]] || { echo "ℹ️ no-op -> skip push"; exit 0; } AUTH_URL="$(node --input-type=module -e ' @@ -235,12 +285,15 @@ jobs: git push -u origin "$BRANCH" - name: Create PR + comment issue + if: ${{ always() }} env: FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }} run: | set -euo pipefail source /tmp/anno.env [[ "${SKIP:-0}" != "1" ]] || exit 0 + + [[ "${APPLY_RC:-0}" == "0" ]] || { echo "ℹ️ apply failed -> skip PR"; exit 0; } [[ "${NOOP:-0}" == "0" ]] || { echo "ℹ️ no-op -> skip PR"; exit 0; } PR_TITLE="anno: apply ticket #${ISSUE_NUMBER}" @@ -271,4 +324,20 @@ jobs: -H "Authorization: token $FORGE_TOKEN" \ -H "Content-Type: application/json" \ "$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER/comments" \ - --data-binary "$C_PAYLOAD" \ No newline at end of file + --data-binary "$C_PAYLOAD" + + echo "✅ PR: $PR_URL" + + - name: Finalize (fail job if apply failed) + if: ${{ always() }} + run: | + set -euo pipefail + source /tmp/anno.env || true + [[ "${SKIP:-0}" != "1" ]] || { echo "ℹ️ skipped"; exit 0; } + + RC="${APPLY_RC:-0}" + if [[ "$RC" != "0" ]]; then + echo "❌ apply failed (rc=$RC)" + exit "$RC" + fi + echo "✅ apply ok" \ No newline at end of file