@intentius/chant 0.124.39 → 0.124.40
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/component-endpoint.d.ts +20 -0
- package/dist/cli/component-endpoint.d.ts.map +1 -0
- package/dist/cli/component-endpoint.js +36 -0
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.js +10 -1
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +11 -5
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/promote.js +7 -2
- package/dist/cli/handlers/run.d.ts +4 -1
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/handlers/run.js +17 -6
- package/dist/components/auto-release.d.ts +35 -3
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/auto-release.js +29 -2
- package/dist/components/cli-support.d.ts +2 -0
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/cli-support.js +2 -0
- package/dist/components/deploy-units.d.ts.map +1 -1
- package/dist/components/deploy-units.js +5 -0
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/promote.js +39 -16
- package/dist/lifecycle/__fixtures__/publish-fakes.d.ts.map +1 -1
- package/dist/lifecycle/__fixtures__/publish-fakes.js +6 -1
- package/dist/lifecycle/publish-declaration.d.ts.map +1 -1
- package/dist/lifecycle/publish-declaration.js +4 -3
- package/dist/lifecycle/publish-npm.d.ts +2 -2
- package/dist/lifecycle/publish-npm.d.ts.map +1 -1
- package/dist/lifecycle/publish-npm.js +31 -8
- package/dist/lifecycle/release-ledger.d.ts +31 -0
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.js +19 -1
- package/dist/lifecycle/status.d.ts +5 -1
- package/dist/lifecycle/status.d.ts.map +1 -1
- package/dist/lifecycle/status.js +10 -5
- package/dist/live-endpoint.d.ts +18 -0
- package/dist/live-endpoint.d.ts.map +1 -1
- package/dist/live-endpoint.js +27 -0
- package/dist/wave-runtime.mjs +192 -192
- package/dist/workspace/ci-run.d.ts +7 -0
- package/dist/workspace/ci-run.d.ts.map +1 -1
- package/dist/workspace/ci-run.js +21 -3
- package/dist/workspace/status.d.ts +3 -1
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +3 -2
- package/dist/workspace/status.schema.json +1 -0
- package/package.json +1 -1
- package/src/cli/component-endpoint.ts +43 -0
- package/src/cli/handlers/fan-out.test.ts +10 -0
- package/src/cli/handlers/fan-out.ts +12 -0
- package/src/cli/handlers/pr-endpoint.test.ts +169 -0
- package/src/cli/handlers/pr.ts +12 -5
- package/src/cli/handlers/promote.ts +16 -2
- package/src/cli/handlers/run.test.ts +2 -1
- package/src/cli/handlers/run.ts +16 -5
- package/src/components/auto-release-infra.test.ts +131 -0
- package/src/components/auto-release.test.ts +40 -1
- package/src/components/auto-release.ts +50 -4
- package/src/components/cli-support.ts +4 -0
- package/src/components/deploy-units.ts +5 -0
- package/src/components/promote.test.ts +39 -0
- package/src/components/promote.ts +38 -14
- package/src/lifecycle/__fixtures__/publish-fakes.ts +6 -1
- package/src/lifecycle/publish-declaration.ts +4 -3
- package/src/lifecycle/publish-npm.ts +33 -8
- package/src/lifecycle/publish-targets.test.ts +36 -3
- package/src/lifecycle/release-ledger.ts +42 -1
- package/src/lifecycle/status.test.ts +19 -0
- package/src/lifecycle/status.ts +14 -6
- package/src/live-endpoint.ts +31 -0
- package/src/workspace/ci-run.test.ts +26 -0
- package/src/workspace/ci-run.ts +20 -3
- package/src/workspace/status.schema.json +1 -0
- package/src/workspace/status.ts +7 -3
|
@@ -361,6 +361,13 @@ export declare function ciJobPlace(cwd: string, top: string): {
|
|
|
361
361
|
* before anything runs when the request can't be run.
|
|
362
362
|
*/
|
|
363
363
|
export declare function ciRun(req: CiRunRequest): Promise<CiRunResult>;
|
|
364
|
+
/**
|
|
365
|
+
* The steps' environment (#4275). A job the chant runner ran gets its run's id
|
|
366
|
+
* and origin, so a release record written inside it names the run the run
|
|
367
|
+
* index lists, and none of the forge's run variables. Any other job, in place
|
|
368
|
+
* in a forge job or on this machine, never carries the runner's.
|
|
369
|
+
*/
|
|
370
|
+
export declare function ciRunStepEnv(jobEnv: Record<string, string>, origin: RunOrigin, runId: string): Record<string, string>;
|
|
364
371
|
/**
|
|
365
372
|
* Redact every text file under `dir` in place (#4096): the job's report, its
|
|
366
373
|
* change set and its component events, as `ci run` copied them out. A
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-run.d.ts","sourceRoot":"","sources":["../../src/workspace/ci-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AAMH,OAAO,EAA+E,KAAK,SAAS,EAAE,KAAK,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACpK,OAAO,EAAiE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE/H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,
|
|
1
|
+
{"version":3,"file":"ci-run.d.ts","sourceRoot":"","sources":["../../src/workspace/ci-run.ts"],"names":[],"mappings":"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"}
|
package/dist/workspace/ci-run.js
CHANGED
|
@@ -77,7 +77,7 @@ import { PR_APPLY_RECORD, PR_LOOP_REPORT_DIR, prLoopJobs, prLoopSetup, PR_LOOP_I
|
|
|
77
77
|
import { detectForge, ForgeEnvironmentError, forgeFromEnv, FORGE_KINDS } from "../pr-forge.js";
|
|
78
78
|
import { PR_APPLY_GATE } from "../pr-loop.js";
|
|
79
79
|
import { formatError, formatWarning } from "../cli/format.js";
|
|
80
|
-
import { resolveCiJob } from "../lifecycle/release-ledger.js";
|
|
80
|
+
import { CHANT_CI_RUN_FORGE_ENV, CHANT_CI_RUN_ID_ENV, FORGE_RUN_ENV, resolveCiJob } from "../lifecycle/release-ledger.js";
|
|
81
81
|
import { fetchLifecycleStatus, pushLifecycleReport } from "../lifecycle/git.js";
|
|
82
82
|
import { ACTIVITY_PROFILES } from "../op/activity-profiles.js";
|
|
83
83
|
import { shellCmd } from "../op/activities/shell.js";
|
|
@@ -570,6 +570,24 @@ function ciRunSigner(req, at) {
|
|
|
570
570
|
return say(`${RUNNER_KEY_ENV} is set, and the run will not be signed: ${message(err)}`);
|
|
571
571
|
}
|
|
572
572
|
}
|
|
573
|
+
/**
|
|
574
|
+
* The steps' environment (#4275). A job the chant runner ran gets its run's id
|
|
575
|
+
* and origin, so a release record written inside it names the run the run
|
|
576
|
+
* index lists, and none of the forge's run variables. Any other job, in place
|
|
577
|
+
* in a forge job or on this machine, never carries the runner's.
|
|
578
|
+
*/
|
|
579
|
+
export function ciRunStepEnv(jobEnv, origin, runId) {
|
|
580
|
+
const out = { ...jobEnv };
|
|
581
|
+
delete out[CHANT_CI_RUN_ID_ENV];
|
|
582
|
+
delete out[CHANT_CI_RUN_FORGE_ENV];
|
|
583
|
+
if (origin.forge !== "chant")
|
|
584
|
+
return out;
|
|
585
|
+
for (const name of FORGE_RUN_ENV)
|
|
586
|
+
delete out[name];
|
|
587
|
+
out[CHANT_CI_RUN_ID_ENV] = runId;
|
|
588
|
+
out[CHANT_CI_RUN_FORGE_ENV] = "chant";
|
|
589
|
+
return out;
|
|
590
|
+
}
|
|
573
591
|
/** Where the job runs: a fresh worktree of the commit, or with `inPlace` the checkout itself, which is left as it is. */
|
|
574
592
|
function jobCheckout(top, commit, inPlace) {
|
|
575
593
|
return inPlace ? { dir: top, remove() { } } : freshCheckout(top, commit);
|
|
@@ -592,16 +610,16 @@ async function runCiJob(req, at) {
|
|
|
592
610
|
const checkout = jobCheckout(top, commit, req.inPlace);
|
|
593
611
|
try {
|
|
594
612
|
const jobDir = place.dir === "." ? checkout.dir : join(checkout.dir, place.dir);
|
|
613
|
+
const runId = req.runId ?? `chant-${Date.now()}`;
|
|
595
614
|
const op = ciJobOp({
|
|
596
615
|
job,
|
|
597
616
|
env: req.env,
|
|
598
617
|
cwd: jobDir,
|
|
599
|
-
jobEnv,
|
|
618
|
+
jobEnv: ciRunStepEnv(jobEnv, origin, runId),
|
|
600
619
|
setup: req.inPlace ? [] : prLoopSetup(req.image ?? PR_LOOP_IMAGE),
|
|
601
620
|
build: [...(req.beforeScript ?? []), ...(job.build ?? [])],
|
|
602
621
|
...(req.chant ? { chant: req.chant } : {}),
|
|
603
622
|
});
|
|
604
|
-
const runId = req.runId ?? `chant-${Date.now()}`;
|
|
605
623
|
const warnings = [...early];
|
|
606
624
|
const resume = req.job === "apply" && req.resumeRecord ? { host: resolve(req.resumeRecord), job: join(jobDir, PR_APPLY_RECORD) } : undefined;
|
|
607
625
|
if (resume && existsSync(resume.host)) {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
* `box-isolation.ts`), so a runtime reads them instead of choosing its own.
|
|
32
32
|
*/
|
|
33
33
|
import type { CommandContext } from "../cli/registry.js";
|
|
34
|
-
import { type ReleaseRecord } from "../lifecycle/release-ledger.js";
|
|
34
|
+
import { type ReleaseDigestKind, type ReleaseRecord } from "../lifecycle/release-ledger.js";
|
|
35
35
|
import { type RevokedRelease } from "../lifecycle/release-revocation.js";
|
|
36
36
|
import { type ReleasePlan } from "../lifecycle/plan-ledger.js";
|
|
37
37
|
import { type DeployOutcome } from "../lifecycle/deploy-outcome.js";
|
|
@@ -100,6 +100,8 @@ export interface StatusRelease {
|
|
|
100
100
|
releaseLabel: string | null;
|
|
101
101
|
/** Read flags, such as `legacy-digest` (#2514). */
|
|
102
102
|
flags: string[];
|
|
103
|
+
/** What `digest` names when it is not an artifact digest (#4274): `plan`, `deploy-input` or `templates`. Absent for an artifact digest. */
|
|
104
|
+
digestKind?: ReleaseDigestKind;
|
|
103
105
|
/**
|
|
104
106
|
* The release plan `digest` names, read from `_plans/<digest>.json` on
|
|
105
107
|
* chant/lifecycle (ws-055, #2733) — the work items and evidence this
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/workspace/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/workspace/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAyC,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAChI,OAAO,EAAsF,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAC1J,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAyD,KAAK,gBAAgB,EAAqB,MAAM,gCAAgC,CAAC;AACjJ,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAqC,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAgC,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAuC,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAqD,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AACtI,OAAO,EAA2G,KAAK,aAAa,EAAe,MAAM,eAAe,CAAC;AAEzK,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,KAAK,EAAuB,aAAa,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjF,OAAO,EAAiD,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEjH,OAAO,EAAsC,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnI,OAAO,EAAwB,kBAAkB,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAIzH,4DAA4D;AAC5D,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,8EAA8E,CAAC;AAEnH,wCAAwC;AACxC,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C,gFAAgF;AAChF,eAAO,MAAM,WAAW,aAAa,CAAC;AAItC;;;GAGG;AACH,eAAO,MAAM,mBAAmB,oDAKU,CAAC;AAC3C,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,8FAA8F;AAC9F,eAAO,MAAM,wBAAwB,iFAAoB,CAAC;AAE1D,uGAAuG;AACvG,eAAO,MAAM,2BAA2B,kFAAuB,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,0NAYW,CAAC;AAC3C,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,wHAAwH;AACxH,eAAO,MAAM,WAAW,QAAsC,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,0GAA0G;IAC1G,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,wKAAwK;IACxK,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnE,kMAAkM;IAClM,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,yKAAyK;IACzK,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mDAAmD;IACnD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,2IAA2I;IAC3I,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B;;;;;;;OAOG;IACH,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED,gFAAgF;AAChF,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D;;;;;;OAMG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,iGAAiG;IACjG,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,CAAC;IACrB,+EAA+E;IAC/E,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,MAAM,EAAE;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3D;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,CAAC;AAE5E,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC;CAC/G;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/B,yEAAyE;IACzE,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,mCAAmC;IACnC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,4FAA4F;IAC5F,QAAQ,EAAE,OAAO,CAAC;IAClB,iGAAiG;IACjG,UAAU,EAAE,gBAAgB,CAAC;IAC7B,2GAA2G;IAC3G,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,6HAA6H;IAC7H,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IACtB,4HAA4H;IAC5H,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,kEAAkE;IAClE,cAAc,EAAE;QAAE,IAAI,EAAE,iBAAiB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D;;;;;;OAMG;IACH,cAAc,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IACvC;;;;;;OAMG;IACH,WAAW,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACvC;;;;;;;OAOG;IACH,YAAY,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC;CAC1C;AAED,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,4HAA4H;IAC5H,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,qHAAqH;IACrH,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,0FAA0F;IAC1F,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,kHAAkH;IAClH,KAAK,EAAE,OAAO,CAAC;IACf,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,yEAAyE;IACzE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,qBAAqB,CAAC;CACvC;AAED,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,0IAA0I;IAC1I,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACxG;;;;;;OAMG;IACH,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;CACpD;AAED,mEAAmE;AACnE,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACzE,kIAAkI;IAClI,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC;;;;;OAKG;IACH,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,0IAA0I;IAC1I,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,wHAAwH;IACxH,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,gIAAgI;IAChI,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,iHAAiH;IACjH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qIAAqI;IACrI,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,0IAA0I;IAC1I,SAAS,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,EAAE,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CAC1F;AAED,yHAAyH;AACzH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC;IAC9D,wHAAwH;IACxH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,cAAc,GACtB;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAClD,8HAA8H;IAC9H,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,mHAAmH;IACnH,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,mJAAmJ;IACnJ,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,6IAA6I;IAC7I,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,iIAAiI;IACjI,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC;;;;;;OAMG;IACH,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAC9F,GACD;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QAAE,IAAI,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC;CACnF,CAAC;AAEN,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE5G,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,iIAAiI;IACjI,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,YAAY,CAAC,EAAE,OAAO,kBAAkB,CAAC;IACzC,yGAAyG;IACzG,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC;CACvE;AA8FD,kFAAkF;AAClF,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;AAO7E,gJAAgJ;AAChJ,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnE;AAuID,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,GAAG,aAAa,CAW7F;AAED,6FAA6F;AAC7F,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CA4IjF;AAiFD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAuC7E;AAeD,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,cAAc,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,MAAM,CA0GvF"}
|
package/dist/workspace/status.js
CHANGED
|
@@ -265,6 +265,7 @@ async function readEnvironment(member, env, cwd, read, revokedOf = async () => n
|
|
|
265
265
|
releaseDigest: r.releaseDigest ?? null,
|
|
266
266
|
releaseLabel: (r.releaseDigest !== undefined ? labels.get(r.releaseDigest) : undefined) ?? null,
|
|
267
267
|
flags: [...(r.flags ?? [])],
|
|
268
|
+
...(r.digestKind ? { digestKind: r.digestKind } : {}),
|
|
268
269
|
plan: await readReleasePlan(r.digest, { cwd, prefix: planPrefix }),
|
|
269
270
|
...(await revokedItem(r, env, revokedOf, back)),
|
|
270
271
|
})));
|
|
@@ -311,8 +312,8 @@ async function supersedeRevokedGates(gates, revokedOf) {
|
|
|
311
312
|
return { ...g, state: g.state === "expired" ? g.state : "superseded", revoked: revocation };
|
|
312
313
|
}));
|
|
313
314
|
}
|
|
314
|
-
/** The digest two environments are compared on: the input side when there is one. */
|
|
315
|
-
const compareKey = (r) => r.inputDigest ?? r.digest;
|
|
315
|
+
/** The digest two environments are compared on: the input side when there is one, the commit for an apply (#4274). */
|
|
316
|
+
const compareKey = (r) => r.digestKind === "plan" || r.digestKind === "deploy-input" ? `git:${r.gitSha}` : r.inputDigest ?? r.digest;
|
|
316
317
|
export function compareEnvironments(a, b) {
|
|
317
318
|
const left = new Map(a.releases.map((r) => [r.component, r]));
|
|
318
319
|
const right = new Map(b.releases.map((r) => [r.component, r]));
|
|
@@ -1149,6 +1149,7 @@
|
|
|
1149
1149
|
"releaseDigest": { "type": ["string", "null"], "pattern": "^(?:jcs1-)?sha256:[0-9a-f]{64}$", "description": "Added in contract 1 by #4043, written by chant 0.124.29 and newer. The release this deploy was made from: the releaseDigest of _releases/<releaseDigest>.json. A promote with --release writes it, a run --components with --release writes it, and a rollback or redeploy copies it from the record it restores. Null for a deploy that named no release. With the item's environment it names the release target." },
|
|
1150
1150
|
"releaseLabel": { "type": ["string", "null"], "description": "Added in contract 1 by #4043, written by chant 0.124.29 and newer. The label that release was cut with, from _releases/cuts.jsonl. Null when releaseDigest is null, when the release has no label, and when the cuts can't be read." },
|
|
1151
1151
|
"flags": { "type": "array", "items": { "enum": ["legacy-digest"] } },
|
|
1152
|
+
"digestKind": { "enum": ["plan", "deploy-input", "templates"], "description": "Added in contract 1 by #4274, written by chant 0.124.35 and newer. What digest names when it is not an artifact digest: plan, the plan digest a pr-apply of a component that published nothing applied under its approval; deploy-input, that component's deploy-input digest when nothing planned; templates, the digest of the templates a release records for the component (#4222). Absent for an artifact digest. Compare joins a plan or deploy-input record on gitSha." },
|
|
1152
1153
|
"plan": {
|
|
1153
1154
|
"type": ["object", "null"],
|
|
1154
1155
|
"description": "The release plan digest names, read from _plans/<digest>.json on chant/lifecycle (ws-055, #2733): the work items and evidence this release shipped. Null when this checkout has no plan stored under that digest — most releases carry no plan, and a plan not yet fetched also reads null."
|
package/package.json
CHANGED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The component plan and apply paths apply the environment's declared
|
|
3
|
+
* endpoint before any capability runs (#4281), the way `--live` reads do
|
|
4
|
+
* (`../live-endpoint.ts`).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { resolve } from "node:path";
|
|
8
|
+
import { loadChantConfig, type ChantConfig } from "../config";
|
|
9
|
+
import { withEnvironmentEndpoint, type EndpointLexicon } from "../live-endpoint";
|
|
10
|
+
import { formatWarning } from "./format";
|
|
11
|
+
import { loadPlugins, resolveProjectLexicons } from "./plugins";
|
|
12
|
+
import type { CommandContext } from "./registry";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Run `run` with the declared endpoint of `environment` (default `--env`,
|
|
16
|
+
* else `local`) applied to every project lexicon's endpoint var. `config` is
|
|
17
|
+
* loaded from the working directory when not given. The project's plugins are
|
|
18
|
+
* loaded only when the environment declares an endpoint and the command did
|
|
19
|
+
* not load them; a project whose plugins can't load then stops, since running
|
|
20
|
+
* on would reach the real cloud.
|
|
21
|
+
*/
|
|
22
|
+
export async function withComponentEndpoint<T>(
|
|
23
|
+
ctx: Pick<CommandContext, "args" | "plugins">,
|
|
24
|
+
run: () => Promise<T>,
|
|
25
|
+
input: { config?: ChantConfig; environment?: string } = {},
|
|
26
|
+
): Promise<T> {
|
|
27
|
+
const projectPath = resolve(".");
|
|
28
|
+
const config = input.config ?? (await loadChantConfig(projectPath).catch(() => ({ config: {} as ChantConfig }))).config;
|
|
29
|
+
const environment = input.environment ?? ctx.args.env ?? "local";
|
|
30
|
+
const lexicons = async (): Promise<readonly EndpointLexicon[]> => {
|
|
31
|
+
if (ctx.plugins.length > 0) return ctx.plugins;
|
|
32
|
+
try {
|
|
33
|
+
return await loadPlugins(await resolveProjectLexicons(projectPath));
|
|
34
|
+
} catch (err) {
|
|
35
|
+
throw new Error(
|
|
36
|
+
`environment "${environment}" declares an endpoint, but the project's lexicons could not load to apply it: ${err instanceof Error ? err.message : String(err)}`,
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
return withEnvironmentEndpoint(config.environments, environment, lexicons, run, {
|
|
41
|
+
warn: (message) => console.error(formatWarning({ message })),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
@@ -49,6 +49,16 @@ vi.mock("../../op/gate", async () => {
|
|
|
49
49
|
});
|
|
50
50
|
const sealedGates = new Set<string>();
|
|
51
51
|
|
|
52
|
+
/**
|
|
53
|
+
* The release ledger, for the same reason (#4274): a component that publishes
|
|
54
|
+
* nothing is recorded by its deploy-input digest, and the real ledger is this
|
|
55
|
+
* repository's `chant/lifecycle`, pushed to its remote.
|
|
56
|
+
*/
|
|
57
|
+
vi.mock("../../components/auto-release", async () => {
|
|
58
|
+
const actual = await vi.importActual<typeof import("../../components/auto-release")>("../../components/auto-release");
|
|
59
|
+
return { ...actual, maybeRecordAutoRelease: async () => ({ recorded: false, reason: "opted-out" }) };
|
|
60
|
+
});
|
|
61
|
+
|
|
52
62
|
const { CapabilityRegistry } = await import("../../components/capability");
|
|
53
63
|
const { memoryGateLedgerPort } = await import("../../op/gate");
|
|
54
64
|
const { runComponentsFanOut } = await import("./fan-out");
|
|
@@ -59,6 +59,7 @@ import { deriveFanOut, fanOutRegistry } from "../../components/fan-out-support";
|
|
|
59
59
|
import { EarlierWaveNotAppliedError, runFanOut } from "../../components/fan-out-run";
|
|
60
60
|
import { readFanOutAttempt, writeFanOutAttempt, type FanOutAttempt } from "../../components/fan-out-record";
|
|
61
61
|
import { componentInputDigests, progressThatCarries } from "../../components/fan-out-inputs";
|
|
62
|
+
import { appliedDigestOf } from "../../components/auto-release";
|
|
62
63
|
import { describeChangedWave, withWaveRecord, type WaveRecord } from "../../gated-waves";
|
|
63
64
|
import { renderFanOutHuman, renderFanOutJson, renderFanOutPlan } from "../../components/fan-out-output";
|
|
64
65
|
import { ndjsonProgressSink } from "../../components/run-progress";
|
|
@@ -76,6 +77,7 @@ import { FAN_OUT_GATE_OP } from "../../op/gate-name";
|
|
|
76
77
|
import { resolveBuildRoot } from "./lifecycle";
|
|
77
78
|
import { GATED_EXIT_CODE, autoReleaseRun, recordAutoReleasesForRun } from "./run";
|
|
78
79
|
import type { CommandContext } from "../registry";
|
|
80
|
+
import { withComponentEndpoint } from "../component-endpoint";
|
|
79
81
|
|
|
80
82
|
/**
|
|
81
83
|
* The stack-level change signal, from whichever end the invocation supplied.
|
|
@@ -193,6 +195,12 @@ export async function runComponentsFanOut(ctx: CommandContext): Promise<number>
|
|
|
193
195
|
if (refusesBothStreams(args)) return 1;
|
|
194
196
|
const projectPath = resolve(".");
|
|
195
197
|
const { config } = await loadChantConfig(projectPath).catch(() => ({ config: {} as ChantConfig }));
|
|
198
|
+
// #4281: every capability the fan-out plans or runs reaches the environment's declared endpoint.
|
|
199
|
+
return withComponentEndpoint(ctx, () => fanOut(ctx, projectPath, config), { config });
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
async function fanOut(ctx: CommandContext, projectPath: string, config: ChantConfig): Promise<number> {
|
|
203
|
+
const { args } = ctx;
|
|
196
204
|
|
|
197
205
|
const paramsResolution = resolveCliBuildParams(config.buildParams, {
|
|
198
206
|
cli: parseParamFlags(args.param),
|
|
@@ -503,6 +511,10 @@ export async function runComponentsFanOut(ctx: CommandContext): Promise<number>
|
|
|
503
511
|
release.runId,
|
|
504
512
|
resolveAutoReleaseDisabled(config, args.noReleaseRecord),
|
|
505
513
|
release.runOrigin,
|
|
514
|
+
undefined,
|
|
515
|
+
undefined,
|
|
516
|
+
// #4274: a component that publishes nothing is recorded by its deploy-input digest.
|
|
517
|
+
appliedDigestOf({ components: derived.components, env: args.env ?? "local", projectRoot: projectPath }),
|
|
506
518
|
);
|
|
507
519
|
}
|
|
508
520
|
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant components pr-plan` for an environment that declares an endpoint
|
|
3
|
+
* (#4281): every request a capability's plan sends goes to that endpoint and
|
|
4
|
+
* no other host, the way a `--live` read does (`../../live-endpoint.ts`).
|
|
5
|
+
*
|
|
6
|
+
* The capability stands in for azure's `arm-deploy`, gcp's `gcp-apply` and
|
|
7
|
+
* aws's `cfn-deploy`: its plan reads the endpoint from its lexicon's ambient
|
|
8
|
+
* var, else the real cloud's host, and sends a request through `fetch`, which
|
|
9
|
+
* is replaced here and only records. Nothing leaves the process. Git, the
|
|
10
|
+
* change signal, the derivation and the gate ledger are fakes, and the
|
|
11
|
+
* lifecycle branch can't be pushed.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
15
|
+
import { tmpdir } from "node:os";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
18
|
+
import type { DriverComponent } from "../../components/driver";
|
|
19
|
+
import type { DeployContext } from "../../components/capability";
|
|
20
|
+
import type { EmulatorCapability } from "../../op/emulator-lifecycle";
|
|
21
|
+
import type { ParsedArgs } from "../registry";
|
|
22
|
+
|
|
23
|
+
const HEAD = "a".repeat(40);
|
|
24
|
+
const BASE = "b".repeat(40);
|
|
25
|
+
const EMULATOR = "http://localhost:4566";
|
|
26
|
+
const REAL_CLOUD = "https://management.fakecloud.example";
|
|
27
|
+
const ENDPOINT_VAR = "FAKECLOUD_ENDPOINT_URL";
|
|
28
|
+
|
|
29
|
+
vi.mock("../../components/changed-files", () => ({
|
|
30
|
+
resolveCommit: async () => HEAD,
|
|
31
|
+
resolveMergeBase: async () => BASE,
|
|
32
|
+
}));
|
|
33
|
+
|
|
34
|
+
vi.mock("../../config", async () => {
|
|
35
|
+
const actual = await vi.importActual<typeof import("../../config")>("../../config");
|
|
36
|
+
return {
|
|
37
|
+
...actual,
|
|
38
|
+
loadChantConfig: async () => ({
|
|
39
|
+
config: { environments: [{ name: "floci", endpoint: EMULATOR }, { name: "prod" }] },
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
vi.mock("./fan-out", () => ({
|
|
45
|
+
resolveChangedUnits: async () => ({ units: { changed: ["net"], indeterminate: [] } }),
|
|
46
|
+
}));
|
|
47
|
+
|
|
48
|
+
vi.mock("../../lifecycle/gate-change-set", () => ({
|
|
49
|
+
storeGateChangeSet: async () => ({ written: false }),
|
|
50
|
+
readGraphIds: async () => ({ ids: [] }),
|
|
51
|
+
setGraphIdReader: () => {},
|
|
52
|
+
gateGraphReader: () => async () => ({ ids: [] }),
|
|
53
|
+
}));
|
|
54
|
+
vi.mock("../../lifecycle/git", async () => {
|
|
55
|
+
const actual = await vi.importActual<typeof import("../../lifecycle/git")>("../../lifecycle/git");
|
|
56
|
+
return { ...actual, pushLifecycleReport: async () => { throw new Error("pr-endpoint.test must not push chant/lifecycle"); } };
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
vi.mock("./run", () => ({
|
|
60
|
+
GATED_EXIT_CODE: 3,
|
|
61
|
+
autoReleaseRun: (id: string) => ({ runId: id, runOrigin: { forge: "local" } }),
|
|
62
|
+
recordAutoReleasesForRun: async () => [],
|
|
63
|
+
}));
|
|
64
|
+
|
|
65
|
+
vi.mock("../../op/gate", async () => {
|
|
66
|
+
const actual = await vi.importActual<typeof import("../../op/gate")>("../../op/gate");
|
|
67
|
+
return { ...actual, gitGateLedgerPort: () => actual.memoryGateLedgerPort(), gateIsSealed: async () => false };
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
vi.mock("../../components/fan-out-support", async () => {
|
|
71
|
+
const { CapabilityRegistry } = await import("../../components/capability");
|
|
72
|
+
const { planFanOut } = await import("../../components/fan-out");
|
|
73
|
+
const { computePlanDigest } = await import("../../lifecycle/plan-digest");
|
|
74
|
+
const registry = new CapabilityRegistry();
|
|
75
|
+
registry.register({
|
|
76
|
+
kind: "fakecloud-deploy",
|
|
77
|
+
async plan(_ctx: DeployContext, input: { root: string }) {
|
|
78
|
+
// What arm-deploy, gcp-apply and cfn-deploy do: the ambient var, else the real host.
|
|
79
|
+
const base = process.env[ENDPOINT_VAR] ?? REAL_CLOUD;
|
|
80
|
+
await fetch(`${base}/deployments/${input.root}`);
|
|
81
|
+
const planDigest = computePlanDigest("fakecloud-deploy", { root: input.root });
|
|
82
|
+
return {
|
|
83
|
+
member: input.root,
|
|
84
|
+
planDigest,
|
|
85
|
+
artifact: { planDigest },
|
|
86
|
+
changeSet: { member: { member: input.root, lexicon: "fakecloud", planner: "fakecloud", status: "planned", planDigest, holes: [] }, entries: [] },
|
|
87
|
+
};
|
|
88
|
+
},
|
|
89
|
+
async outputs() {
|
|
90
|
+
return {};
|
|
91
|
+
},
|
|
92
|
+
async run() {
|
|
93
|
+
throw new Error("pr-plan must not apply");
|
|
94
|
+
},
|
|
95
|
+
} as never);
|
|
96
|
+
const component = (name: string, dependsOn: string[] = []): DriverComponent => ({
|
|
97
|
+
name,
|
|
98
|
+
dependsOn,
|
|
99
|
+
deploy: [{ phase: "Apply", steps: [{ kind: "fakecloud-deploy", root: name }] }],
|
|
100
|
+
});
|
|
101
|
+
const estate = [component("net"), component("app", ["net"])];
|
|
102
|
+
return {
|
|
103
|
+
fanOutRegistry: async () => registry,
|
|
104
|
+
deriveFanOut: async () => ({
|
|
105
|
+
success: true,
|
|
106
|
+
components: estate,
|
|
107
|
+
plan: planFanOut({ components: estate, changed: ["net"] }),
|
|
108
|
+
signal: { changed: ["net"], indeterminate: [], unclaimed: [] },
|
|
109
|
+
}),
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
/** The lexicon plugin, declaring its endpoint var through its emulator as aws, azure and gcp do. */
|
|
114
|
+
const emulator: EmulatorCapability = {
|
|
115
|
+
spec: { name: "chant-fakecloud", image: "fakecloud:0", containerPort: 4566, healthPath: "/health" },
|
|
116
|
+
env: (endpoint) => ({ [ENDPOINT_VAR]: endpoint, FAKECLOUD_ACCESS_KEY: "test" }),
|
|
117
|
+
};
|
|
118
|
+
const plugins = [{ name: "fakecloud", emulator }];
|
|
119
|
+
|
|
120
|
+
const { runComponentsPrPlan } = await import("./pr");
|
|
121
|
+
|
|
122
|
+
let dir: string;
|
|
123
|
+
let hosts: string[];
|
|
124
|
+
|
|
125
|
+
const ctx = (env: string) =>
|
|
126
|
+
({
|
|
127
|
+
args: { command: "components", path: "pr-plan", format: "", fix: false, watch: false, verbose: false, help: false, live: false, base: "main", env, output: dir, pr: 7 } as ParsedArgs,
|
|
128
|
+
plugins,
|
|
129
|
+
}) as never;
|
|
130
|
+
|
|
131
|
+
beforeEach(async () => {
|
|
132
|
+
dir = await mkdtemp(join(tmpdir(), "pr-endpoint-"));
|
|
133
|
+
hosts = [];
|
|
134
|
+
delete process.env[ENDPOINT_VAR];
|
|
135
|
+
vi.stubGlobal("fetch", vi.fn(async (url: string | URL) => {
|
|
136
|
+
hosts.push(new URL(String(url)).host);
|
|
137
|
+
return new Response("{}", { status: 200 });
|
|
138
|
+
}));
|
|
139
|
+
vi.spyOn(console, "error").mockImplementation(() => {});
|
|
140
|
+
vi.spyOn(console, "log").mockImplementation(() => {});
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
afterEach(async () => {
|
|
144
|
+
vi.unstubAllGlobals();
|
|
145
|
+
vi.restoreAllMocks();
|
|
146
|
+
delete process.env[ENDPOINT_VAR];
|
|
147
|
+
await rm(dir, { recursive: true, force: true });
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
describe("pr-plan against an environment that declares an endpoint (#4281)", () => {
|
|
151
|
+
test("every plan request goes to the declared endpoint and no other host, and the var is restored after", async () => {
|
|
152
|
+
expect(await runComponentsPrPlan(ctx("floci"))).toBe(0);
|
|
153
|
+
expect(hosts.length).toBe(2);
|
|
154
|
+
expect(new Set(hosts)).toEqual(new Set(["localhost:4566"]));
|
|
155
|
+
expect(process.env[ENDPOINT_VAR]).toBeUndefined();
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test("an environment with no endpoint is left to the capability's own default", async () => {
|
|
159
|
+
expect(await runComponentsPrPlan(ctx("prod"))).toBe(0);
|
|
160
|
+
expect(new Set(hosts)).toEqual(new Set([new URL(REAL_CLOUD).host]));
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test("an ambient var already set wins over the declared endpoint", async () => {
|
|
164
|
+
process.env[ENDPOINT_VAR] = "http://127.0.0.1:9999";
|
|
165
|
+
expect(await runComponentsPrPlan(ctx("floci"))).toBe(0);
|
|
166
|
+
expect(new Set(hosts)).toEqual(new Set(["127.0.0.1:9999"]));
|
|
167
|
+
expect(process.env[ENDPOINT_VAR]).toBe("http://127.0.0.1:9999");
|
|
168
|
+
});
|
|
169
|
+
});
|
package/src/cli/handlers/pr.ts
CHANGED
|
@@ -118,7 +118,9 @@ import { findWorkspaceRoot } from "../../project-root";
|
|
|
118
118
|
import { resolveChangedUnits } from "./fan-out";
|
|
119
119
|
import { coverByMerges, greenOp, type GreenTarget } from "../../components/green-cover";
|
|
120
120
|
import { GATED_EXIT_CODE, autoReleaseRun, recordAutoReleasesForRun } from "./run";
|
|
121
|
+
import { appliedDigestOf } from "../../components/auto-release";
|
|
121
122
|
import type { CommandContext } from "../registry";
|
|
123
|
+
import { withComponentEndpoint } from "../component-endpoint";
|
|
122
124
|
import type { ComponentChangeSignal, FanOutPlan } from "../../components/fan-out";
|
|
123
125
|
import { failedRunExitCode, type DriverComponent } from "../../components/driver";
|
|
124
126
|
import type { CapabilityRegistry } from "../../components/capability";
|
|
@@ -421,7 +423,7 @@ function openUpload(events: StageEvents, stage: "plan" | "apply" | "record", pr:
|
|
|
421
423
|
/** chant components pr-plan --base <ref> --pr <n> [--env <env>] [--gate <name>] [--forge <kind>] [--output <dir>] [--json] [--events-json] [--report-url <url>] */
|
|
422
424
|
export function runComponentsPrPlan(ctx: CommandContext): Promise<number> {
|
|
423
425
|
if (refusesEventsWithJson(ctx.args, "the stage's report")) return Promise.resolve(1);
|
|
424
|
-
return withStageEvents("pr-plan", ctx, (events) => prPlan(ctx, events));
|
|
426
|
+
return withStageEvents("pr-plan", ctx, (events) => withComponentEndpoint(ctx, () => prPlan(ctx, events)));
|
|
425
427
|
}
|
|
426
428
|
|
|
427
429
|
async function prPlan(ctx: CommandContext, stage: StageEvents): Promise<number> {
|
|
@@ -482,7 +484,7 @@ async function prPlan(ctx: CommandContext, stage: StageEvents): Promise<number>
|
|
|
482
484
|
/** chant components pr-apply --base <ref> [--pr <n>] [--env <env>] [--gate <name>] [--forge <kind>] [--require-review] [--output <dir>] [--json] [--events-json] [--report-url <url>] */
|
|
483
485
|
export function runComponentsPrApply(ctx: CommandContext): Promise<number> {
|
|
484
486
|
if (refusesEventsWithJson(ctx.args, "the stage's report")) return Promise.resolve(1);
|
|
485
|
-
return withStageEvents("pr-apply", ctx, (events) => prApply(ctx, events));
|
|
487
|
+
return withStageEvents("pr-apply", ctx, (events) => withComponentEndpoint(ctx, () => prApply(ctx, events)));
|
|
486
488
|
}
|
|
487
489
|
|
|
488
490
|
async function prApply(ctx: CommandContext, stage: StageEvents): Promise<number> {
|
|
@@ -695,7 +697,7 @@ async function prApply(ctx: CommandContext, stage: StageEvents): Promise<number>
|
|
|
695
697
|
: {}),
|
|
696
698
|
});
|
|
697
699
|
recordAttempt();
|
|
698
|
-
await recordAutoReleasesForRun(applied.run.results, p.env, release.runId, resolveAutoReleaseDisabled(p.config, args.noReleaseRecord), release.runOrigin);
|
|
700
|
+
await recordAutoReleasesForRun(applied.run.results, p.env, release.runId, resolveAutoReleaseDisabled(p.config, args.noReleaseRecord), release.runOrigin, undefined, undefined, prAppliedDigests(p, applied.members));
|
|
699
701
|
const report = prReport({
|
|
700
702
|
...base,
|
|
701
703
|
approval,
|
|
@@ -715,10 +717,15 @@ async function prApply(ctx: CommandContext, stage: StageEvents): Promise<number>
|
|
|
715
717
|
return code;
|
|
716
718
|
}
|
|
717
719
|
|
|
720
|
+
/** #4274: a component that published nothing is recorded by the plan digest its approval bound. */
|
|
721
|
+
function prAppliedDigests(p: Prepared, members: PrMember[]) {
|
|
722
|
+
return appliedDigestOf({ components: p.components, env: p.env, projectRoot: resolve("."), members });
|
|
723
|
+
}
|
|
724
|
+
|
|
718
725
|
/** chant components pr-record --base <ref> [--pr <n>] [--env <env>] [--gate <name>] [--forge <kind>] [--output <dir>] [--json] [--events-json] [--report-url <url>] */
|
|
719
726
|
export function runComponentsPrRecord(ctx: CommandContext): Promise<number> {
|
|
720
727
|
if (refusesEventsWithJson(ctx.args, "the stage's report")) return Promise.resolve(1);
|
|
721
|
-
return withStageEvents("pr-record", ctx, (events) => prRecord(ctx, events));
|
|
728
|
+
return withStageEvents("pr-record", ctx, (events) => withComponentEndpoint(ctx, () => prRecord(ctx, events)));
|
|
722
729
|
}
|
|
723
730
|
|
|
724
731
|
/**
|
|
@@ -1485,7 +1492,7 @@ async function prApplyWaves(
|
|
|
1485
1492
|
if (outputs) outputsSoFar[name] = outputs;
|
|
1486
1493
|
}
|
|
1487
1494
|
setWave({ ...entry, status: applied.status === "applied" ? "applied" : "failed" });
|
|
1488
|
-
await recordAutoReleasesForRun(applied.run.results, p.env, at.release.runId, resolveAutoReleaseDisabled(p.config, args.noReleaseRecord), at.release.runOrigin);
|
|
1495
|
+
await recordAutoReleasesForRun(applied.run.results, p.env, at.release.runId, resolveAutoReleaseDisabled(p.config, args.noReleaseRecord), at.release.runOrigin, undefined, undefined, prAppliedDigests(p, applied.members));
|
|
1489
1496
|
if (applied.status !== "applied") {
|
|
1490
1497
|
return stop(report({ status: "failed" }), failedRunExitCode(applied.run.results), applied.run.status === "gated" ? "gated" : undefined);
|
|
1491
1498
|
}
|
|
@@ -68,6 +68,7 @@ import { resolveCliBuildParams, parseParamFlags } from "../build-params-cli";
|
|
|
68
68
|
import { formatError, formatWarning, formatSuccess, formatBold, formatInfo } from "../format";
|
|
69
69
|
import { GATED_EXIT_CODE } from "./run";
|
|
70
70
|
import type { CommandContext } from "../registry";
|
|
71
|
+
import { withComponentEndpoint } from "../component-endpoint";
|
|
71
72
|
import { redeployLine, releaseRollbackLine, rollbackTarget, unsettledComponents } from "../../lifecycle/mixed-environment";
|
|
72
73
|
|
|
73
74
|
const PROMOTE_USAGE =
|
|
@@ -390,7 +391,20 @@ function approvalLine(r: import("../../lifecycle/merge-record").MergeRecord): st
|
|
|
390
391
|
* which differ only in how the plan was chosen, whether the publish step runs,
|
|
391
392
|
* and which field names the earlier release on the new record.
|
|
392
393
|
*/
|
|
393
|
-
|
|
394
|
+
/** {@link deployPlanIn}, with `plan.to`'s declared endpoint applied (#4281). */
|
|
395
|
+
function deployPlan(
|
|
396
|
+
ctx: CommandContext,
|
|
397
|
+
verb: Verb,
|
|
398
|
+
plan: PromotionPlan,
|
|
399
|
+
project: { projectPath: string; config: ChantConfig; targets: DriverComponent[] },
|
|
400
|
+
actor: string | undefined,
|
|
401
|
+
record: (item: PromotionItem, env: string, run: DeployRunInfo) => ReleaseRecordInput,
|
|
402
|
+
under?: UnderRelease,
|
|
403
|
+
): Promise<number> {
|
|
404
|
+
return withComponentEndpoint(ctx, () => deployPlanIn(ctx, verb, plan, project, actor, record, under), { config: project.config, environment: plan.to });
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
async function deployPlanIn(
|
|
394
408
|
ctx: CommandContext,
|
|
395
409
|
verb: Verb,
|
|
396
410
|
plan: PromotionPlan,
|
|
@@ -661,7 +675,7 @@ async function deployPlan(
|
|
|
661
675
|
const admission = gateAdmission(result);
|
|
662
676
|
const input = record(item, plan.to, { runId, ...(runOrigin ? { runOrigin } : {}), actor: actor!, timestamp, ...(approver ? { approver } : {}), ...(admission ? { admission } : {}) });
|
|
663
677
|
const templates = templateDigests.get(item.component);
|
|
664
|
-
const { record: written } = await appendReleaseRecord(under ? { ...input, ...(templates ? { digest: templates } : {}), releaseDigest: under.release.releaseDigest } : input);
|
|
678
|
+
const { record: written } = await appendReleaseRecord(under ? { ...input, ...(templates ? { digest: templates, digestKind: "templates" as const } : {}), releaseDigest: under.release.releaseDigest } : input);
|
|
665
679
|
recorded.push(written);
|
|
666
680
|
}
|
|
667
681
|
if (outcome) await appendDeployOutcome(outcome);
|
|
@@ -46,7 +46,8 @@ vi.mock("../../config", async () => {
|
|
|
46
46
|
const actual = await vi.importActual<typeof import("../../config")>("../../config");
|
|
47
47
|
return { ...actual, loadChantConfig: (...args: unknown[]) => loadChantConfigMock(...args) };
|
|
48
48
|
});
|
|
49
|
-
vi.mock("../../components/auto-release", () => ({
|
|
49
|
+
vi.mock("../../components/auto-release", async () => ({
|
|
50
|
+
...(await vi.importActual<typeof import("../../components/auto-release")>("../../components/auto-release")),
|
|
50
51
|
maybeRecordAutoRelease: (...args: unknown[]) => maybeRecordAutoReleaseMock(...args),
|
|
51
52
|
}));
|
|
52
53
|
vi.mock("../../components/manifest-persistence", () => ({
|