@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
package/dist/lifecycle/git.d.ts
CHANGED
|
@@ -61,6 +61,18 @@ export interface LedgerFileWrite {
|
|
|
61
61
|
*/
|
|
62
62
|
expectPriorSha?: string | null;
|
|
63
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* One file for {@link writeLedgerFiles} to remove (#4036): retention's
|
|
66
|
+
* garbage collection takes a stored change set, release or template out of
|
|
67
|
+
* the tree in a new commit. The history keeps it.
|
|
68
|
+
*/
|
|
69
|
+
export interface LedgerFileRemoval {
|
|
70
|
+
/** The file's full path on the branch. No prefix is added. */
|
|
71
|
+
path: string;
|
|
72
|
+
remove: true;
|
|
73
|
+
/** The blob sha the caller saw at the path; a different sha, or no file, is a conflict. */
|
|
74
|
+
expectPriorSha?: string | null;
|
|
75
|
+
}
|
|
64
76
|
/**
|
|
65
77
|
* Write several files to the branch in one commit (#2538). Paths are full
|
|
66
78
|
* branch paths, so one commit can write the ledgers of several members, for
|
|
@@ -74,8 +86,15 @@ export interface LedgerFileWrite {
|
|
|
74
86
|
* Every entry the write does not touch is carried over as it is, so the tree
|
|
75
87
|
* of an unchanged directory keeps its sha.
|
|
76
88
|
*/
|
|
77
|
-
export declare function writeLedgerFiles(files: LedgerFileWrite
|
|
89
|
+
export declare function writeLedgerFiles(files: Array<LedgerFileWrite | LedgerFileRemoval>, commitMessage: string, opts?: {
|
|
78
90
|
cwd?: string;
|
|
91
|
+
/**
|
|
92
|
+
* The branch tip the caller read before deciding what to write (#4036).
|
|
93
|
+
* A different tip is a conflict, thrown at once and never retried here,
|
|
94
|
+
* so a caller whose choice depends on files it does not write (garbage
|
|
95
|
+
* collection reading the gate ledgers) reads again.
|
|
96
|
+
*/
|
|
97
|
+
expectTip?: string;
|
|
79
98
|
}): Promise<string>;
|
|
80
99
|
/**
|
|
81
100
|
* Read a blob from an arbitrary `<environment>/<filename>` path on the orphan
|
|
@@ -162,6 +181,16 @@ export declare function readSnapshotAt(environment: string, lexicon: string, ref
|
|
|
162
181
|
export declare function appendReleaseRecordLine(environment: string, recordJson: string, opts?: {
|
|
163
182
|
cwd?: string;
|
|
164
183
|
}): Promise<string>;
|
|
184
|
+
/**
|
|
185
|
+
* Append one line to `<environment>/<filename>` on the orphan branch, with
|
|
186
|
+
* the same read, append and compare-and-swap retry as
|
|
187
|
+
* {@link appendReleaseRecordLine}. The deploy outcomes of
|
|
188
|
+
* ../lifecycle/deploy-outcome.ts (#4035) are appended through here, beside
|
|
189
|
+
* the environment's `releases.jsonl`.
|
|
190
|
+
*/
|
|
191
|
+
export declare function appendLedgerLine(environment: string, filename: string, recordJson: string, commitMessage: string, opts?: {
|
|
192
|
+
cwd?: string;
|
|
193
|
+
}): Promise<string>;
|
|
165
194
|
/**
|
|
166
195
|
* Read every release record line for `environment` from the orphan branch,
|
|
167
196
|
* oldest first, as raw JSON strings. Returns `[]` when no ledger exists yet
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/lifecycle/git.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnF;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yHAAyH;IACzH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACpC,yFAAyF;IACzF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmFD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC1D,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC9B,0GAA0G;IAC1G,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/lifecycle/git.ts"],"names":[],"mappings":"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"}
|
package/dist/lifecycle/git.js
CHANGED
|
@@ -125,6 +125,7 @@ export async function writeBlobToPath(environment, filename, content, commitMess
|
|
|
125
125
|
const dir = await ledgerDir(environment, opts);
|
|
126
126
|
return writeLedgerFiles([{ path: `${dir}/${filename}`, content, ...(opts?.expectPriorPathSha !== undefined ? { expectPriorSha: opts.expectPriorPathSha } : {}) }], commitMessage, opts);
|
|
127
127
|
}
|
|
128
|
+
const isRemoval = (f) => f.remove === true;
|
|
128
129
|
/**
|
|
129
130
|
* Write several files to the branch in one commit (#2538). Paths are full
|
|
130
131
|
* branch paths, so one commit can write the ledgers of several members, for
|
|
@@ -158,8 +159,13 @@ export async function writeLedgerFiles(files, commitMessage, opts) {
|
|
|
158
159
|
// kubectl.kubernetes.io/last-applied-configuration annotation) and no
|
|
159
160
|
// shell-quoting dance around embedded single quotes. Content-addressed
|
|
160
161
|
// and idempotent, so this stays outside the retry loop below.
|
|
162
|
+
// A removal has no blob: its sha is null, and step 3 deletes the entry.
|
|
161
163
|
const blobs = [];
|
|
162
164
|
for (const f of files) {
|
|
165
|
+
if (isRemoval(f)) {
|
|
166
|
+
blobs.push({ path: f.path, sha: null });
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
163
169
|
const blobResult = await rt.spawn(["git", "hash-object", "-w", "--stdin"], { cwd, stdin: f.content });
|
|
164
170
|
if (blobResult.exitCode !== 0) {
|
|
165
171
|
throw ledgerWriteError("git hash-object", f.path, blobResult.stderr);
|
|
@@ -230,6 +236,9 @@ export async function writeLedgerFiles(files, commitMessage, opts) {
|
|
|
230
236
|
// there instead can observe a newer tip than the listings reflect, which
|
|
231
237
|
// makes the CAS succeed against a tree built from a stale read.
|
|
232
238
|
const tip = await getStateBranchTip(cwd);
|
|
239
|
+
if (opts?.expectTip !== undefined && tip !== opts.expectTip) {
|
|
240
|
+
throw new RefCASConflictError(`refs/heads/${STATE_BRANCH}`, opts.expectTip, `the branch moved to ${tip ?? "(none)"} since it was read`);
|
|
241
|
+
}
|
|
233
242
|
const trees = new Map();
|
|
234
243
|
const listing = async (dir) => {
|
|
235
244
|
let entries = trees.get(dir);
|
|
@@ -257,16 +266,24 @@ export async function writeLedgerFiles(files, commitMessage, opts) {
|
|
|
257
266
|
// rebuild below has each parent in hand.
|
|
258
267
|
for (const b of blobs) {
|
|
259
268
|
const { dir, name } = splitPath(b.path);
|
|
260
|
-
|
|
269
|
+
if (b.sha === null)
|
|
270
|
+
(await listing(dir)).delete(name);
|
|
271
|
+
else
|
|
272
|
+
(await listing(dir)).set(name, { mode: "100644", type: "blob", sha: b.sha });
|
|
261
273
|
for (let d = dir; d !== ""; d = parentDir(d))
|
|
262
274
|
await listing(parentDir(d));
|
|
263
275
|
}
|
|
264
|
-
// 4. Rebuild the touched trees, deepest first, then the root.
|
|
276
|
+
// 4. Rebuild the touched trees, deepest first, then the root. A directory
|
|
277
|
+
// a removal left empty is dropped from its parent, as git itself would.
|
|
265
278
|
const touched = [...trees.keys()].sort((a, b) => depth(b) - depth(a) || (a < b ? -1 : 1));
|
|
266
279
|
let rootTreeSha = "";
|
|
267
280
|
for (const dir of touched) {
|
|
281
|
+
if (dir !== "" && trees.get(dir).size === 0) {
|
|
282
|
+
trees.get(parentDir(dir)).delete(baseName(dir));
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
268
285
|
const lines = [...trees.get(dir)].map(([name, e]) => `${e.mode} ${e.type} ${e.sha}\t${name}`).join("\n");
|
|
269
|
-
const result = await rt.spawn(["git", "mktree"], { cwd, stdin: `${lines}\n` });
|
|
286
|
+
const result = await rt.spawn(["git", "mktree"], { cwd, stdin: lines === "" ? "" : `${lines}\n` });
|
|
270
287
|
if (result.exitCode !== 0) {
|
|
271
288
|
throw ledgerWriteError(`git mktree (${dir === "" ? "root" : dir})`, path, result.stderr);
|
|
272
289
|
}
|
|
@@ -422,14 +439,23 @@ export async function readSnapshotAt(environment, lexicon, ref, opts) {
|
|
|
422
439
|
* `expectPriorPathSha`. See `writeBlobToPath` for the race that closes.
|
|
423
440
|
*/
|
|
424
441
|
export async function appendReleaseRecordLine(environment, recordJson, opts) {
|
|
425
|
-
|
|
442
|
+
return appendLedgerLine(environment, "releases.jsonl", recordJson, "Release record", opts);
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Append one line to `<environment>/<filename>` on the orphan branch, with
|
|
446
|
+
* the same read, append and compare-and-swap retry as
|
|
447
|
+
* {@link appendReleaseRecordLine}. The deploy outcomes of
|
|
448
|
+
* ../lifecycle/deploy-outcome.ts (#4035) are appended through here, beside
|
|
449
|
+
* the environment's `releases.jsonl`.
|
|
450
|
+
*/
|
|
451
|
+
export async function appendLedgerLine(environment, filename, recordJson, commitMessage, opts) {
|
|
426
452
|
let lastErr;
|
|
427
453
|
for (let attempt = 1; attempt <= WRITE_BLOB_RETRY_ATTEMPTS; attempt++) {
|
|
428
454
|
try {
|
|
429
455
|
const priorSha = await readPathSha(environment, filename, opts);
|
|
430
456
|
const existing = priorSha ? await readBlobBySha(priorSha, opts) : null;
|
|
431
457
|
const content = `${existing ? `${existing.replace(/\n$/, "")}\n` : ""}${recordJson}\n`;
|
|
432
|
-
return await writeBlobToPath(environment, filename, content,
|
|
458
|
+
return await writeBlobToPath(environment, filename, content, commitMessage, {
|
|
433
459
|
...opts,
|
|
434
460
|
expectPriorPathSha: priorSha,
|
|
435
461
|
});
|
|
@@ -12,6 +12,10 @@ export * from "./unobserved-gate.js";
|
|
|
12
12
|
export * from "./receipt-plan.js";
|
|
13
13
|
export * from "./affected.js";
|
|
14
14
|
export * from "./release-ledger.js";
|
|
15
|
+
export * from "./release-join.js";
|
|
16
|
+
export * from "./retention-policy.js";
|
|
17
|
+
export * from "./delivery-metrics.js";
|
|
18
|
+
export { planLifecycleGc, runLifecycleGc, type GcFile, type GcKept, type GcKeepCode, type GcKeepReason, type GcKind, type GcReport, type LifecycleGcPlan } from "./retention.js";
|
|
15
19
|
export * from "./build-ledger.js";
|
|
16
20
|
export * from "./build-ledger-store.js";
|
|
17
21
|
export * from "./oras-referrer-lookup.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycle/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycle/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9K,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
|
package/dist/lifecycle/index.js
CHANGED
|
@@ -12,6 +12,10 @@ export * from "./unobserved-gate.js";
|
|
|
12
12
|
export * from "./receipt-plan.js";
|
|
13
13
|
export * from "./affected.js";
|
|
14
14
|
export * from "./release-ledger.js";
|
|
15
|
+
export * from "./release-join.js";
|
|
16
|
+
export * from "./retention-policy.js";
|
|
17
|
+
export * from "./delivery-metrics.js";
|
|
18
|
+
export { planLifecycleGc, runLifecycleGc } from "./retention.js";
|
|
15
19
|
export * from "./build-ledger.js";
|
|
16
20
|
export * from "./build-ledger-store.js";
|
|
17
21
|
export * from "./oras-referrer-lookup.js";
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether an environment runs a mix of releases, and the lines that settle
|
|
3
|
+
* it (#4035). Derived when read, from the environment's release ledger and
|
|
4
|
+
* its deploy outcomes (./deploy-outcome.ts); nothing here is written.
|
|
5
|
+
*
|
|
6
|
+
* Two things make an environment mixed:
|
|
7
|
+
*
|
|
8
|
+
* - a component is unsettled: the newest promote, rollback or redeploy that
|
|
9
|
+
* named it left it `failed` or `gated`, and the release ledger has no
|
|
10
|
+
* record of it newer than that run, so what it runs is not known;
|
|
11
|
+
* - the latest records of its components name more than one release, a
|
|
12
|
+
* record of no release counting as one value, and at least one names a
|
|
13
|
+
* release.
|
|
14
|
+
*
|
|
15
|
+
* The ledger already says per component what deployed, and with which
|
|
16
|
+
* release, so the second needs no record of its own. Only the first needs
|
|
17
|
+
* the outcome: a failed deploy writes no release record, by design, so the
|
|
18
|
+
* ledger alone can't tell a component that failed partway from one that was
|
|
19
|
+
* never touched.
|
|
20
|
+
*/
|
|
21
|
+
import type { ReleaseRecord } from "./release-ledger.js";
|
|
22
|
+
import type { DeployOutcome } from "./deploy-outcome.js";
|
|
23
|
+
/** One component of a mixed environment. */
|
|
24
|
+
export interface MixedComponent {
|
|
25
|
+
component: string;
|
|
26
|
+
/** The digest the release ledger records the component running, or null when it has no record in the environment. */
|
|
27
|
+
digest: string | null;
|
|
28
|
+
/** The release that record names, or null. */
|
|
29
|
+
releaseDigest: string | null;
|
|
30
|
+
releaseLabel: string | null;
|
|
31
|
+
/** `settled` when the ledger's record is what it runs; `failed` or `gated` when the newest run that named it left it so. */
|
|
32
|
+
state: "settled" | "failed" | "gated";
|
|
33
|
+
/** For an unsettled component, the run that left it so and what that run was deploying. Null when settled. */
|
|
34
|
+
attempt: {
|
|
35
|
+
verb: DeployOutcome["verb"];
|
|
36
|
+
runId: string;
|
|
37
|
+
timestamp: string;
|
|
38
|
+
digest: string;
|
|
39
|
+
releaseDigest: string | null;
|
|
40
|
+
releaseLabel: string | null;
|
|
41
|
+
} | null;
|
|
42
|
+
}
|
|
43
|
+
export interface MixedEnvironment {
|
|
44
|
+
/** Every component the ledger records or a run left unsettled, sorted by name. */
|
|
45
|
+
components: MixedComponent[];
|
|
46
|
+
/** `chant components redeploy <env> --component <c>` for each unsettled component the ledger records, which puts its recorded release back. */
|
|
47
|
+
redeploy: string[];
|
|
48
|
+
/** `chant components rollback <env> --release <label|digest>`, naming the release to go back to, or null when there is none to name. */
|
|
49
|
+
rollback: string | null;
|
|
50
|
+
}
|
|
51
|
+
/** What a reader knows about a release a rollback could go back to. */
|
|
52
|
+
export interface ReleaseCheck {
|
|
53
|
+
/** Its release file can still be read, so its templates can be deployed. */
|
|
54
|
+
kept: boolean;
|
|
55
|
+
/** Its commit is revoked (#4033), so it is refused. */
|
|
56
|
+
revoked: boolean;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The components a run left unsettled: for each, the newest outcome naming it
|
|
60
|
+
* `failed` or `gated` that no release record of it is newer than.
|
|
61
|
+
*/
|
|
62
|
+
export declare function unsettledComponents(records: readonly ReleaseRecord[], outcomes: readonly DeployOutcome[]): Map<string, {
|
|
63
|
+
outcome: DeployOutcome;
|
|
64
|
+
state: "failed" | "gated";
|
|
65
|
+
digest: string;
|
|
66
|
+
releaseDigest: string | null;
|
|
67
|
+
}>;
|
|
68
|
+
/**
|
|
69
|
+
* The newest release the environment's ledger names that a rollback can go
|
|
70
|
+
* back to: not in `exclude`, still kept, and not revoked. With `before`, only
|
|
71
|
+
* records older than that time count. Null when there is none.
|
|
72
|
+
*/
|
|
73
|
+
export declare function rollbackTarget(input: {
|
|
74
|
+
records: readonly ReleaseRecord[];
|
|
75
|
+
exclude: ReadonlySet<string>;
|
|
76
|
+
before?: string;
|
|
77
|
+
check: (releaseDigest: string) => Promise<ReleaseCheck>;
|
|
78
|
+
}): Promise<string | null>;
|
|
79
|
+
/** The line that rolls `env` back to a release, by its label when it has one. */
|
|
80
|
+
export declare function releaseRollbackLine(env: string, releaseDigest: string, label: string | null | undefined): string;
|
|
81
|
+
/** The line that redeploys one component's recorded release in `env`. */
|
|
82
|
+
export declare function redeployLine(env: string, component: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* The environment's mixed state, or null when it runs one release (or no
|
|
85
|
+
* release at all) and no component is unsettled.
|
|
86
|
+
*/
|
|
87
|
+
export declare function mixedEnvironment(input: {
|
|
88
|
+
env: string;
|
|
89
|
+
records: readonly ReleaseRecord[];
|
|
90
|
+
outcomes: readonly DeployOutcome[];
|
|
91
|
+
/** A release's label, or undefined. */
|
|
92
|
+
label: (releaseDigest: string) => Promise<string | undefined>;
|
|
93
|
+
check: (releaseDigest: string) => Promise<ReleaseCheck>;
|
|
94
|
+
}): Promise<MixedEnvironment | null>;
|
|
95
|
+
//# sourceMappingURL=mixed-environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixed-environment.d.ts","sourceRoot":"","sources":["../../src/lifecycle/mixed-environment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,qHAAqH;IACrH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,8CAA8C;IAC9C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,4HAA4H;IAC5H,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,8GAA8G;IAC9G,OAAO,EAAE;QACP,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,+IAA+I;IAC/I,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,wIAAwI;IACxI,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,IAAI,EAAE,OAAO,CAAC;IACd,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;CAClB;AAWD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,aAAa,EAAE,EACjC,QAAQ,EAAE,SAAS,aAAa,EAAE,GACjC,GAAG,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAiBlH;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACzD,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAczB;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAEhH;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,uCAAuC;IACvC,KAAK,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9D,KAAK,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACzD,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA2DnC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether an environment runs a mix of releases, and the lines that settle
|
|
3
|
+
* it (#4035). Derived when read, from the environment's release ledger and
|
|
4
|
+
* its deploy outcomes (./deploy-outcome.ts); nothing here is written.
|
|
5
|
+
*
|
|
6
|
+
* Two things make an environment mixed:
|
|
7
|
+
*
|
|
8
|
+
* - a component is unsettled: the newest promote, rollback or redeploy that
|
|
9
|
+
* named it left it `failed` or `gated`, and the release ledger has no
|
|
10
|
+
* record of it newer than that run, so what it runs is not known;
|
|
11
|
+
* - the latest records of its components name more than one release, a
|
|
12
|
+
* record of no release counting as one value, and at least one names a
|
|
13
|
+
* release.
|
|
14
|
+
*
|
|
15
|
+
* The ledger already says per component what deployed, and with which
|
|
16
|
+
* release, so the second needs no record of its own. Only the first needs
|
|
17
|
+
* the outcome: a failed deploy writes no release record, by design, so the
|
|
18
|
+
* ledger alone can't tell a component that failed partway from one that was
|
|
19
|
+
* never touched.
|
|
20
|
+
*/
|
|
21
|
+
function latest(records) {
|
|
22
|
+
const out = new Map();
|
|
23
|
+
for (const r of records) {
|
|
24
|
+
const current = out.get(r.component);
|
|
25
|
+
if (!current || r.timestamp >= current.timestamp)
|
|
26
|
+
out.set(r.component, r);
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The components a run left unsettled: for each, the newest outcome naming it
|
|
32
|
+
* `failed` or `gated` that no release record of it is newer than.
|
|
33
|
+
*/
|
|
34
|
+
export function unsettledComponents(records, outcomes) {
|
|
35
|
+
const newest = new Map();
|
|
36
|
+
for (const outcome of outcomes) {
|
|
37
|
+
for (const c of outcome.components) {
|
|
38
|
+
if (c.outcome !== "failed" && c.outcome !== "gated")
|
|
39
|
+
continue;
|
|
40
|
+
const seen = newest.get(c.component);
|
|
41
|
+
if (!seen || outcome.timestamp >= seen.outcome.timestamp) {
|
|
42
|
+
newest.set(c.component, { outcome, state: c.outcome, digest: c.digest, releaseDigest: c.releaseDigest });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const recorded = latest(records);
|
|
47
|
+
for (const [component, u] of newest) {
|
|
48
|
+
const r = recorded.get(component);
|
|
49
|
+
if (r && r.timestamp > u.outcome.timestamp)
|
|
50
|
+
newest.delete(component);
|
|
51
|
+
}
|
|
52
|
+
return newest;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The newest release the environment's ledger names that a rollback can go
|
|
56
|
+
* back to: not in `exclude`, still kept, and not revoked. With `before`, only
|
|
57
|
+
* records older than that time count. Null when there is none.
|
|
58
|
+
*/
|
|
59
|
+
export async function rollbackTarget(input) {
|
|
60
|
+
const ordered = input.records
|
|
61
|
+
.map((r, i) => ({ r, i }))
|
|
62
|
+
.filter(({ r }) => r.releaseDigest !== undefined && (input.before === undefined || r.timestamp < input.before))
|
|
63
|
+
.sort((a, b) => (a.r.timestamp === b.r.timestamp ? b.i - a.i : a.r.timestamp < b.r.timestamp ? 1 : -1));
|
|
64
|
+
const seen = new Set();
|
|
65
|
+
for (const { r } of ordered) {
|
|
66
|
+
const digest = r.releaseDigest;
|
|
67
|
+
if (seen.has(digest) || input.exclude.has(digest))
|
|
68
|
+
continue;
|
|
69
|
+
seen.add(digest);
|
|
70
|
+
const check = await input.check(digest);
|
|
71
|
+
if (check.kept && !check.revoked)
|
|
72
|
+
return digest;
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/** The line that rolls `env` back to a release, by its label when it has one. */
|
|
77
|
+
export function releaseRollbackLine(env, releaseDigest, label) {
|
|
78
|
+
return `chant components rollback ${env} --release ${label ?? releaseDigest}`;
|
|
79
|
+
}
|
|
80
|
+
/** The line that redeploys one component's recorded release in `env`. */
|
|
81
|
+
export function redeployLine(env, component) {
|
|
82
|
+
return `chant components redeploy ${env} --component ${component}`;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The environment's mixed state, or null when it runs one release (or no
|
|
86
|
+
* release at all) and no component is unsettled.
|
|
87
|
+
*/
|
|
88
|
+
export async function mixedEnvironment(input) {
|
|
89
|
+
const { env, records } = input;
|
|
90
|
+
const recorded = latest(records);
|
|
91
|
+
const unsettled = unsettledComponents(records, input.outcomes);
|
|
92
|
+
const releases = new Set([...recorded.values()].map((r) => r.releaseDigest ?? null));
|
|
93
|
+
const divergent = releases.size > 1 && [...releases].some((d) => d !== null);
|
|
94
|
+
if (unsettled.size === 0 && !divergent)
|
|
95
|
+
return null;
|
|
96
|
+
const labelOf = async (digest) => (digest ? ((await input.label(digest)) ?? null) : null);
|
|
97
|
+
const names = [...new Set([...recorded.keys(), ...unsettled.keys()])].sort();
|
|
98
|
+
const components = [];
|
|
99
|
+
for (const component of names) {
|
|
100
|
+
const r = recorded.get(component);
|
|
101
|
+
const u = unsettled.get(component);
|
|
102
|
+
components.push({
|
|
103
|
+
component,
|
|
104
|
+
digest: r?.digest ?? null,
|
|
105
|
+
releaseDigest: r?.releaseDigest ?? null,
|
|
106
|
+
releaseLabel: await labelOf(r?.releaseDigest),
|
|
107
|
+
state: u ? u.state : "settled",
|
|
108
|
+
attempt: u
|
|
109
|
+
? {
|
|
110
|
+
verb: u.outcome.verb,
|
|
111
|
+
runId: u.outcome.runId,
|
|
112
|
+
timestamp: u.outcome.timestamp,
|
|
113
|
+
digest: u.digest,
|
|
114
|
+
releaseDigest: u.releaseDigest,
|
|
115
|
+
releaseLabel: await labelOf(u.releaseDigest),
|
|
116
|
+
}
|
|
117
|
+
: null,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// The release the environment was moving to is not one to go back to: the
|
|
121
|
+
// one a run left components unsettled on, else, of the releases its
|
|
122
|
+
// components run, the one that reached the environment last.
|
|
123
|
+
const exclude = new Set();
|
|
124
|
+
if (unsettled.size > 0) {
|
|
125
|
+
for (const u of unsettled.values())
|
|
126
|
+
if (u.releaseDigest)
|
|
127
|
+
exclude.add(u.releaseDigest);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const firstSeen = new Map();
|
|
131
|
+
for (const r of records) {
|
|
132
|
+
if (r.releaseDigest === undefined)
|
|
133
|
+
continue;
|
|
134
|
+
const seen = firstSeen.get(r.releaseDigest);
|
|
135
|
+
if (seen === undefined || r.timestamp < seen)
|
|
136
|
+
firstSeen.set(r.releaseDigest, r.timestamp);
|
|
137
|
+
}
|
|
138
|
+
let arrived;
|
|
139
|
+
for (const d of releases) {
|
|
140
|
+
if (d === null)
|
|
141
|
+
continue;
|
|
142
|
+
if (arrived === undefined || firstSeen.get(d) > firstSeen.get(arrived))
|
|
143
|
+
arrived = d;
|
|
144
|
+
}
|
|
145
|
+
if (arrived !== undefined)
|
|
146
|
+
exclude.add(arrived);
|
|
147
|
+
}
|
|
148
|
+
const target = await rollbackTarget({ records, exclude, check: input.check });
|
|
149
|
+
return {
|
|
150
|
+
components,
|
|
151
|
+
redeploy: components.filter((c) => c.state !== "settled" && c.digest !== null).map((c) => redeployLine(env, c.component)),
|
|
152
|
+
rollback: target ? releaseRollbackLine(env, target, await labelOf(target)) : null,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a publish attaches to what it publishes (#4049): an SBOM and the
|
|
3
|
+
* release's provenance statement.
|
|
4
|
+
*
|
|
5
|
+
* The provenance statement is an in-toto Statement v1 whose predicate
|
|
6
|
+
* (`https://intentius.io/chant/release/v1`) names the release, its commit,
|
|
7
|
+
* and the cut that signed it, with the cut's ssh signature in the
|
|
8
|
+
* `chant-release` namespace. Anyone holding the repository checks that
|
|
9
|
+
* signature offline with `chant release verify`, against
|
|
10
|
+
* `.chant/allowed_signers` at the release's commit. The predicate also says
|
|
11
|
+
* whether the run had an OIDC token: in CI, the provenance a registry records
|
|
12
|
+
* (npm's `--provenance`) is signed with it, and from a workstation the
|
|
13
|
+
* release's signature is the only provenance there is.
|
|
14
|
+
*
|
|
15
|
+
* The SBOM is an SPDX or CycloneDX JSON document. A target attaches the file
|
|
16
|
+
* its declaration's `sbom` names; with none named, the OCI and forge targets
|
|
17
|
+
* write one from the member's `package-lock.json` or `pom.xml` with the
|
|
18
|
+
* hermetic writer `generate-sbom` uses (../components/verbs/bom-writer.ts),
|
|
19
|
+
* dated with the cut's time, so a publish run again writes the same bytes.
|
|
20
|
+
* `sbom: false` publishes without one. The npm target carries its SBOM in
|
|
21
|
+
* each package instead, since a registry keeps no file beside a package
|
|
22
|
+
* (./publish-npm.ts).
|
|
23
|
+
*
|
|
24
|
+
* Both are written as sorted JSON, so the same release attaches the same
|
|
25
|
+
* bytes on every run, and a resumed stage finds what an earlier run sent.
|
|
26
|
+
*/
|
|
27
|
+
import { type PublishContext } from "./release-publish.js";
|
|
28
|
+
/** The in-toto statement type the provenance statement is. */
|
|
29
|
+
export declare const IN_TOTO_STATEMENT_TYPE = "https://in-toto.io/Statement/v1";
|
|
30
|
+
/** The predicate type of chant's release provenance. */
|
|
31
|
+
export declare const RELEASE_PREDICATE_TYPE = "https://intentius.io/chant/release/v1";
|
|
32
|
+
/** The media type an in-toto statement is attached under. */
|
|
33
|
+
export declare const IN_TOTO_MEDIA_TYPE = "application/vnd.in-toto+json";
|
|
34
|
+
/** The file name the provenance statement is attached under. */
|
|
35
|
+
export declare const PROVENANCE_FILE = "release.intoto.json";
|
|
36
|
+
/** The file name of an SBOM chant writes from a lockfile. */
|
|
37
|
+
export declare const GENERATED_SBOM_FILE = "sbom.spdx.json";
|
|
38
|
+
/** The names an npm package's own SBOM is looked for under, at its root, when the declaration names none. */
|
|
39
|
+
export declare const PACKAGE_SBOM_FILES: readonly ["sbom.spdx.json", "sbom.cdx.json", "sbom.cyclonedx.json"];
|
|
40
|
+
/** One file attached to what a target publishes. */
|
|
41
|
+
export interface Attachment {
|
|
42
|
+
kind: "sbom" | "provenance";
|
|
43
|
+
/** The file name it is attached under. */
|
|
44
|
+
name: string;
|
|
45
|
+
mediaType: string;
|
|
46
|
+
bytes: Uint8Array;
|
|
47
|
+
digest: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The provenance statement for `subjects`, the digests of what the target
|
|
51
|
+
* publishes. Every value in it comes from the release, its cut and the run's
|
|
52
|
+
* OIDC check, never from the clock, so it is the same bytes on every run.
|
|
53
|
+
*/
|
|
54
|
+
export declare function releaseProvenance(ctx: PublishContext, subjects: ReadonlyArray<{
|
|
55
|
+
name: string;
|
|
56
|
+
digest: string;
|
|
57
|
+
}>): Attachment;
|
|
58
|
+
/** The media type of an SBOM document, or null when `bytes` is neither SPDX nor CycloneDX JSON. */
|
|
59
|
+
export declare function sbomMediaType(bytes: Uint8Array): string | null;
|
|
60
|
+
/**
|
|
61
|
+
* The SBOM a target attaches, for an OCI image or a forge release: the file
|
|
62
|
+
* `declared` names (relative to the member, checked against the release's
|
|
63
|
+
* digest when the release records it), else one written from the member's
|
|
64
|
+
* lockfile for `subject`. Null when `declared` is `false`. Throws
|
|
65
|
+
* `publish-sbom-missing` when there is neither.
|
|
66
|
+
*/
|
|
67
|
+
export declare function memberSbom(ctx: PublishContext, declared: string | false | undefined, subject: string, target: string): Attachment | null;
|
|
68
|
+
/**
|
|
69
|
+
* The SBOM an npm package carries at its root: the file `declared` names, else
|
|
70
|
+
* the first of {@link PACKAGE_SBOM_FILES} it holds, in a package directory or
|
|
71
|
+
* under `package/` in a packed `.tgz`. Null when `declared` is `false`.
|
|
72
|
+
* Throws `publish-sbom-missing` when the package has none, and
|
|
73
|
+
* `publish-sbom-invalid` when it is not SPDX or CycloneDX JSON.
|
|
74
|
+
*/
|
|
75
|
+
export declare function packageSbom(abs: string, isDirectory: boolean, path: string, name: string, declared: string | false | undefined): {
|
|
76
|
+
file: string;
|
|
77
|
+
digest: string;
|
|
78
|
+
} | null;
|
|
79
|
+
//# sourceMappingURL=publish-attachments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-attachments.d.ts","sourceRoot":"","sources":["../../src/lifecycle/publish-attachments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAUH,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG5E,8DAA8D;AAC9D,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AACxE,wDAAwD;AACxD,eAAO,MAAM,sBAAsB,0CAA0C,CAAC;AAC9E,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,iCAAiC,CAAC;AACjE,gEAAgE;AAChE,eAAO,MAAM,eAAe,wBAAwB,CAAC;AACrD,6DAA6D;AAC7D,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AACpD,6GAA6G;AAC7G,eAAO,MAAM,kBAAkB,YAAI,gBAAgB,EAAE,eAAe,EAAE,qBAAqB,CAAU,CAAC;AAEtG,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IAC5B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,UAAU,CAgB5H;AAED,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAW9D;AAyBD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CA2BxI;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA2BxK"}
|