@intentius/chant 0.124.28 → 0.124.29
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/build-params.d.ts +34 -1
- package/dist/build-params.d.ts.map +1 -1
- package/dist/build-params.js +31 -1
- package/dist/change-set-graph.d.ts +8 -1
- package/dist/change-set-graph.d.ts.map +1 -1
- package/dist/change-set-graph.js +4 -2
- package/dist/change-set.d.ts +10 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +4 -3
- package/dist/cli/build-params-cli.d.ts +7 -1
- package/dist/cli/build-params-cli.d.ts.map +1 -1
- package/dist/cli/build-params-cli.js +17 -8
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +6 -3
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +45 -0
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +15 -4
- package/dist/cli/handlers/fan-out.d.ts +9 -0
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.js +40 -3
- package/dist/cli/handlers/lifecycle-gc.d.ts +19 -0
- package/dist/cli/handlers/lifecycle-gc.d.ts.map +1 -0
- package/dist/cli/handlers/lifecycle-gc.js +143 -0
- package/dist/cli/handlers/pr.d.ts +11 -3
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +134 -26
- package/dist/cli/handlers/promote.d.ts +7 -0
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/promote.js +210 -33
- package/dist/cli/handlers/release.d.ts +62 -5
- package/dist/cli/handlers/release.d.ts.map +1 -1
- package/dist/cli/handlers/release.js +414 -28
- package/dist/cli/handlers/run.d.ts +11 -1
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/handlers/run.js +67 -6
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +61 -10
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +24 -2
- package/dist/cli/registry.d.ts +15 -3
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/run-events.d.ts +3 -2
- package/dist/cli/run-events.d.ts.map +1 -1
- package/dist/cli/run-events.js +5 -3
- package/dist/components/auto-release.d.ts +2 -0
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/auto-release.js +1 -0
- package/dist/components/capability.d.ts +9 -0
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/driver.d.ts +8 -0
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +35 -0
- package/dist/components/fan-out-inputs.d.ts +69 -0
- package/dist/components/fan-out-inputs.d.ts.map +1 -0
- package/dist/components/fan-out-inputs.js +169 -0
- package/dist/components/fan-out-record.d.ts +13 -0
- package/dist/components/fan-out-record.d.ts.map +1 -1
- package/dist/components/fan-out-record.js +16 -0
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-run.js +50 -0
- package/dist/components/fan-out.d.ts +4 -0
- package/dist/components/fan-out.d.ts.map +1 -1
- package/dist/components/pr-pipeline.d.ts +25 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +22 -4
- package/dist/components/promote.d.ts +23 -0
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/promote.js +60 -2
- package/dist/components/release-compile.d.ts +9 -0
- package/dist/components/release-compile.d.ts.map +1 -1
- package/dist/components/release-compile.js +9 -3
- package/dist/components/release-gate.d.ts +11 -1
- package/dist/components/release-gate.d.ts.map +1 -1
- package/dist/components/release-gate.js +10 -4
- package/dist/components/wave-plan.d.ts +5 -0
- package/dist/components/wave-plan.d.ts.map +1 -1
- package/dist/components/wave-plan.js +10 -2
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/flag-params.d.ts +54 -0
- package/dist/flag-params.d.ts.map +1 -0
- package/dist/flag-params.js +130 -0
- package/dist/lifecycle/__fixtures__/publish-fakes.d.ts +120 -0
- package/dist/lifecycle/__fixtures__/publish-fakes.d.ts.map +1 -0
- package/dist/lifecycle/__fixtures__/publish-fakes.js +304 -0
- package/dist/lifecycle/change-set-store.d.ts +2 -1
- package/dist/lifecycle/change-set-store.d.ts.map +1 -1
- package/dist/lifecycle/change-set-store.js +2 -1
- package/dist/lifecycle/delivery-metrics.d.ts +139 -0
- package/dist/lifecycle/delivery-metrics.d.ts.map +1 -0
- package/dist/lifecycle/delivery-metrics.js +145 -0
- package/dist/lifecycle/deploy-outcome.d.ts +81 -0
- package/dist/lifecycle/deploy-outcome.d.ts.map +1 -0
- package/dist/lifecycle/deploy-outcome.js +101 -0
- package/dist/lifecycle/gate-change-set.d.ts +10 -1
- package/dist/lifecycle/gate-change-set.d.ts.map +1 -1
- package/dist/lifecycle/gate-change-set.js +35 -3
- package/dist/lifecycle/gate-ledger.d.ts +2 -3
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts +30 -1
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/git.js +31 -5
- package/dist/lifecycle/index.d.ts +4 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +4 -0
- package/dist/lifecycle/mixed-environment.d.ts +95 -0
- package/dist/lifecycle/mixed-environment.d.ts.map +1 -0
- package/dist/lifecycle/mixed-environment.js +154 -0
- package/dist/lifecycle/publish-attachments.d.ts +79 -0
- package/dist/lifecycle/publish-attachments.d.ts.map +1 -0
- package/dist/lifecycle/publish-attachments.js +179 -0
- package/dist/lifecycle/publish-credentials.d.ts +37 -0
- package/dist/lifecycle/publish-credentials.d.ts.map +1 -0
- package/dist/lifecycle/publish-credentials.js +69 -0
- package/dist/lifecycle/publish-declaration.d.ts +97 -0
- package/dist/lifecycle/publish-declaration.d.ts.map +1 -0
- package/dist/lifecycle/publish-declaration.js +83 -0
- package/dist/lifecycle/publish-forge.d.ts +53 -0
- package/dist/lifecycle/publish-forge.d.ts.map +1 -0
- package/dist/lifecycle/publish-forge.js +298 -0
- package/dist/lifecycle/publish-npm.d.ts +61 -0
- package/dist/lifecycle/publish-npm.d.ts.map +1 -0
- package/dist/lifecycle/publish-npm.js +242 -0
- package/dist/lifecycle/publish-oci.d.ts +64 -0
- package/dist/lifecycle/publish-oci.d.ts.map +1 -0
- package/dist/lifecycle/publish-oci.js +383 -0
- package/dist/lifecycle/publish-record.d.ts +66 -0
- package/dist/lifecycle/publish-record.d.ts.map +1 -0
- package/dist/lifecycle/publish-record.js +84 -0
- package/dist/lifecycle/publish-targets.d.ts +45 -0
- package/dist/lifecycle/publish-targets.d.ts.map +1 -0
- package/dist/lifecycle/publish-targets.js +85 -0
- package/dist/lifecycle/release-cut.d.ts +48 -1
- package/dist/lifecycle/release-cut.d.ts.map +1 -1
- package/dist/lifecycle/release-cut.js +116 -23
- package/dist/lifecycle/release-join.d.ts +95 -0
- package/dist/lifecycle/release-join.d.ts.map +1 -0
- package/dist/lifecycle/release-join.js +139 -0
- package/dist/lifecycle/release-publish.d.ts +312 -0
- package/dist/lifecycle/release-publish.d.ts.map +1 -0
- package/dist/lifecycle/release-publish.js +335 -0
- package/dist/lifecycle/release-revocation.d.ts +80 -0
- package/dist/lifecycle/release-revocation.d.ts.map +1 -0
- package/dist/lifecycle/release-revocation.js +123 -0
- package/dist/lifecycle/release-store.d.ts +12 -2
- package/dist/lifecycle/release-store.d.ts.map +1 -1
- package/dist/lifecycle/release-store.js +4 -2
- package/dist/lifecycle/release-verify.d.ts +61 -0
- package/dist/lifecycle/release-verify.d.ts.map +1 -0
- package/dist/lifecycle/release-verify.js +92 -0
- package/dist/lifecycle/release-workstation.d.ts +91 -0
- package/dist/lifecycle/release-workstation.d.ts.map +1 -0
- package/dist/lifecycle/release-workstation.js +180 -0
- package/dist/lifecycle/retention-policy.d.ts +45 -0
- package/dist/lifecycle/retention-policy.d.ts.map +1 -0
- package/dist/lifecycle/retention-policy.js +43 -0
- package/dist/lifecycle/retention.d.ts +185 -0
- package/dist/lifecycle/retention.d.ts.map +1 -0
- package/dist/lifecycle/retention.js +400 -0
- package/dist/plan-summary.d.ts.map +1 -1
- package/dist/plan-summary.js +8 -2
- package/dist/pr-loop.d.ts +7 -0
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +23 -4
- package/dist/pr-report-url.d.ts +82 -0
- package/dist/pr-report-url.d.ts.map +1 -0
- package/dist/pr-report-url.js +174 -0
- package/dist/provenance.d.ts +2 -2
- package/dist/provenance.d.ts.map +1 -1
- package/dist/run-event-store.d.ts +29 -2
- package/dist/run-event-store.d.ts.map +1 -1
- package/dist/run-event-store.js +50 -3
- package/dist/run-event-stream.d.ts +2 -1
- package/dist/run-event-stream.d.ts.map +1 -1
- package/dist/run-event-stream.js +5 -1
- package/dist/run-event.d.ts +19 -1
- package/dist/run-event.d.ts.map +1 -1
- package/dist/run-event.js +2 -0
- package/dist/wave-runtime.mjs +260 -229
- package/dist/workspace/__fixtures__/flag-workspace.d.ts +31 -0
- package/dist/workspace/__fixtures__/flag-workspace.d.ts.map +1 -0
- package/dist/workspace/__fixtures__/flag-workspace.js +114 -0
- package/dist/workspace/change-set.schema.json +5 -1
- package/dist/workspace/check.schema.json +4 -2
- package/dist/workspace/checks/records.d.ts +9 -1
- package/dist/workspace/checks/records.d.ts.map +1 -1
- package/dist/workspace/checks/records.js +35 -1
- package/dist/workspace/checks.d.ts +1 -0
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +2 -1
- package/dist/workspace/ci-green.d.ts +8 -0
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +10 -3
- package/dist/workspace/declaration.d.ts +16 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +26 -0
- package/dist/workspace/declaration.schema.json +64 -0
- package/dist/workspace/declared-kinds.d.ts +16 -0
- package/dist/workspace/declared-kinds.d.ts.map +1 -1
- package/dist/workspace/declared-kinds.js +25 -0
- package/dist/workspace/delivery-metrics.d.ts +91 -0
- package/dist/workspace/delivery-metrics.d.ts.map +1 -0
- package/dist/workspace/delivery-metrics.js +217 -0
- package/dist/workspace/delivery-metrics.schema.json +519 -0
- package/dist/workspace/flags-read.d.ts +37 -0
- package/dist/workspace/flags-read.d.ts.map +1 -0
- package/dist/workspace/flags-read.js +103 -0
- package/dist/workspace/flags.d.ts +100 -0
- package/dist/workspace/flags.d.ts.map +1 -0
- package/dist/workspace/flags.js +98 -0
- package/dist/workspace/graph-cli.js +1 -1
- package/dist/workspace/intent-cli.d.ts +11 -2
- package/dist/workspace/intent-cli.d.ts.map +1 -1
- package/dist/workspace/intent-cli.js +54 -5
- package/dist/workspace/intent-trace.d.ts +219 -0
- package/dist/workspace/intent-trace.d.ts.map +1 -0
- package/dist/workspace/intent-trace.js +314 -0
- package/dist/workspace/intent.d.ts +30 -6
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/intent.js +141 -21
- package/dist/workspace/intent.schema.json +702 -6
- package/dist/workspace/overlap.d.ts +146 -0
- package/dist/workspace/overlap.d.ts.map +1 -0
- package/dist/workspace/overlap.js +276 -0
- package/dist/workspace/reason-codes.d.ts +2 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +3 -0
- package/dist/workspace/records.d.ts +15 -2
- package/dist/workspace/records.d.ts.map +1 -1
- package/dist/workspace/records.js +32 -0
- package/dist/workspace/records.schema.json +21 -2
- package/dist/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
- package/dist/workspace/reference-kinds/flag/flag.schema.json +53 -0
- package/dist/workspace/releases.d.ts +9 -0
- package/dist/workspace/releases.d.ts.map +1 -1
- package/dist/workspace/releases.js +9 -0
- package/dist/workspace/releases.schema.json +123 -1
- package/dist/workspace/run-event.schema.json +10 -3
- package/dist/workspace/status-gates.d.ts +8 -0
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status.d.ts +78 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +170 -3
- package/dist/workspace/status.schema.json +198 -1
- package/dist/workspace/wip.d.ts.map +1 -1
- package/dist/workspace/wip.js +11 -3
- package/package.json +1 -1
- package/src/build-params.test.ts +46 -0
- package/src/build-params.ts +55 -1
- package/src/change-set-graph.ts +10 -2
- package/src/change-set.ts +14 -3
- package/src/cli/build-params-cli.ts +22 -9
- package/src/cli/commands/build.ts +6 -3
- package/src/cli/handlers/approve-release.test.ts +5 -1
- package/src/cli/handlers/approve-revoked.test.ts +155 -0
- package/src/cli/handlers/approve.ts +47 -0
- package/src/cli/handlers/build.test.ts +15 -0
- package/src/cli/handlers/build.ts +17 -4
- package/src/cli/handlers/fan-out.test.ts +180 -1
- package/src/cli/handlers/fan-out.ts +38 -3
- package/src/cli/handlers/intent-trace.e2e.test.ts +201 -0
- package/src/cli/handlers/lifecycle-gc.test.ts +126 -0
- package/src/cli/handlers/lifecycle-gc.ts +146 -0
- package/src/cli/handlers/pr.test.ts +148 -1
- package/src/cli/handlers/pr.ts +139 -28
- package/src/cli/handlers/promote.test.ts +280 -2
- package/src/cli/handlers/promote.ts +210 -34
- package/src/cli/handlers/release-implicit.e2e.test.ts +12 -4
- package/src/cli/handlers/release-join.e2e.test.ts +185 -0
- package/src/cli/handlers/release-publish-targets.e2e.test.ts +295 -0
- package/src/cli/handlers/release-verify.e2e.test.ts +117 -0
- package/src/cli/handlers/release-workstation-ci.e2e.test.ts +135 -0
- package/src/cli/handlers/release.e2e.test.ts +146 -32
- package/src/cli/handlers/release.ts +415 -28
- package/src/cli/handlers/run-auto-release.test.ts +9 -0
- package/src/cli/handlers/run-release.test.ts +55 -0
- package/src/cli/handlers/run.ts +69 -5
- package/src/cli/main.test.ts +1 -0
- package/src/cli/main.ts +61 -10
- package/src/cli/parse-args.ts +19 -2
- package/src/cli/registry.ts +15 -3
- package/src/cli/run-events.ts +5 -2
- package/src/components/auto-release.test.ts +9 -0
- package/src/components/auto-release.ts +3 -0
- package/src/components/capability.ts +9 -0
- package/src/components/driver.test.ts +24 -0
- package/src/components/driver.ts +36 -0
- package/src/components/fan-out-inputs.test.ts +85 -0
- package/src/components/fan-out-inputs.ts +192 -0
- package/src/components/fan-out-record.test.ts +10 -0
- package/src/components/fan-out-record.ts +19 -0
- package/src/components/fan-out-run.ts +48 -0
- package/src/components/fan-out.ts +4 -0
- package/src/components/pr-pipeline.ts +35 -4
- package/src/components/promote.ts +68 -2
- package/src/components/release-compile.ts +17 -3
- package/src/components/release-gate.ts +18 -4
- package/src/components/wave-plan.ts +15 -2
- package/src/config.ts +8 -0
- package/src/flag-params.test.ts +144 -0
- package/src/flag-params.ts +134 -0
- package/src/lifecycle/__fixtures__/publish-fakes.ts +351 -0
- package/src/lifecycle/change-set-store.ts +2 -1
- package/src/lifecycle/delivery-metrics.ts +263 -0
- package/src/lifecycle/deploy-outcome.ts +147 -0
- package/src/lifecycle/gate-change-set.ts +37 -6
- package/src/lifecycle/gate-ledger.ts +2 -2
- package/src/lifecycle/git.ts +61 -8
- package/src/lifecycle/index.ts +4 -0
- package/src/lifecycle/mixed-environment.test.ts +97 -0
- package/src/lifecycle/mixed-environment.ts +204 -0
- package/src/lifecycle/publish-attachments.ts +196 -0
- package/src/lifecycle/publish-credentials.ts +84 -0
- package/src/lifecycle/publish-declaration.ts +95 -0
- package/src/lifecycle/publish-forge.ts +325 -0
- package/src/lifecycle/publish-npm.ts +259 -0
- package/src/lifecycle/publish-oci.ts +396 -0
- package/src/lifecycle/publish-record.ts +113 -0
- package/src/lifecycle/publish-resume.test.ts +168 -0
- package/src/lifecycle/publish-targets.test.ts +494 -0
- package/src/lifecycle/publish-targets.ts +100 -0
- package/src/lifecycle/release-cut.test.ts +74 -2
- package/src/lifecycle/release-cut.ts +158 -22
- package/src/lifecycle/release-flag.test.ts +112 -0
- package/src/lifecycle/release-join.test.ts +68 -0
- package/src/lifecycle/release-join.ts +182 -0
- package/src/lifecycle/release-publish.test.ts +225 -0
- package/src/lifecycle/release-publish.ts +568 -0
- package/src/lifecycle/release-revocation.ts +147 -0
- package/src/lifecycle/release-store.ts +15 -4
- package/src/lifecycle/release-verify.test.ts +110 -0
- package/src/lifecycle/release-verify.ts +120 -0
- package/src/lifecycle/release-workstation.test.ts +204 -0
- package/src/lifecycle/release-workstation.ts +216 -0
- package/src/lifecycle/retention-growth.e2e.test.ts +279 -0
- package/src/lifecycle/retention-policy.ts +63 -0
- package/src/lifecycle/retention.test.ts +363 -0
- package/src/lifecycle/retention.ts +508 -0
- package/src/plan-summary.test.ts +20 -0
- package/src/plan-summary.ts +8 -1
- package/src/pr-loop.ts +25 -4
- package/src/pr-report-url.test.ts +131 -0
- package/src/pr-report-url.ts +209 -0
- package/src/provenance.ts +2 -2
- package/src/run-event-store.ts +63 -3
- package/src/run-event-stream.ts +4 -1
- package/src/run-event.ts +21 -1
- package/src/workspace/__fixtures__/flag-workspace.ts +132 -0
- package/src/workspace/__fixtures__/older-records/change-set-984534ea9.json +100 -0
- package/src/workspace/__fixtures__/older-records/older-records.json +326 -0
- package/src/workspace/change-set.schema.json +5 -1
- package/src/workspace/check.schema.json +4 -2
- package/src/workspace/checks/records.ts +35 -1
- package/src/workspace/checks.ts +2 -1
- package/src/workspace/ci-green.ts +14 -3
- package/src/workspace/declaration.schema.json +64 -0
- package/src/workspace/declaration.test.ts +28 -0
- package/src/workspace/declaration.ts +38 -0
- package/src/workspace/declared-kinds.ts +40 -1
- package/src/workspace/delivery-metrics.schema.json +519 -0
- package/src/workspace/delivery-metrics.test.ts +236 -0
- package/src/workspace/delivery-metrics.ts +286 -0
- package/src/workspace/flags-read.ts +121 -0
- package/src/workspace/flags.test.ts +141 -0
- package/src/workspace/flags.ts +157 -0
- package/src/workspace/graph-cli.ts +1 -1
- package/src/workspace/intent-cli.ts +46 -5
- package/src/workspace/intent-trace.test.ts +173 -0
- package/src/workspace/intent-trace.ts +484 -0
- package/src/workspace/intent.schema.json +702 -6
- package/src/workspace/intent.ts +148 -25
- package/src/workspace/older-records.test.ts +412 -0
- package/src/workspace/overlap.test.ts +165 -0
- package/src/workspace/overlap.ts +340 -0
- package/src/workspace/read-contract.e2e.test.ts +2 -1
- package/src/workspace/reason-codes.test.ts +5 -0
- package/src/workspace/reason-codes.ts +3 -0
- package/src/workspace/record-assets.test.ts +2 -1
- package/src/workspace/records-contract.e2e.test.ts +2 -1
- package/src/workspace/records.schema.json +21 -2
- package/src/workspace/records.ts +36 -2
- package/src/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
- package/src/workspace/reference-kinds/flag/flag.schema.json +53 -0
- package/src/workspace/releases.schema.json +123 -1
- package/src/workspace/releases.ts +11 -0
- package/src/workspace/run-event.schema.json +10 -3
- package/src/workspace/status-contract.test.ts +29 -0
- package/src/workspace/status-gates.ts +8 -0
- package/src/workspace/status-mixed.test.ts +152 -0
- package/src/workspace/status-revoked.test.ts +153 -0
- package/src/workspace/status.schema.json +198 -1
- package/src/workspace/status.ts +254 -3
- package/src/workspace/wip.ts +11 -2
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
* failed or stopped at a gate, so the ledger never misses a deploy that
|
|
13
13
|
* happened. Unlike an auto-recorded release, the record is what these
|
|
14
14
|
* commands are for, so a failed write is an error rather than a warning.
|
|
15
|
+
* A run that applied partly, or failed, also appends a deploy outcome
|
|
16
|
+
* (#4035, ../../lifecycle/deploy-outcome.ts) naming what it did to each
|
|
17
|
+
* component, so `workspace status` reads the environment as mixed.
|
|
18
|
+
*
|
|
19
|
+
* `rollback --release` (#4035) is a promote of an earlier release into the
|
|
20
|
+
* environment: every component of the release at the digest the environment
|
|
21
|
+
* ran from it, through the release gate `promote --release` binds (#4045).
|
|
15
22
|
*/
|
|
16
23
|
import { resolve } from "node:path";
|
|
17
24
|
import { readFileSync } from "node:fs";
|
|
@@ -26,14 +33,15 @@ import { fanOutRegistry } from "../../components/fan-out-support.js";
|
|
|
26
33
|
import { renderDriverHuman } from "../../components/driver-output.js";
|
|
27
34
|
import { ndjsonProgressSink } from "../../components/run-progress.js";
|
|
28
35
|
import { openCliRunEvents, refusesBothStreams } from "../run-events.js";
|
|
29
|
-
import { parseDigestPins, planPromotion, planRollback, planRedeploy, withoutBuildSteps, runPromotion, promotionRecord, rollbackRecord, redeployRecord, gateApprover, gateAdmission, } from "../../components/promote.js";
|
|
36
|
+
import { parseDigestPins, planPromotion, planRollback, planReleaseRollback, planRedeploy, withoutBuildSteps, runPromotion, promotionRecord, rollbackRecord, redeployRecord, gateApprover, gateAdmission, } from "../../components/promote.js";
|
|
30
37
|
import { summaryLedgerPrefix, writeGatedRunSummary } from "../../op/gate-summary.js";
|
|
31
38
|
import { approveCommand, describeGateMismatch, gateIsSealed, gitGateLedgerPort } from "../../op/gate.js";
|
|
32
39
|
import { resolveCliBuildParams, parseParamFlags } from "../build-params-cli.js";
|
|
33
40
|
import { formatError, formatWarning, formatSuccess, formatBold, formatInfo } from "../format.js";
|
|
34
41
|
import { GATED_EXIT_CODE } from "./run.js";
|
|
42
|
+
import { redeployLine, releaseRollbackLine, rollbackTarget, unsettledComponents } from "../../lifecycle/mixed-environment.js";
|
|
35
43
|
const PROMOTE_USAGE = "chant components promote --to <env> [--from <env>] [--allow-skip] [--release <label|digest>] [--component <name> [--digest <sha256:...>] | --digest <component>=<sha256:...> ...] [--dry-run] [--json]";
|
|
36
|
-
const ROLLBACK_USAGE = "chant components rollback <env> --component <name> [--digest <sha256:...>] [--dry-run] [--json]";
|
|
44
|
+
const ROLLBACK_USAGE = "chant components rollback <env> (--component <name> [--digest <sha256:...>] | --release <label|digest>) [--dry-run] [--json]";
|
|
37
45
|
const REDEPLOY_USAGE = "chant components redeploy <env> --component <name> [--digest <sha256:...>] [--dry-run] [--json]";
|
|
38
46
|
function renderPlan(verb, plan, removed) {
|
|
39
47
|
console.error(formatBold(verb === "promote" ? `promote ${plan.from} -> ${plan.to}` : `${verb} ${plan.to}`));
|
|
@@ -117,7 +125,8 @@ async function bindReleaseGate(input) {
|
|
|
117
125
|
const releaseDigest = under.release.releaseDigest;
|
|
118
126
|
// What the environment runs now, to compare each component with.
|
|
119
127
|
const { readRelease } = await import("../../lifecycle/release-store.js");
|
|
120
|
-
const
|
|
128
|
+
const envRecords = (await readLedger(env)).filter((r) => r.env === env);
|
|
129
|
+
const latest = latestPerComponent(envRecords);
|
|
121
130
|
const releases = new Map();
|
|
122
131
|
const current = new Map();
|
|
123
132
|
for (const item of plan.items) {
|
|
@@ -129,6 +138,12 @@ async function bindReleaseGate(input) {
|
|
|
129
138
|
releases.set(named, await readRelease(named).catch(() => null));
|
|
130
139
|
current.set(item.component, { record, release: named !== undefined ? (releases.get(named) ?? null) : null });
|
|
131
140
|
}
|
|
141
|
+
// #4035: a component a run left failed or gated runs something the ledger doesn't say.
|
|
142
|
+
const { readDeployOutcomes } = await import("../../lifecycle/deploy-outcome.js");
|
|
143
|
+
const unsettled = new Map();
|
|
144
|
+
for (const [component, u] of unsettledComponents(envRecords, await readDeployOutcomes(env).catch(() => []))) {
|
|
145
|
+
unsettled.set(component, `the ${u.outcome.verb} run ${u.outcome.runId} left ${component} ${u.state} in "${env}" and nothing has been recorded for it since, so what it runs is not known`);
|
|
146
|
+
}
|
|
132
147
|
const doc = await gate.planReleaseChangeSet({
|
|
133
148
|
release: under.release,
|
|
134
149
|
env,
|
|
@@ -136,6 +151,7 @@ async function bindReleaseGate(input) {
|
|
|
136
151
|
digests: new Map(plan.items.map((i) => [i.component, i.digest])),
|
|
137
152
|
registry: input.registry,
|
|
138
153
|
current,
|
|
154
|
+
unsettled,
|
|
139
155
|
seededOutputs: input.seededOutputs,
|
|
140
156
|
});
|
|
141
157
|
const provisional = gate.provisionalMembers(doc);
|
|
@@ -359,7 +375,11 @@ async function deployPlan(ctx, verb, plan, project, actor, record, under) {
|
|
|
359
375
|
const timestamp = new Date().toISOString();
|
|
360
376
|
const recorded = [];
|
|
361
377
|
let recordError;
|
|
362
|
-
|
|
378
|
+
// #4035: a run that applied partly, or failed, records what it did to each
|
|
379
|
+
// component, so the environment reads as mixed until it is settled.
|
|
380
|
+
const { deployOutcomeOf, appendDeployOutcome } = await import("../../lifecycle/deploy-outcome.js");
|
|
381
|
+
const outcome = deployOutcomeOf({ verb, plan, run, releaseDigest: under?.release.releaseDigest ?? null, runId, timestamp, actor: actor });
|
|
382
|
+
if (deployed.length > 0 || outcome) {
|
|
363
383
|
try {
|
|
364
384
|
for (const item of deployed) {
|
|
365
385
|
const result = run.results.find((r) => r.component === item.component);
|
|
@@ -369,6 +389,8 @@ async function deployPlan(ctx, verb, plan, project, actor, record, under) {
|
|
|
369
389
|
const { record: written } = await appendReleaseRecord(under ? { ...input, releaseDigest: under.release.releaseDigest } : input);
|
|
370
390
|
recorded.push(written);
|
|
371
391
|
}
|
|
392
|
+
if (outcome)
|
|
393
|
+
await appendDeployOutcome(outcome);
|
|
372
394
|
await pushLifecycle();
|
|
373
395
|
}
|
|
374
396
|
catch (err) {
|
|
@@ -377,7 +399,7 @@ async function deployPlan(ctx, verb, plan, project, actor, record, under) {
|
|
|
377
399
|
}
|
|
378
400
|
if (args.json) {
|
|
379
401
|
const withChangeSet = under && changeSetJson ? { release: { ...releaseJson.release, ...changeSetJson } } : releaseJson;
|
|
380
|
-
console.log(JSON.stringify({ ...planJson(plan, removed), ...withChangeSet, run, recorded }, null, 2));
|
|
402
|
+
console.log(JSON.stringify({ ...planJson(plan, removed), ...withChangeSet, run, recorded, ...(outcome ? { outcome } : {}) }, null, 2));
|
|
381
403
|
}
|
|
382
404
|
else {
|
|
383
405
|
for (const r of recorded) {
|
|
@@ -388,9 +410,20 @@ async function deployPlan(ctx, verb, plan, project, actor, record, under) {
|
|
|
388
410
|
: `Redeployed ${formatBold(r.component)} in ${plan.to} at ${r.digest}`));
|
|
389
411
|
}
|
|
390
412
|
}
|
|
413
|
+
if (outcome && recordError === undefined) {
|
|
414
|
+
const unsettled = outcome.components.filter((c) => c.outcome === "failed" || c.outcome === "gated");
|
|
415
|
+
console.error(formatWarning({
|
|
416
|
+
message: `"${plan.to}" now runs a mix: ${outcome.components.map((c) => `${c.component} ${c.outcome}`).join(", ")}. ` +
|
|
417
|
+
`chant workspace status ${plan.to} --json lists what each component runs and the rollback line`,
|
|
418
|
+
}));
|
|
419
|
+
for (const c of unsettled)
|
|
420
|
+
console.error(formatInfo(`settle ${c.component}: ${redeployLine(plan.to, c.component)}, or run the same ${verb} again`));
|
|
421
|
+
}
|
|
391
422
|
if (recordError !== undefined) {
|
|
392
423
|
console.error(formatError({
|
|
393
|
-
message:
|
|
424
|
+
message: deployed.length > 0
|
|
425
|
+
? `deployed to "${plan.to}", but the release record was not written: ${recordError}`
|
|
426
|
+
: `the outcome of the ${verb} in "${plan.to}" was not written: ${recordError}`,
|
|
394
427
|
hint: `Pull the chant/lifecycle branch and check \`chant components status ${plan.to}\` before running this again.`,
|
|
395
428
|
}));
|
|
396
429
|
return 1;
|
|
@@ -436,6 +469,114 @@ function actorOrRefuse(ctx) {
|
|
|
436
469
|
}
|
|
437
470
|
return { actor };
|
|
438
471
|
}
|
|
472
|
+
/** The revoked commits, or the exit code of a refusal already printed when the ci tags can't be judged (#4033). */
|
|
473
|
+
async function revokedOrRefuse(what) {
|
|
474
|
+
const { readRevokedCommits } = await import("../../lifecycle/release-revocation.js");
|
|
475
|
+
try {
|
|
476
|
+
return await readRevokedCommits(process.cwd());
|
|
477
|
+
}
|
|
478
|
+
catch (err) {
|
|
479
|
+
console.error(formatError({
|
|
480
|
+
message: `the ci tags can't be judged, so whether ${what} is revoked is unknown: ${err instanceof Error ? err.message : String(err)} [declaration-invalid]`,
|
|
481
|
+
hint: "Fix ci.green in chant.workspace.json at base; chant workspace check names the problem.",
|
|
482
|
+
}));
|
|
483
|
+
return 1;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Resolve `--release` for a promote or a rollback to `env` (#4026, #4035):
|
|
488
|
+
* the release, its label and its target for `env`. Refused, with the exit
|
|
489
|
+
* code returned, when the release can't be found, has no target for `env`,
|
|
490
|
+
* is of a project with no components (#4046), or was cut from a revoked
|
|
491
|
+
* commit (#4033), so a gate pending for it can't pass.
|
|
492
|
+
*/
|
|
493
|
+
async function resolveUnderRelease(ref, env, verb, fix) {
|
|
494
|
+
const { resolveRelease } = await import("../../lifecycle/release-store.js");
|
|
495
|
+
const { targetFor, isImplicitRelease } = await import("../../components/release-promote.js");
|
|
496
|
+
const found = await resolveRelease(ref);
|
|
497
|
+
if (!found) {
|
|
498
|
+
console.error(formatError({ message: `no release is labelled or digested "${ref}" in this member`, hint: "List them with: chant release list" }));
|
|
499
|
+
return 1;
|
|
500
|
+
}
|
|
501
|
+
const target = targetFor(found.release, env);
|
|
502
|
+
if ("error" in target) {
|
|
503
|
+
console.error(formatError({ message: target.error }));
|
|
504
|
+
return 1;
|
|
505
|
+
}
|
|
506
|
+
// #4046: a release of a project with no components records build output
|
|
507
|
+
// and no component, so there is no deploy step here to point at it.
|
|
508
|
+
if (isImplicitRelease(found.release)) {
|
|
509
|
+
const name = found.label ?? found.release.releaseDigest;
|
|
510
|
+
console.error(formatError({
|
|
511
|
+
message: `release ${name} is of a project with no components, so ${verb} has no component to deploy`,
|
|
512
|
+
hint: `Write its "${env}" build output with \`chant release export ${name} --env ${env}\`, then run the project's own deploy against those files.`,
|
|
513
|
+
}));
|
|
514
|
+
return 1;
|
|
515
|
+
}
|
|
516
|
+
// #4033 (ws-105): a release cut from a revoked commit is never deployed,
|
|
517
|
+
// so a gate pending for it can't pass. Read from local tags, as the cut reads them.
|
|
518
|
+
const revoked = await revokedOrRefuse(`release ${found.label ?? found.release.releaseDigest}`);
|
|
519
|
+
if (typeof revoked === "number")
|
|
520
|
+
return revoked;
|
|
521
|
+
const { revocationOf, revokedRefusal } = await import("../../lifecycle/release-revocation.js");
|
|
522
|
+
const revocation = revocationOf(found.release, revoked);
|
|
523
|
+
if (revocation) {
|
|
524
|
+
console.error(formatError(revokedRefusal({ releaseDigest: found.release.releaseDigest, label: found.label }, revocation, await fix(found.release))));
|
|
525
|
+
return 1;
|
|
526
|
+
}
|
|
527
|
+
return { release: found.release, label: found.label, target: target.target };
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* The line that rolls `env` back past `exclude` (#4035): to the newest
|
|
531
|
+
* release in its ledger that is still kept and not revoked, by label, or
|
|
532
|
+
* null when there is none.
|
|
533
|
+
*/
|
|
534
|
+
async function rollbackLineFor(env, records, exclude, revoked) {
|
|
535
|
+
const { readRelease, readCuts, labelsByDigest } = await import("../../lifecycle/release-store.js");
|
|
536
|
+
const { revocationOf } = await import("../../lifecycle/release-revocation.js");
|
|
537
|
+
const target = await rollbackTarget({
|
|
538
|
+
records,
|
|
539
|
+
exclude,
|
|
540
|
+
check: async (digest) => {
|
|
541
|
+
const release = await readRelease(digest).catch(() => null);
|
|
542
|
+
return { kept: release !== null, revoked: release !== null && revocationOf(release, revoked) !== null };
|
|
543
|
+
},
|
|
544
|
+
});
|
|
545
|
+
if (!target)
|
|
546
|
+
return null;
|
|
547
|
+
const labels = await readCuts().then((c) => labelsByDigest(c.cuts), () => new Map());
|
|
548
|
+
return releaseRollbackLine(env, target, labels.get(target));
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Refuse a rollback or a redeploy that would put back a release cut from a
|
|
552
|
+
* revoked commit (#4033, #4035), naming the release to go back to instead.
|
|
553
|
+
* Returns the exit code of the refusal, or undefined when nothing restored
|
|
554
|
+
* names a revoked release.
|
|
555
|
+
*/
|
|
556
|
+
async function refuseRevokedRestore(verb, plan, records) {
|
|
557
|
+
const named = [...new Set(plan.items.map((i) => i.source.releaseDigest).filter((d) => d !== undefined))];
|
|
558
|
+
if (named.length === 0)
|
|
559
|
+
return undefined;
|
|
560
|
+
const revoked = await revokedOrRefuse(`the release this ${verb} restores`);
|
|
561
|
+
if (typeof revoked === "number")
|
|
562
|
+
return revoked;
|
|
563
|
+
if (revoked.size === 0)
|
|
564
|
+
return undefined;
|
|
565
|
+
const { readRelease, readCuts, labelsByDigest } = await import("../../lifecycle/release-store.js");
|
|
566
|
+
const { revocationOf, revokedRefusal } = await import("../../lifecycle/release-revocation.js");
|
|
567
|
+
for (const digest of named) {
|
|
568
|
+
const release = await readRelease(digest).catch(() => null);
|
|
569
|
+
const revocation = release ? revocationOf(release, revoked) : null;
|
|
570
|
+
if (!revocation)
|
|
571
|
+
continue;
|
|
572
|
+
const labels = await readCuts().then((c) => labelsByDigest(c.cuts), () => new Map());
|
|
573
|
+
const back = await rollbackLineFor(plan.to, records, new Set([digest]), revoked);
|
|
574
|
+
console.error(formatError(revokedRefusal({ releaseDigest: digest, label: labels.get(digest) ?? null }, revocation, back ? `Restore a release cut from a green commit instead: ${back}` : `No other release "${plan.to}" ran is kept and green; promote a release cut from a green commit (\`chant ci last-green\` names the newest).`)));
|
|
575
|
+
console.error(formatError({ message: "nothing was deployed" }));
|
|
576
|
+
return 1;
|
|
577
|
+
}
|
|
578
|
+
return undefined;
|
|
579
|
+
}
|
|
439
580
|
export async function runComponentsPromote(ctx) {
|
|
440
581
|
const { args } = ctx;
|
|
441
582
|
const to = args.migrateTo;
|
|
@@ -488,29 +629,10 @@ export async function runComponentsPromote(ctx) {
|
|
|
488
629
|
// #4026: --release names the release this promote deploys, by label or digest.
|
|
489
630
|
let under;
|
|
490
631
|
if (args.release) {
|
|
491
|
-
const
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
console.error(formatError({ message: `no release is labelled or digested "${args.release}" in this member`, hint: "List them with: chant release list" }));
|
|
496
|
-
return 1;
|
|
497
|
-
}
|
|
498
|
-
const target = targetFor(found.release, to);
|
|
499
|
-
if ("error" in target) {
|
|
500
|
-
console.error(formatError({ message: target.error }));
|
|
501
|
-
return 1;
|
|
502
|
-
}
|
|
503
|
-
// #4046: a release of a project with no components records build output
|
|
504
|
-
// and no component, so there is no deploy step here to point at it.
|
|
505
|
-
if (isImplicitRelease(found.release)) {
|
|
506
|
-
const name = found.label ?? found.release.releaseDigest;
|
|
507
|
-
console.error(formatError({
|
|
508
|
-
message: `release ${name} is of a project with no components, so promote has no component to deploy`,
|
|
509
|
-
hint: `Write its "${to}" build output with \`chant release export ${name} --env ${to}\`, then run the project's own deploy against those files.`,
|
|
510
|
-
}));
|
|
511
|
-
return 1;
|
|
512
|
-
}
|
|
513
|
-
under = { release: found.release, label: found.label, target: target.target };
|
|
632
|
+
const found = await resolveUnderRelease(args.release, to, "promote", () => "Promote a release cut from a green commit: `chant ci last-green` names the newest, and `chant release list` marks the revoked releases. Fetch the tags first: git fetch origin --tags");
|
|
633
|
+
if (typeof found === "number")
|
|
634
|
+
return found;
|
|
635
|
+
under = found;
|
|
514
636
|
}
|
|
515
637
|
const plan = planPromotion({
|
|
516
638
|
from,
|
|
@@ -530,20 +652,31 @@ export async function runComponentsPromote(ctx) {
|
|
|
530
652
|
export async function runComponentsRollback(ctx) {
|
|
531
653
|
const { args } = ctx;
|
|
532
654
|
const env = args.extraPositional;
|
|
533
|
-
if (!env || !args.component) {
|
|
534
|
-
console.error(formatError({ message: "an environment and --component <name> are required", hint: ROLLBACK_USAGE }));
|
|
655
|
+
if (!env || (!args.component && !args.release)) {
|
|
656
|
+
console.error(formatError({ message: "an environment and --component <name> or --release <label|digest> are required", hint: ROLLBACK_USAGE }));
|
|
657
|
+
return 1;
|
|
658
|
+
}
|
|
659
|
+
if (args.component && args.release) {
|
|
660
|
+
console.error(formatError({ message: "--release rolls back every component of a release, so it does not take --component", hint: ROLLBACK_USAGE }));
|
|
661
|
+
return 1;
|
|
662
|
+
}
|
|
663
|
+
if (args.release && args.digest) {
|
|
664
|
+
console.error(formatError({ message: "--digest picks one release of one component, so it needs --component, not --release", hint: ROLLBACK_USAGE }));
|
|
535
665
|
return 1;
|
|
536
666
|
}
|
|
537
667
|
const who = actorOrRefuse(ctx);
|
|
538
668
|
if (typeof who === "number")
|
|
539
669
|
return who;
|
|
670
|
+
if (args.release)
|
|
671
|
+
return runReleaseRollback(ctx, env, args.release, who.actor);
|
|
540
672
|
const project = await loadProject(ctx, args.component);
|
|
541
673
|
if (typeof project === "number")
|
|
542
674
|
return project;
|
|
543
675
|
await fetchLifecycle().catch(() => false);
|
|
676
|
+
const records = await readLedger(env);
|
|
544
677
|
const plan = planRollback({
|
|
545
678
|
env,
|
|
546
|
-
records
|
|
679
|
+
records,
|
|
547
680
|
declared: project.targets.map((c) => c.name),
|
|
548
681
|
component: args.component,
|
|
549
682
|
...(args.digest ? { digest: args.digest } : {}),
|
|
@@ -552,8 +685,48 @@ export async function runComponentsRollback(ctx) {
|
|
|
552
685
|
console.error(formatError({ message: plan.error, hint: ROLLBACK_USAGE }));
|
|
553
686
|
return 1;
|
|
554
687
|
}
|
|
688
|
+
const refused = await refuseRevokedRestore("rollback", plan, records);
|
|
689
|
+
if (refused !== undefined)
|
|
690
|
+
return refused;
|
|
555
691
|
return deployPlan(ctx, "rollback", plan, project, who.actor, rollbackRecord);
|
|
556
692
|
}
|
|
693
|
+
/**
|
|
694
|
+
* `chant components rollback <env> --release <label|digest>` (#4035): a
|
|
695
|
+
* gated promote of an earlier release into `env`. Every component of the
|
|
696
|
+
* release is restored at the digest `env` recorded running it from that
|
|
697
|
+
* release, its deploy reads the templates the release recorded for `env`,
|
|
698
|
+
* and its gates bind the release's change set planned against what `env`
|
|
699
|
+
* runs now, as `promote --release` binds them (#4045).
|
|
700
|
+
*/
|
|
701
|
+
async function runReleaseRollback(ctx, env, ref, actor) {
|
|
702
|
+
const project = await loadProject(ctx, "all");
|
|
703
|
+
if (typeof project === "number")
|
|
704
|
+
return project;
|
|
705
|
+
await fetchLifecycle().catch(() => false);
|
|
706
|
+
const records = await readLedger(env);
|
|
707
|
+
const under = await resolveUnderRelease(ref, env, "rollback", async (release) => {
|
|
708
|
+
const revoked = await revokedOrRefuse("the release before it").then((r) => (typeof r === "number" ? new Map() : r));
|
|
709
|
+
const back = await rollbackLineFor(env, records, new Set([release.releaseDigest]), revoked);
|
|
710
|
+
return back ? `Roll back to a release cut from a green commit: ${back}` : "Roll back to a release cut from a green commit; `chant release list` marks the revoked releases.";
|
|
711
|
+
});
|
|
712
|
+
if (typeof under === "number")
|
|
713
|
+
return under;
|
|
714
|
+
const { readDeployOutcomes } = await import("../../lifecycle/deploy-outcome.js");
|
|
715
|
+
const outcomes = await readDeployOutcomes(env).catch(() => []);
|
|
716
|
+
const plan = planReleaseRollback({
|
|
717
|
+
env,
|
|
718
|
+
records,
|
|
719
|
+
declared: project.targets.map((c) => c.name),
|
|
720
|
+
release: under.release,
|
|
721
|
+
label: under.label,
|
|
722
|
+
unsettled: new Set(unsettledComponents(records, outcomes).keys()),
|
|
723
|
+
});
|
|
724
|
+
if ("error" in plan) {
|
|
725
|
+
console.error(formatError({ message: plan.error, hint: ROLLBACK_USAGE }));
|
|
726
|
+
return 1;
|
|
727
|
+
}
|
|
728
|
+
return deployPlan(ctx, "rollback", plan, project, actor, rollbackRecord, under);
|
|
729
|
+
}
|
|
557
730
|
export async function runComponentsRedeploy(ctx) {
|
|
558
731
|
const { args } = ctx;
|
|
559
732
|
const env = args.extraPositional;
|
|
@@ -568,9 +741,10 @@ export async function runComponentsRedeploy(ctx) {
|
|
|
568
741
|
if (typeof project === "number")
|
|
569
742
|
return project;
|
|
570
743
|
await fetchLifecycle().catch(() => false);
|
|
744
|
+
const records = await readLedger(env);
|
|
571
745
|
const plan = planRedeploy({
|
|
572
746
|
env,
|
|
573
|
-
records
|
|
747
|
+
records,
|
|
574
748
|
declared: project.targets.map((c) => c.name),
|
|
575
749
|
component: args.component,
|
|
576
750
|
...(args.digest ? { digest: args.digest } : {}),
|
|
@@ -579,5 +753,8 @@ export async function runComponentsRedeploy(ctx) {
|
|
|
579
753
|
console.error(formatError({ message: plan.error, hint: REDEPLOY_USAGE }));
|
|
580
754
|
return 1;
|
|
581
755
|
}
|
|
756
|
+
const refused = await refuseRevokedRestore("redeploy", plan, records);
|
|
757
|
+
if (refused !== undefined)
|
|
758
|
+
return refused;
|
|
582
759
|
return deployPlan(ctx, "redeploy", plan, project, who.actor, redeployRecord);
|
|
583
760
|
}
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `chant release` (#4026, ws-104): the release is what graduates.
|
|
3
3
|
*
|
|
4
|
-
* release cut [<label>] [--build <command>] [--param k=v]... [--params-file <file>] [--src <dir>] [-o <file>] [--lexicon <name>] [--actor <name>] [--sign [<key file>]] [--json]
|
|
5
|
-
*
|
|
4
|
+
* release cut [<label>] [--yes] [--build <command>] [--param k=v]... [--params-file <file>] [--src <dir>] [-o <file>] [--lexicon <name>] [--actor <name>] [--sign [<key file>]] [--json]
|
|
5
|
+
* a dry run of a cut of this member from the checkout's HEAD, which must be
|
|
6
|
+
* clean, on trunk and pushed, and green (#4027); `--yes` cuts, records,
|
|
7
|
+
* and tags the commit `release/<label>` locally;
|
|
6
8
|
* --sign signs the cut with the actor's ssh key (#4031); `--src`, `-o` and
|
|
7
9
|
* `--lexicon` shape the build of a project with no components (#4046)
|
|
10
|
+
* release publish <label|digest> [--yes] [--allow-unsigned] [--require-provenance] [--json]
|
|
11
|
+
* publish a cut release (#4027) to the targets release.publish declares
|
|
12
|
+
* (#4047): a dry run unless --yes; refuses a revoked one, one with no
|
|
13
|
+
* signature that verifies against .chant/allowed_signers unless
|
|
14
|
+
* --allow-unsigned (#4049), and with a target a checkout that is not
|
|
15
|
+
* the release's commit; warns with no OIDC provenance, and refuses
|
|
16
|
+
* under --require-provenance; attaches SBOMs and provenance (#4049)
|
|
17
|
+
* release verify <label|digest> [--json]
|
|
18
|
+
* check the release's signature offline against .chant/allowed_signers
|
|
19
|
+
* at the release's commit (#4049)
|
|
8
20
|
* release list [--json]
|
|
9
21
|
* every release of this member with its targets, its cuts and where it runs;
|
|
10
22
|
* `--json` prints the read contract's `releases` document
|
|
@@ -13,12 +25,57 @@
|
|
|
13
25
|
* release compile --env <env> [--build <command>] [--artifacts --component <a,b>] --json
|
|
14
26
|
* internal: what the cut runs in a child process per environment
|
|
15
27
|
*
|
|
16
|
-
* The workstation
|
|
17
|
-
*
|
|
18
|
-
*
|
|
28
|
+
* The workstation checks, the actor and the tag are in
|
|
29
|
+
* ../../lifecycle/release-workstation.ts, and the publish contract in
|
|
30
|
+
* ../../lifecycle/release-publish.ts. A declaration whose `identity.gates`
|
|
31
|
+
* names a `release` gate requires a signed cut by an actor in its class (#4031).
|
|
19
32
|
*/
|
|
20
33
|
import type { CommandContext } from "../registry.js";
|
|
34
|
+
/** What to run after a cut (#4027): publish from CI, or push the tag so CI publishes, or deploy the first environment. */
|
|
35
|
+
export declare function nextCommands(req: {
|
|
36
|
+
ref: string;
|
|
37
|
+
tag: string | null;
|
|
38
|
+
inCi: boolean;
|
|
39
|
+
firstEnv: string | null;
|
|
40
|
+
/** A project with no components deploys with `release export`, not promote (#4046). */
|
|
41
|
+
noComponents: boolean;
|
|
42
|
+
}): string[];
|
|
43
|
+
/** The command line that ran, without `--json`, with `--yes` added: what a dry run says to run next. */
|
|
44
|
+
export declare function sameWithYes(argv: readonly string[]): string;
|
|
45
|
+
/**
|
|
46
|
+
* `release cut [<label>]` (#4026, #4027). A dry run unless `--yes`: it
|
|
47
|
+
* refuses a dirty tree, a commit that is not on trunk and pushed, and one
|
|
48
|
+
* that is not green, compiles every environment, and prints what the cut
|
|
49
|
+
* would record, build and tag, and what publishes where. With `--yes` it
|
|
50
|
+
* cuts, signs with `--sign`, records the cut with its actor and run id,
|
|
51
|
+
* tags the commit locally and prints the next command.
|
|
52
|
+
*/
|
|
21
53
|
export declare function runReleaseCut(ctx: CommandContext): Promise<number>;
|
|
54
|
+
/**
|
|
55
|
+
* `release publish <label|digest> [--yes]` (#4027, #4047): publish a cut
|
|
56
|
+
* release to the targets the member declares under `release.publish` in
|
|
57
|
+
* its `chant.config.ts`. It refuses a release no cut names, one cut from a
|
|
58
|
+
* revoked commit, one with no signature that verifies against the signers
|
|
59
|
+
* file at base unless `--allow-unsigned` (#4049; never under
|
|
60
|
+
* identity.gates.release), and, when there is a target, a checkout that is
|
|
61
|
+
* not the release's commit with a clean tree. It warns before publishing
|
|
62
|
+
* when the run has no OIDC token, so what it publishes carries no
|
|
63
|
+
* provenance, and refuses under `--require-provenance`. Each target attaches
|
|
64
|
+
* an SBOM and the release's provenance statement (#4049). Every
|
|
65
|
+
* target is planned (its files read and checked, its credentials found)
|
|
66
|
+
* before any publishes. Without `--yes` it is a dry run that prints the plan
|
|
67
|
+
* and uploads nothing. With `--yes` it stages every target, then reveals them
|
|
68
|
+
* (#4048, `runPublish`), recording each step in `_releases/publishes.jsonl`,
|
|
69
|
+
* so running it again after a failure resumes. Every line is redacted.
|
|
70
|
+
*/
|
|
71
|
+
export declare function runReleasePublish(ctx: CommandContext): Promise<number>;
|
|
72
|
+
/**
|
|
73
|
+
* `release verify <label|digest> [--json]` (#4049): check, offline, that the
|
|
74
|
+
* release was signed by a key `.chant/allowed_signers` lists at the release's
|
|
75
|
+
* commit, and that its file is the digest of what it holds. Exits 0 when it
|
|
76
|
+
* verifies and 1 when it does not or can't be checked.
|
|
77
|
+
*/
|
|
78
|
+
export declare function runReleaseVerify(ctx: CommandContext): Promise<number>;
|
|
22
79
|
export declare function runReleaseList(ctx: CommandContext): Promise<number>;
|
|
23
80
|
/**
|
|
24
81
|
* `release export <label|digest> --env <env> [-o <dir>]` (#4046): write each
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/release.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/release.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAmBlD,0HAA0H;AAC1H,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uFAAuF;IACvF,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG,MAAM,EAAE,CASX;AAED,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAG3D;AAiBD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAyMxE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA2G5E;AAQD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC3E;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BzE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAyC3E;AAED,gHAAgH;AAChH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB5E;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAG5E"}
|