@@ -25,6 +25,26 @@ attempts="${DOCS_RELEASE_AUDIT_ATTEMPTS:-6}"
2525sleep_seconds=" ${DOCS_RELEASE_AUDIT_RETRY_SLEEP:- 20} "
2626evidence_path=" ${DOCS_RELEASE_AUDIT_EVIDENCE:- } "
2727handoff_path=" ${DOCS_RELEASE_AUDIT_HANDOFF:- } "
28+ enforcement=" ${DOCS_RELEASE_AUDIT_ENFORCEMENT:- required} "
29+
30+ report_docs_freshness () {
31+ title=" $1 "
32+ message=" $2 "
33+
34+ if [ " $enforcement " = " required" ]; then
35+ fail " $title " " $message "
36+ fi
37+
38+ if [ -n " ${GITHUB_STEP_SUMMARY:- } " ]; then
39+ {
40+ printf ' ## %s\n\n' " $title "
41+ printf ' %s\n' " $message "
42+ } >> " $GITHUB_STEP_SUMMARY "
43+ fi
44+
45+ printf ' ::warning title=%s::%s\n' " $title " " $message " >&2
46+ printf ' %s\n' " $message " >&2
47+ }
2848
2949write_unavailable_evidence () {
3050 message=" $1 "
@@ -35,6 +55,8 @@ write_unavailable_evidence() {
3555const fs = require('fs');
3656
3757const [evidencePath, artifact, expected, auditUrl, message] = process.argv.slice(2);
58+ const repository = process.env.GITHUB_REPOSITORY || null;
59+ const runId = process.env.GITHUB_RUN_ID || null;
3860
3961fs.writeFileSync(evidencePath, `${JSON.stringify({
4062 schema: 'durable-workflow.release.docs-release-audit-evidence',
@@ -44,6 +66,18 @@ fs.writeFileSync(evidencePath, `${JSON.stringify({
4466 artifact,
4567 expected_version: expected,
4668 outcome: 'unavailable',
69+ lifecycle: 'docs_freshness',
70+ publication_outcome_impact: 'none',
71+ source_release_check: {
72+ repository,
73+ ref: process.env.GITHUB_REF_NAME || null,
74+ sha: process.env.GITHUB_SHA || null,
75+ run_id: runId,
76+ run_attempt: process.env.GITHUB_RUN_ATTEMPT || null,
77+ run_url: repository && runId
78+ ? `${process.env.GITHUB_SERVER_URL || 'https://github.com'}/${repository}/actions/runs/${runId}`
79+ : null,
80+ },
4781 message,
4882}, null, 2)}\n`);
4983NODE
@@ -59,6 +93,11 @@ if [ -z "$expected" ]; then
5993 fail " Docs release-audit version required" " DOCS_RELEASE_AUDIT_VERSION or GITHUB_REF_NAME must name the published artifact version."
6094fi
6195
96+ case " $enforcement " in
97+ required|advisory) ;;
98+ * ) fail " Invalid docs release-audit enforcement" " DOCS_RELEASE_AUDIT_ENFORCEMENT must be required or advisory." ;;
99+ esac
100+
62101case " $attempts " in
63102 ' ' |* [!0-9]* ) fail " Invalid docs release-audit retry count" " DOCS_RELEASE_AUDIT_ATTEMPTS must be a positive integer." ;;
64103esac
@@ -76,10 +115,10 @@ attempt=1
76115
77116while [ " $attempt " -le " $attempts " ]; do
78117 if curl -fsSL --retry 3 --retry-all-errors --connect-timeout 10 --max-time 30 -o " $audit_path " " $audit_url " ; then
79- if node - " $audit_path " " $artifact " " $expected " " $audit_url " " $evidence_path " " $handoff_path " << 'NODE '
118+ if node - " $audit_path " " $artifact " " $expected " " $audit_url " " $evidence_path " " $handoff_path " " $enforcement " << 'NODE '
80119const fs = require('fs');
81120
82- const [auditPath, artifact, expected, auditUrl, evidencePath, handoffPath] = process.argv.slice(2);
121+ const [auditPath, artifact, expected, auditUrl, evidencePath, handoffPath, enforcement ] = process.argv.slice(2);
83122const title = 'Docs release-audit tuple stale';
84123const refreshCommand = 'npm run refresh:public-artifact-versions';
85124const refreshFiles = [
@@ -122,6 +161,8 @@ function docsRefreshHandoff(message, actualVersion, observedVersions) {
122161 schema: 'durable-workflow.release.docs-artifact-tuple-handoff',
123162 schema_version: 1,
124163 action: 'pipeline_ready_item',
164+ lifecycle: 'docs_freshness',
165+ priority: 'low',
125166 reason: 'public_docs_release_audit_stale',
126167 repository: 'durable-workflow.github.io',
127168 target_branch: 'main',
@@ -158,6 +199,7 @@ function docsRefreshHandoff(message, actualVersion, observedVersions) {
158199 'pipeline:ready-item',
159200 'branch:main',
160201 'state:pending',
202+ 'priority:P3',
161203 ],
162204 acceptance: [
163205 'The public docs release-audit JSON reports the current published artifact tuple.',
@@ -207,6 +249,8 @@ function writeEvidence(outcome, extra = {}) {
207249 artifact,
208250 expected_version: expected,
209251 source_release_check: releaseCheckSource(),
252+ lifecycle: 'docs_freshness',
253+ publication_outcome_impact: 'none',
210254 outcome,
211255 ...extra,
212256 }, null, 2)}\n`);
@@ -230,9 +274,10 @@ function fail(message, extra = {}) {
230274 `## ${title}\n\n${message}\n\n`
231275 );
232276 }
233- console.error(`::error title=${title}::${message}`);
277+ const annotation = enforcement === 'advisory' ? 'warning' : 'error';
278+ console.error(`::${annotation} title=${title}::${message}`);
234279 console.error(message);
235- process.exit(2);
280+ process.exit(enforcement === 'advisory' ? 0 : 2);
236281}
237282
238283let audit;
294339
295340message=" Could not fetch ${audit_url} after ${attempts} attempt(s)."
296341write_unavailable_evidence " $message "
297- fail " Docs release-audit unavailable" " $message "
342+ report_docs_freshness " Docs release-audit unavailable" " $message "
0 commit comments