@codyswann/lisa 4.42.7 → 4.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/doctor-readiness-delivery.d.ts.map +1 -1
- package/dist/cli/doctor-readiness-delivery.js +13 -6
- package/dist/cli/doctor-readiness-delivery.js.map +1 -1
- package/dist/cli/doctor-readiness-deploy-outcome.d.ts +9 -0
- package/dist/cli/doctor-readiness-deploy-outcome.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-deploy-outcome.js +87 -0
- package/dist/cli/doctor-readiness-deploy-outcome.js.map +1 -0
- package/dist/cli/doctor-readiness-workflows.d.ts +8 -0
- package/dist/cli/doctor-readiness-workflows.d.ts.map +1 -1
- package/dist/cli/doctor-readiness-workflows.js +1 -0
- package/dist/cli/doctor-readiness-workflows.js.map +1 -1
- package/dist/core/deploy-release-dependence.d.ts +72 -0
- package/dist/core/deploy-release-dependence.d.ts.map +1 -0
- package/dist/core/deploy-release-dependence.js +236 -0
- package/dist/core/deploy-release-dependence.js.map +1 -0
- package/dist/core/github-actions-condition.d.ts +78 -0
- package/dist/core/github-actions-condition.d.ts.map +1 -0
- package/dist/core/github-actions-condition.js +307 -0
- package/dist/core/github-actions-condition.js.map +1 -0
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +15 -1
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/migrations/deploy-outcome-guard-edit.d.ts +11 -0
- package/dist/migrations/deploy-outcome-guard-edit.d.ts.map +1 -0
- package/dist/migrations/deploy-outcome-guard-edit.js +184 -0
- package/dist/migrations/deploy-outcome-guard-edit.js.map +1 -0
- package/dist/migrations/deploy-outcome-guard-yaml.d.ts +91 -0
- package/dist/migrations/deploy-outcome-guard-yaml.d.ts.map +1 -0
- package/dist/migrations/deploy-outcome-guard-yaml.js +180 -0
- package/dist/migrations/deploy-outcome-guard-yaml.js.map +1 -0
- package/dist/migrations/ensure-deploy-outcome-guard.d.ts +41 -0
- package/dist/migrations/ensure-deploy-outcome-guard.d.ts.map +1 -0
- package/dist/migrations/ensure-deploy-outcome-guard.js +238 -0
- package/dist/migrations/ensure-deploy-outcome-guard.js.map +1 -0
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +3 -0
- package/dist/migrations/index.js.map +1 -1
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/scripts/check-test-case-executed.mjs +184 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-delivery.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-delivery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor-readiness-delivery.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-delivery.ts"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EACL,KAAK,cAAc,EAEpB,MAAM,iCAAiC,CAAC;AAGzC,+EAA+E;AAC/E,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AAoWpE;;;;;;;;;GASG;AACH,wBAAsB,gCAAgC,CACpD,IAAI,EAAE,MAAM,EACZ,eAAe,CAAC,EAAE,SAAS,cAAc,EAAE,GAC1C,OAAO,CAAC,wBAAwB,CAAC,CAoBnC"}
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
import { readFile } from "node:fs/promises";
|
|
28
28
|
import * as path from "node:path";
|
|
29
29
|
import { detectCredentialFindings, } from "./doctor-readiness-credentials.js";
|
|
30
|
+
import { deployOutcomeObservations } from "./doctor-readiness-deploy-outcome.js";
|
|
30
31
|
import { informationalFindings } from "./doctor-readiness-shared.js";
|
|
31
32
|
import { assessReleasePaths, PROMOTION_ACTION, } from "./doctor-readiness-release-path.js";
|
|
32
33
|
import { unpinnedPublishingActionViolations } from "./doctor-readiness-action-pins.js";
|
|
@@ -48,6 +49,7 @@ function summarizeReleasePaths(workflows, defaultBranches) {
|
|
|
48
49
|
const outcomes = workflows.flatMap(workflow => workflow.jobs.flatMap(job => assessReleasePaths(workflow, job, defaultBranches, workflows)));
|
|
49
50
|
const unpinnedActionViolations = workflows.flatMap(workflow => workflow.jobs.flatMap(job => unpinnedPublishingActionViolations(workflow, job, workflows)));
|
|
50
51
|
return {
|
|
52
|
+
deployOutcomeObservations: deployOutcomeObservations(workflows),
|
|
51
53
|
violations: [
|
|
52
54
|
...outcomes.flatMap(outcome => outcome.kind === "violation" ? [outcome.evidence] : []),
|
|
53
55
|
...unpinnedActionViolations,
|
|
@@ -199,16 +201,17 @@ function credentialFinding(violations) {
|
|
|
199
201
|
/**
|
|
200
202
|
* Build the SKIP record for a repository whose release paths could not be
|
|
201
203
|
* settled from the workflow files alone.
|
|
202
|
-
* @param
|
|
204
|
+
* @param summary - What the release paths established
|
|
203
205
|
* @param credentials - The credential half of the assessment
|
|
204
206
|
* @returns The SKIP dimension record
|
|
205
207
|
*/
|
|
206
|
-
function unresolvedRecord(
|
|
208
|
+
function unresolvedRecord(summary, credentials) {
|
|
207
209
|
return {
|
|
208
210
|
id: DELIVERY_AUTHORITY_DIMENSION_ID,
|
|
209
211
|
status: "SKIP",
|
|
210
212
|
findings: [
|
|
211
|
-
{ reason:
|
|
213
|
+
{ reason: summary.unresolved.join(" | "), skip: true },
|
|
214
|
+
...informationalFindings(summary.deployOutcomeObservations),
|
|
212
215
|
...informationalFindings(credentials.informational),
|
|
213
216
|
],
|
|
214
217
|
};
|
|
@@ -234,6 +237,7 @@ function cleanRecord(summary, workflows, credentials) {
|
|
|
234
237
|
"static cloud keys.",
|
|
235
238
|
checked: [RELEASE_BLOCKER_ID, CREDENTIAL_BLOCKER_ID],
|
|
236
239
|
},
|
|
240
|
+
...informationalFindings(summary.deployOutcomeObservations),
|
|
237
241
|
...informationalFindings(credentials.informational),
|
|
238
242
|
],
|
|
239
243
|
};
|
|
@@ -261,6 +265,7 @@ function violationRecord(summary, credentials) {
|
|
|
261
265
|
// settled offline: dropping those reasons is #1898's defect one layer in.
|
|
262
266
|
// They carry no `blocker` key, so they add nothing to the verdict.
|
|
263
267
|
...informationalFindings(summary.unresolved),
|
|
268
|
+
...informationalFindings(summary.deployOutcomeObservations),
|
|
264
269
|
...informationalFindings(credentials.informational),
|
|
265
270
|
],
|
|
266
271
|
};
|
|
@@ -286,10 +291,11 @@ function noWorkflowsRecord() {
|
|
|
286
291
|
/**
|
|
287
292
|
* Build the SKIP record for a repository whose workflows publish nothing.
|
|
288
293
|
* @param workflows - Parsed workflows
|
|
294
|
+
* @param summary - What the release paths established
|
|
289
295
|
* @param credentials - The credential half of the assessment
|
|
290
296
|
* @returns The SKIP dimension record
|
|
291
297
|
*/
|
|
292
|
-
function noReleasePathRecord(workflows, credentials) {
|
|
298
|
+
function noReleasePathRecord(workflows, summary, credentials) {
|
|
293
299
|
return {
|
|
294
300
|
id: DELIVERY_AUTHORITY_DIMENSION_ID,
|
|
295
301
|
status: "SKIP",
|
|
@@ -301,6 +307,7 @@ function noReleasePathRecord(workflows, credentials) {
|
|
|
301
307
|
"assessed and found nothing over-authorized.",
|
|
302
308
|
skip: true,
|
|
303
309
|
},
|
|
310
|
+
...informationalFindings(summary.deployOutcomeObservations),
|
|
304
311
|
...informationalFindings(credentials.informational),
|
|
305
312
|
],
|
|
306
313
|
};
|
|
@@ -326,10 +333,10 @@ export async function assessDeliveryAuthorityDimension(root, parsedWorkflows) {
|
|
|
326
333
|
return violationRecord(summary, credentials);
|
|
327
334
|
}
|
|
328
335
|
if (summary.unresolved.length > 0) {
|
|
329
|
-
return unresolvedRecord(summary
|
|
336
|
+
return unresolvedRecord(summary, credentials);
|
|
330
337
|
}
|
|
331
338
|
if (summary.publishStepCount === 0) {
|
|
332
|
-
return noReleasePathRecord(workflows, credentials);
|
|
339
|
+
return noReleasePathRecord(workflows, summary, credentials);
|
|
333
340
|
}
|
|
334
341
|
return cleanRecord(summary, workflows, credentials);
|
|
335
342
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-delivery.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAEL,wBAAwB,GACzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GAEjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,kCAAkC,EAAE,MAAM,mCAAmC,CAAC;AAEvF,OAAO,EAEL,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,+BAA+B,GAAG,oBAAoB,CAAC;AAEpE,gFAAgF;AAChF,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,+EAA+E;AAC/E,MAAM,qBAAqB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-readiness-delivery.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ParsedWorkflow } from "./doctor-readiness-workflows.js";
|
|
2
|
+
/**
|
|
3
|
+
* Find every deploy job across the repository that goes silent on a failed
|
|
4
|
+
* release.
|
|
5
|
+
* @param workflows - Parsed workflows
|
|
6
|
+
* @returns One observation per affected job, in workflow order
|
|
7
|
+
*/
|
|
8
|
+
export declare function deployOutcomeObservations(workflows: readonly ParsedWorkflow[]): readonly string[];
|
|
9
|
+
//# sourceMappingURL=doctor-readiness-deploy-outcome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-readiness-deploy-outcome.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-deploy-outcome.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAmCtE;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,SAAS,MAAM,EAAE,CAYnB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report a deploy job that goes SILENT when its release fails
|
|
3
|
+
* (CodySwannGT/lisa#3740).
|
|
4
|
+
*
|
|
5
|
+
* ## What this reports and what actually repairs it
|
|
6
|
+
*
|
|
7
|
+
* #3467 fixed the shape in Lisa's deploy templates, and #3738 shipped that fix.
|
|
8
|
+
* Those templates are `create-only` — Lisa seeds the file once and never
|
|
9
|
+
* overwrites it — so the fix reaches new adoptions and nothing else. The
|
|
10
|
+
* `ensure-deploy-outcome-guard` migration is what repairs an already-seeded
|
|
11
|
+
* `deploy.yml`; this finding is its reporting complement, covering the files
|
|
12
|
+
* that migration deliberately declines: a workflow whose condition it cannot
|
|
13
|
+
* rewrite without guessing, and a postinstall-mode run, where rewriting a
|
|
14
|
+
* reviewed, checked-in declaration is not something a dependency install gets
|
|
15
|
+
* to do.
|
|
16
|
+
*
|
|
17
|
+
* A finding here therefore means one of two things, and the operator does not
|
|
18
|
+
* need to know which: either the migration has not run yet, or it looked and
|
|
19
|
+
* decided this file was not one it could safely edit.
|
|
20
|
+
*
|
|
21
|
+
* ## Why this is NOT a ship blocker, decided rather than defaulted
|
|
22
|
+
*
|
|
23
|
+
* `doctor-readiness-blockers.ts` maps findings to a deliberately closed set of
|
|
24
|
+
* seven blockers, and #3740 required whoever implemented it to say, explicitly,
|
|
25
|
+
* which of three things this is. It reports as a **non-blocking readiness
|
|
26
|
+
* observation**, carrying no `blocker` key, for a reason that is about the
|
|
27
|
+
* property rather than about convenience:
|
|
28
|
+
*
|
|
29
|
+
* None of the seven describes it. B2 is "a release path bypasses the validated
|
|
30
|
+
* artifact" — nothing ships here at all, so nothing bypasses validation. B4 is
|
|
31
|
+
* "a consequential operation has no gate and no recovery", and the deploy has
|
|
32
|
+
* both; what it lacks is a *report*. The defect is the observability of a
|
|
33
|
+
* non-event, which the v1 rubric simply does not have a blocker for.
|
|
34
|
+
*
|
|
35
|
+
* Opening the closed set is a rule edit to `readiness-rubric` (intake decision
|
|
36
|
+
* O4) and is not something a reporting change gets to do as a side effect —
|
|
37
|
+
* which is exactly why #3740 called it out rather than letting it be smuggled
|
|
38
|
+
* in. Reporting it non-blocking is honest about the evidence: it is real,
|
|
39
|
+
* it is actionable, and it does not on its own make "an unattended fleet may
|
|
40
|
+
* run here" false, because the migration repairs the ordinary case.
|
|
41
|
+
* @module cli/doctor-readiness-deploy-outcome
|
|
42
|
+
*/
|
|
43
|
+
import { deployJobsSkippedByFailedRelease } from "../core/deploy-release-dependence.js";
|
|
44
|
+
/**
|
|
45
|
+
* The remediation, written for whoever is standing at the gate.
|
|
46
|
+
*
|
|
47
|
+
* Deliberately free of GitHub Actions vocabulary beyond the two words that name
|
|
48
|
+
* the thing to edit. #3740 makes this an acceptance criterion, and the reason is
|
|
49
|
+
* the factory's own: everything that crosses a gate outward is read by an
|
|
50
|
+
* operator who is not an engineer, and a remediation they cannot act on is a
|
|
51
|
+
* finding that stays open.
|
|
52
|
+
*/
|
|
53
|
+
const REMEDIATION = "Right now, if the release step fails, this deploy is quietly stepped over " +
|
|
54
|
+
"and the run still looks green — so nobody is told that the new version " +
|
|
55
|
+
"never went out. Make the deploy run anyway and stop with a clear error " +
|
|
56
|
+
"instead: in the deploy job add `if: ${{ !cancelled() }}` to its conditions, " +
|
|
57
|
+
"and make its first step check whether the release succeeded and fail with a " +
|
|
58
|
+
"message when it did not. Lisa's own deploy templates show the exact wording, " +
|
|
59
|
+
"and `lisa` normally makes this edit for you on your next update.";
|
|
60
|
+
/**
|
|
61
|
+
* Describe one skipping deploy job as an evidence line.
|
|
62
|
+
* @param workflow - Repo-relative workflow path
|
|
63
|
+
* @param job - The deploy job's id
|
|
64
|
+
* @param release - The release job whose failure skips it
|
|
65
|
+
* @returns A single operator-readable observation
|
|
66
|
+
*/
|
|
67
|
+
function observation(workflow, job, release) {
|
|
68
|
+
return (`${workflow} job \`${job}\` is skipped rather than failed when \`${release}\` ` +
|
|
69
|
+
"does not succeed. A skipped job shows as neutral and counts as a satisfied " +
|
|
70
|
+
`required check, so a deploy that never happened reports nothing. ${REMEDIATION}`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Find every deploy job across the repository that goes silent on a failed
|
|
74
|
+
* release.
|
|
75
|
+
* @param workflows - Parsed workflows
|
|
76
|
+
* @returns One observation per affected job, in workflow order
|
|
77
|
+
*/
|
|
78
|
+
export function deployOutcomeObservations(workflows) {
|
|
79
|
+
return workflows.flatMap(workflow => deployJobsSkippedByFailedRelease(workflow.jobs.map(job => ({
|
|
80
|
+
id: job.id,
|
|
81
|
+
name: job.name,
|
|
82
|
+
needs: job.needs,
|
|
83
|
+
ifCondition: job.ifCondition,
|
|
84
|
+
environment: job.environment,
|
|
85
|
+
}))).map(found => observation(workflow.file, found.job.id, found.release)));
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=doctor-readiness-deploy-outcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-readiness-deploy-outcome.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-deploy-outcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,EAAE,gCAAgC,EAAE,MAAM,sCAAsC,CAAC;AAGxF;;;;;;;;GAQG;AACH,MAAM,WAAW,GACf,4EAA4E;IAC5E,yEAAyE;IACzE,yEAAyE;IACzE,8EAA8E;IAC9E,8EAA8E;IAC9E,+EAA+E;IAC/E,kEAAkE,CAAC;AAErE;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,QAAgB,EAAE,GAAW,EAAE,OAAe;IACjE,OAAO,CACL,GAAG,QAAQ,UAAU,GAAG,2CAA2C,OAAO,KAAK;QAC/E,6EAA6E;QAC7E,oEAAoE,WAAW,EAAE,CAClF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,SAAoC;IAEpC,OAAO,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAClC,gCAAgC,CAC9B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAC,CAAC,CACJ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CACxE,CAAC;AACJ,CAAC"}
|
|
@@ -39,6 +39,14 @@ export interface ParsedWorkflowStep {
|
|
|
39
39
|
/** One job inside a parsed workflow. */
|
|
40
40
|
export interface ParsedWorkflowJob {
|
|
41
41
|
readonly id: string;
|
|
42
|
+
/**
|
|
43
|
+
* The job's display `name:`, or `""` when it declares none.
|
|
44
|
+
*
|
|
45
|
+
* Load-bearing for #3740: a host is free to give a deploy job any id it
|
|
46
|
+
* likes, and the display name is often where the word "Deploy" actually
|
|
47
|
+
* appears. Classifying on the id alone silently misses those jobs.
|
|
48
|
+
*/
|
|
49
|
+
readonly name: string;
|
|
42
50
|
/** Repo-relative path of the workflow file declaring this job. */
|
|
43
51
|
readonly workflow: string;
|
|
44
52
|
readonly needs: readonly string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-workflows.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-workflows.ts"],"names":[],"mappings":"AAwBA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,6CAA6C;AAC7C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,EAAE,qBAAqB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC7C;
|
|
1
|
+
{"version":3,"file":"doctor-readiness-workflows.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-workflows.ts"],"names":[],"mappings":"AAwBA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,6CAA6C;AAC7C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,EAAE,qBAAqB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC7C;AAqND;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAQpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-workflows.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-workflows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,0EAA0E;AAC1E,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-readiness-workflows.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-workflows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** The minimal job shape this analysis reads. */
|
|
2
|
+
export interface DependenceJob {
|
|
3
|
+
/** The job's key in the workflow's `jobs:` map. */
|
|
4
|
+
readonly id: string;
|
|
5
|
+
/** The job's display `name:`, or `""` when it declares none. */
|
|
6
|
+
readonly name?: string;
|
|
7
|
+
/** Ids of the jobs this one declares in `needs:`. */
|
|
8
|
+
readonly needs: readonly string[];
|
|
9
|
+
/** The job's `if:` text, or `""` when it declares none. */
|
|
10
|
+
readonly ifCondition: string;
|
|
11
|
+
/** Deployment environments the job declares, if any. */
|
|
12
|
+
readonly environment?: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
/** What one job's release dependence turned out to be. */
|
|
15
|
+
export type ReleaseDependence =
|
|
16
|
+
/** The job runs when the release succeeds and skips when it fails. */
|
|
17
|
+
{
|
|
18
|
+
readonly kind: "skips-on-failed-release";
|
|
19
|
+
readonly release: string;
|
|
20
|
+
}
|
|
21
|
+
/** The release result does not decide whether this job runs. */
|
|
22
|
+
| {
|
|
23
|
+
readonly kind: "independent";
|
|
24
|
+
}
|
|
25
|
+
/** The condition could not be read, so nothing is claimed either way. */
|
|
26
|
+
| {
|
|
27
|
+
readonly kind: "unreadable";
|
|
28
|
+
readonly reason: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Whether an upstream job is the one that cuts the release.
|
|
32
|
+
*
|
|
33
|
+
* Name-based, and that is a stated limit rather than an oversight: a host free
|
|
34
|
+
* to name its jobs anything can name this one something with neither word in
|
|
35
|
+
* it, and such a job is not recognised. The alternative — treating every
|
|
36
|
+
* upstream job as release-like — would report a deploy that skips because an
|
|
37
|
+
* unrelated optional job failed, which is a different property.
|
|
38
|
+
* @param job - The candidate upstream job
|
|
39
|
+
* @returns True when the job looks like the release
|
|
40
|
+
*/
|
|
41
|
+
export declare function isReleaseJob(job: DependenceJob): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Whether a job ships something to an environment.
|
|
44
|
+
*
|
|
45
|
+
* A declared `environment:` is the name-independent half: GitHub's deployment
|
|
46
|
+
* environments exist for exactly this kind of job, so a host that used one has
|
|
47
|
+
* said what the job is without Lisa having to guess from its id.
|
|
48
|
+
* @param job - The candidate job
|
|
49
|
+
* @returns True when the job looks like a deploy
|
|
50
|
+
*/
|
|
51
|
+
export declare function isDeployJob(job: DependenceJob): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Decide whether the release result is what makes this job skip.
|
|
54
|
+
* @param job - The job under analysis
|
|
55
|
+
* @param release - The id of the upstream release job
|
|
56
|
+
* @returns What the two evaluations established
|
|
57
|
+
*/
|
|
58
|
+
export declare function releaseDependence(job: DependenceJob, release: string): ReleaseDependence;
|
|
59
|
+
/** One deploy job whose run depends on the release having succeeded. */
|
|
60
|
+
export interface SkippingDeployJob {
|
|
61
|
+
/** The job that skips. */
|
|
62
|
+
readonly job: DependenceJob;
|
|
63
|
+
/** The upstream release job whose failure skips it. */
|
|
64
|
+
readonly release: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Find every deploy job in one workflow that skips when its release fails.
|
|
68
|
+
* @param jobs - Every job the workflow declares
|
|
69
|
+
* @returns The deploy jobs that go silent on a failed release
|
|
70
|
+
*/
|
|
71
|
+
export declare function deployJobsSkippedByFailedRelease(jobs: readonly DependenceJob[]): readonly SkippingDeployJob[];
|
|
72
|
+
//# sourceMappingURL=deploy-release-dependence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-release-dependence.d.ts","sourceRoot":"","sources":["../../src/core/deploy-release-dependence.ts"],"names":[],"mappings":"AA+DA,iDAAiD;AACjD,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,0DAA0D;AAC1D,MAAM,MAAM,iBAAiB;AAC3B,sEAAsE;AACpE;IAAE,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACxE,gEAAgE;GAC9D;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE;AAClC,yEAAyE;GACvE;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAc7D;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAExD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAMvD;AA8ID;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,GACd,iBAAiB,CAoBnB;AAED,wEAAwE;AACxE,MAAM,WAAW,iBAAiB;IAChC,0BAA0B;IAC1B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,SAAS,aAAa,EAAE,GAC7B,SAAS,iBAAiB,EAAE,CAiB9B"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decide whether a job SKIPS because its release job did not succeed
|
|
3
|
+
* (CodySwannGT/lisa#3740).
|
|
4
|
+
*
|
|
5
|
+
* ## The shape being detected
|
|
6
|
+
*
|
|
7
|
+
* GitHub renders a skipped job as neutral and counts a skipped required check
|
|
8
|
+
* as satisfied. So a deploy that never happened leaves no signal anywhere: the
|
|
9
|
+
* branch still carries its release commit, every status field still says green,
|
|
10
|
+
* and nothing prompts anyone to go read CI history for skipped Deploy jobs. A
|
|
11
|
+
* consuming repository ran eight days that way (#3467).
|
|
12
|
+
*
|
|
13
|
+
* Two spellings produce it, and neither says anything about skipping:
|
|
14
|
+
*
|
|
15
|
+
* - **No `if:` at all.** GitHub ANDs an implicit `success()` onto the job, so a
|
|
16
|
+
* failed release skips it silently. (The rails template's form.)
|
|
17
|
+
* - **An `if:` that names a status function but conjoins
|
|
18
|
+
* `needs.<release>.result == 'success'`.** The status function suppresses the
|
|
19
|
+
* implicit AND, and then the conjunct reintroduces it by hand. (The expo
|
|
20
|
+
* template's form.)
|
|
21
|
+
*
|
|
22
|
+
* ## Why this is answered semantically rather than by pattern
|
|
23
|
+
*
|
|
24
|
+
* Matching those two spellings would find the two templates and miss the third
|
|
25
|
+
* spelling a host wrote by hand — and, worse, would flag a job that skips for a
|
|
26
|
+
* reason having nothing to do with the release. The question is not "does this
|
|
27
|
+
* condition contain a string" but **"does the release result decide whether
|
|
28
|
+
* this job runs"**, and that is answered by evaluating the condition twice:
|
|
29
|
+
*
|
|
30
|
+
* - **released:** the release job reports `success`.
|
|
31
|
+
* - **failed:** the release job reports `failure`.
|
|
32
|
+
*
|
|
33
|
+
* A job that runs under the first and skips under the second is skipping
|
|
34
|
+
* because of the release. A job that skips under both — an unconfigured
|
|
35
|
+
* stack, a path filter, a deliberate `if:` about something else — is skipping
|
|
36
|
+
* for its own reasons and is not this defect. That is the acceptance criteria's
|
|
37
|
+
* third scenario satisfied by construction rather than by a special case.
|
|
38
|
+
*
|
|
39
|
+
* ## The most-permissive assignment, and what it can miss
|
|
40
|
+
*
|
|
41
|
+
* Both evaluations need values for the paths the condition reads that are not
|
|
42
|
+
* the release result — another job's output, a `github.*` field, an input.
|
|
43
|
+
* Those are assigned the value that makes the surrounding comparison hold: a
|
|
44
|
+
* path compared for equality against a literal takes that literal, and anything
|
|
45
|
+
* else takes a non-empty placeholder. The reading is "assuming everything else
|
|
46
|
+
* about this repository is configured, does the release result decide it".
|
|
47
|
+
*
|
|
48
|
+
* Stated rather than implied: this is one assignment, not a search. A condition
|
|
49
|
+
* whose release dependence only appears under some *other* combination of
|
|
50
|
+
* values is not reported. Under-reporting is the deliberate direction — a check
|
|
51
|
+
* that flags a deploy job for a skip it does not have is one that gets turned
|
|
52
|
+
* off, and then the real instances go unreported too.
|
|
53
|
+
*
|
|
54
|
+
* A condition the evaluator cannot parse yields `unreadable`, never `false`.
|
|
55
|
+
* @module core/deploy-release-dependence
|
|
56
|
+
*/
|
|
57
|
+
import { jobRuns, tokenize, } from "./github-actions-condition.js";
|
|
58
|
+
/** Job ids and names that identify the job which cuts the release. */
|
|
59
|
+
const RELEASE_JOB = /(^|[_\-\s])(release|publish)([_\-\s]|$)/i;
|
|
60
|
+
/** Job ids and names that identify a job which ships to an environment. */
|
|
61
|
+
const DEPLOY_JOB = /deploy/i;
|
|
62
|
+
/** The value assigned to a free path with no equality comparison to borrow. */
|
|
63
|
+
const PLACEHOLDER = "lisa-permissive-placeholder";
|
|
64
|
+
/** Context roots whose values this analysis chooses, beyond `github.*`. */
|
|
65
|
+
const FREE_ROOTS = ["inputs"];
|
|
66
|
+
/**
|
|
67
|
+
* Whether an upstream job is the one that cuts the release.
|
|
68
|
+
*
|
|
69
|
+
* Name-based, and that is a stated limit rather than an oversight: a host free
|
|
70
|
+
* to name its jobs anything can name this one something with neither word in
|
|
71
|
+
* it, and such a job is not recognised. The alternative — treating every
|
|
72
|
+
* upstream job as release-like — would report a deploy that skips because an
|
|
73
|
+
* unrelated optional job failed, which is a different property.
|
|
74
|
+
* @param job - The candidate upstream job
|
|
75
|
+
* @returns True when the job looks like the release
|
|
76
|
+
*/
|
|
77
|
+
export function isReleaseJob(job) {
|
|
78
|
+
return RELEASE_JOB.test(job.id) || RELEASE_JOB.test(job.name ?? "");
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Whether a job ships something to an environment.
|
|
82
|
+
*
|
|
83
|
+
* A declared `environment:` is the name-independent half: GitHub's deployment
|
|
84
|
+
* environments exist for exactly this kind of job, so a host that used one has
|
|
85
|
+
* said what the job is without Lisa having to guess from its id.
|
|
86
|
+
* @param job - The candidate job
|
|
87
|
+
* @returns True when the job looks like a deploy
|
|
88
|
+
*/
|
|
89
|
+
export function isDeployJob(job) {
|
|
90
|
+
return (DEPLOY_JOB.test(job.id) ||
|
|
91
|
+
DEPLOY_JOB.test(job.name ?? "") ||
|
|
92
|
+
(job.environment ?? []).length > 0);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The literal a path is compared against, when the comparison is an equality.
|
|
96
|
+
* @param tokens - The tokenized condition
|
|
97
|
+
* @param index - Position of the path token
|
|
98
|
+
* @returns The literal without its quotes, or null when there is none
|
|
99
|
+
*/
|
|
100
|
+
function comparedLiteral(tokens, index) {
|
|
101
|
+
const quoted = (token) => token !== undefined && token.startsWith("'") ? token.slice(1, -1) : null;
|
|
102
|
+
if (tokens[index + 1] === "==")
|
|
103
|
+
return quoted(tokens[index + 2]);
|
|
104
|
+
if (tokens[index - 1] === "==")
|
|
105
|
+
return quoted(tokens[index - 2]);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Choose a value for every non-`needs.*.result` path the condition reads.
|
|
110
|
+
*
|
|
111
|
+
* A path compared for equality against a string literal takes that literal, so
|
|
112
|
+
* the comparison holds; every other path takes a non-empty placeholder, which
|
|
113
|
+
* is truthy and satisfies an inequality. The result is the run in which
|
|
114
|
+
* everything except the release is configured as the condition wants it.
|
|
115
|
+
* @param condition - The raw `if:` text
|
|
116
|
+
* @returns The chosen values, keyed by full dotted path
|
|
117
|
+
*/
|
|
118
|
+
function permissiveAssignment(condition) {
|
|
119
|
+
const tokens = tokenize(condition
|
|
120
|
+
.trim()
|
|
121
|
+
.replace(/^\$\{\{/, "")
|
|
122
|
+
.replace(/\}\}$/, ""));
|
|
123
|
+
const isPath = (token) => /^[A-Za-z_][A-Za-z0-9_.-]*$/.test(token) && !token.endsWith(".result");
|
|
124
|
+
return Object.fromEntries(tokens.flatMap((token, index) => isPath(token)
|
|
125
|
+
? [[token, comparedLiteral(tokens, index) ?? PLACEHOLDER]]
|
|
126
|
+
: []));
|
|
127
|
+
}
|
|
128
|
+
/** An assignment with nothing in it, and the seed for the fold below. */
|
|
129
|
+
const EMPTY_ASSIGNMENT = {
|
|
130
|
+
outputs: {},
|
|
131
|
+
github: {},
|
|
132
|
+
inputs: {},
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Route one chosen path into the half of the scenario that owns it.
|
|
136
|
+
* @param split - The assignment built so far
|
|
137
|
+
* @param entry - One `[path, value]` pair
|
|
138
|
+
* @returns The assignment with that pair routed
|
|
139
|
+
*/
|
|
140
|
+
function routePath(split, entry) {
|
|
141
|
+
const [path, value] = entry;
|
|
142
|
+
const segments = path.split(".");
|
|
143
|
+
const root = segments[0] ?? "";
|
|
144
|
+
if (root === "needs" && segments[2] === "outputs") {
|
|
145
|
+
const job = segments[1] ?? "";
|
|
146
|
+
return {
|
|
147
|
+
...split,
|
|
148
|
+
outputs: {
|
|
149
|
+
...split.outputs,
|
|
150
|
+
[job]: { ...split.outputs[job], [segments[3] ?? ""]: value },
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
if (root === "github") {
|
|
155
|
+
return { ...split, github: { ...split.github, [path]: value } };
|
|
156
|
+
}
|
|
157
|
+
return FREE_ROOTS.includes(root)
|
|
158
|
+
? { ...split, inputs: { ...split.inputs, [segments[1] ?? ""]: value } }
|
|
159
|
+
: split;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Split the permissive assignment into the shapes the evaluator consumes.
|
|
163
|
+
* @param chosen - The permissive assignment
|
|
164
|
+
* @returns The `needs` outputs, `github.*` values and `inputs.*` values
|
|
165
|
+
*/
|
|
166
|
+
function splitAssignment(chosen) {
|
|
167
|
+
return Object.entries(chosen).reduce((split, entry) => routePath(split, entry), EMPTY_ASSIGNMENT);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Build the run state for one release outcome.
|
|
171
|
+
* @param job - The job under analysis
|
|
172
|
+
* @param release - The release job's id
|
|
173
|
+
* @param releaseResult - What the release job reports in this scenario
|
|
174
|
+
* @param chosen - The permissive assignment
|
|
175
|
+
* @returns A scenario the evaluator can be run against
|
|
176
|
+
*/
|
|
177
|
+
function scenarioFor(job, release, releaseResult, chosen) {
|
|
178
|
+
const { outputs, github, inputs } = splitAssignment(chosen);
|
|
179
|
+
return {
|
|
180
|
+
needs: Object.fromEntries(job.needs.map(id => [
|
|
181
|
+
id,
|
|
182
|
+
{
|
|
183
|
+
result: id === release ? releaseResult : "success",
|
|
184
|
+
outputs: outputs[id] ?? {},
|
|
185
|
+
},
|
|
186
|
+
])),
|
|
187
|
+
github,
|
|
188
|
+
inputs,
|
|
189
|
+
cancelled: false,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Decide whether the release result is what makes this job skip.
|
|
194
|
+
* @param job - The job under analysis
|
|
195
|
+
* @param release - The id of the upstream release job
|
|
196
|
+
* @returns What the two evaluations established
|
|
197
|
+
*/
|
|
198
|
+
export function releaseDependence(job, release) {
|
|
199
|
+
try {
|
|
200
|
+
const chosen = permissiveAssignment(job.ifCondition);
|
|
201
|
+
const runsWhenReleased = jobRuns(job.ifCondition, scenarioFor(job, release, "success", chosen));
|
|
202
|
+
const runsWhenFailed = jobRuns(job.ifCondition, scenarioFor(job, release, "failure", chosen));
|
|
203
|
+
return runsWhenReleased && !runsWhenFailed
|
|
204
|
+
? { kind: "skips-on-failed-release", release }
|
|
205
|
+
: { kind: "independent" };
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return {
|
|
209
|
+
kind: "unreadable",
|
|
210
|
+
reason: error.message,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Find every deploy job in one workflow that skips when its release fails.
|
|
216
|
+
* @param jobs - Every job the workflow declares
|
|
217
|
+
* @returns The deploy jobs that go silent on a failed release
|
|
218
|
+
*/
|
|
219
|
+
export function deployJobsSkippedByFailedRelease(jobs) {
|
|
220
|
+
const releases = new Set(jobs.filter(isReleaseJob).map(job => job.id));
|
|
221
|
+
return jobs.flatMap(job => {
|
|
222
|
+
if (releases.has(job.id) || !isDeployJob(job))
|
|
223
|
+
return [];
|
|
224
|
+
// Every release-like upstream, not merely the first. A deploy that needs
|
|
225
|
+
// two of them gates on ONE, and which one is not the order `needs:` happens
|
|
226
|
+
// to list. Taking the first and stopping reported `independent` whenever the
|
|
227
|
+
// gating release was listed second — the defect silently unreported, and the
|
|
228
|
+
// migration declining to repair it (CodeRabbit on CodySwannGT/lisa#3740).
|
|
229
|
+
const release = job.needs.find(id => releases.has(id) &&
|
|
230
|
+
releaseDependence(job, id).kind === "skips-on-failed-release");
|
|
231
|
+
if (release === undefined)
|
|
232
|
+
return [];
|
|
233
|
+
return [{ job, release }];
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=deploy-release-dependence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-release-dependence.js","sourceRoot":"","sources":["../../src/core/deploy-release-dependence.ts"],"names":[],"mappings":"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"}
|