From 46b15ed6abb9025153bb890e701733c0506088e9 Mon Sep 17 00:00:00 2001 From: Archicratia Date: Mon, 16 Mar 2026 12:30:43 +0100 Subject: [PATCH] fix(actions): remove fragile heredocs from proposer PR step --- .gitea/workflows/proposer-apply-pr.yml | 90 ++++++++++++++------------ 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/.gitea/workflows/proposer-apply-pr.yml b/.gitea/workflows/proposer-apply-pr.yml index 9e3bcfb..125dbf8 100644 --- a/.gitea/workflows/proposer-apply-pr.yml +++ b/.gitea/workflows/proposer-apply-pr.yml @@ -555,46 +555,47 @@ jobs: [[ "${NOOP:-0}" == "0" ]] || exit 0 [[ -n "${BRANCH:-}" ]] || { echo "BRANCH unset -> skip PR"; exit 0; } + test -n "${FORGE_TOKEN:-}" || { echo "Missing FORGE_TOKEN"; exit 1; } + if [[ "${TARGET_COUNT:-0}" == "1" ]]; then PR_TITLE="proposer: apply ticket #${TARGET_PRIMARY_ISSUE}" else PR_TITLE="proposer: apply ${TARGET_COUNT} tickets on ${TARGET_CHEMIN}" fi - export TITLE="$PR_TITLE" - export CHEMIN="$TARGET_CHEMIN" - export ISSUES="$TARGET_ISSUES" - export BRANCH="$BRANCH" - export END_SHA="${END_SHA:-unknown}" - export DEFAULT_BRANCH="$DEFAULT_BRANCH" - export OWNER="$OWNER" + export PR_TITLE TARGET_CHEMIN TARGET_ISSUES BRANCH END_SHA DEFAULT_BRANCH OWNER - node --input-type=module - <<'NODE' > /tmp/proposer.pr.json - const issues = String(process.env.ISSUES || "") - .trim() - .split(/\s+/) - .filter(Boolean); + node --input-type=module -e ' + import fs from "node:fs"; - const body = [ - `PR auto depuis ticket${issues.length > 1 ? "s" : ""} ${issues.map((n) => `#${n}`).join(", ")} (state/approved).`, - "", - `- Chemin: ${process.env.CHEMIN || "(inconnu)"}`, - "- Tickets:", - ...issues.map((n) => ` - #${n}`), - `- Branche: ${process.env.BRANCH || ""}`, - `- Commit: ${process.env.END_SHA || "unknown"}`, - "", - "Merge si CI OK." - ].join("\n"); + const issues = String(process.env.TARGET_ISSUES || "") + .trim() + .split(/\s+/) + .filter(Boolean); - process.stdout.write(JSON.stringify({ - title: process.env.TITLE || "proposer: apply tickets", - body, - base: process.env.DEFAULT_BRANCH || "main", - head: `${process.env.OWNER}:${process.env.BRANCH}`, - allow_maintainer_edit: true - })); - NODE + const body = [ + `PR auto depuis ticket${issues.length > 1 ? "s" : ""} ${issues.map((n) => `#${n}`).join(", ")} (state/approved).`, + "", + `- Chemin: ${process.env.TARGET_CHEMIN || "(inconnu)"}`, + "- Tickets:", + ...issues.map((n) => ` - #${n}`), + `- Branche: ${process.env.BRANCH || ""}`, + `- Commit: ${process.env.END_SHA || "unknown"}`, + "", + "Merge si CI OK." + ].join("\n"); + + fs.writeFileSync( + "/tmp/proposer.pr.json", + JSON.stringify({ + title: process.env.PR_TITLE || "proposer: apply tickets", + body, + base: process.env.DEFAULT_BRANCH || "main", + head: `${process.env.OWNER}:${process.env.BRANCH}`, + allow_maintainer_edit: true + }) + ); + ' PR_JSON="$(curl -fsS -X POST \ -H "Authorization: token $FORGE_TOKEN" \ @@ -602,10 +603,7 @@ jobs: "$API_BASE/api/v1/repos/$OWNER/$REPO/pulls" \ --data-binary @/tmp/proposer.pr.json)" - PR_URL="$(node --input-type=module -e ' - const pr = JSON.parse(process.argv[1] || "{}"); - console.log(pr.html_url || pr.url || ""); - ' "$PR_JSON")" + PR_URL="$(node --input-type=module -e 'const pr = JSON.parse(process.argv[1] || "{}"); console.log(pr.html_url || pr.url || "");' "$PR_JSON")" test -n "$PR_URL" || { echo "PR URL missing. Raw: $PR_JSON" @@ -614,15 +612,21 @@ jobs: for ISSUE in $TARGET_ISSUES; do export ISSUE PR_URL - node --input-type=module - <<'NODE' > /tmp/proposer.issue.close.comment.json - const issue = process.env.ISSUE || ""; - const url = process.env.PR_URL || ""; - const msg = - `PR proposer created for ticket #${issue}: ${url}\n\n` + - `The ticket is closed automatically. Discussion can continue in the PR.`; - process.stdout.write(JSON.stringify({ body: msg })); - NODE + node --input-type=module -e ' + import fs from "node:fs"; + + const issue = process.env.ISSUE || ""; + const url = process.env.PR_URL || ""; + const msg = + `PR proposer créée pour le ticket #${issue} : ${url}\n\n` + + `Le ticket est clôturé automatiquement ; la discussion peut se poursuivre dans la PR.`; + + fs.writeFileSync( + "/tmp/proposer.issue.close.comment.json", + JSON.stringify({ body: msg }) + ); + ' curl -fsS -X POST \ -H "Authorization: token $FORGE_TOKEN" \ -- 2.49.1