rampway 0.5.28 → 0.5.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/README.md +15 -1
- package/build/src/cli.d.ts.map +1 -1
- package/build/src/cli.js +10 -0
- package/build/src/cli.js.map +1 -1
- package/build/src/commands/recover-generation-transition.d.ts +6 -0
- package/build/src/commands/recover-generation-transition.d.ts.map +1 -0
- package/build/src/commands/recover-generation-transition.js +18 -0
- package/build/src/commands/recover-generation-transition.js.map +1 -0
- package/build/src/core/deploy-runner.d.ts.map +1 -1
- package/build/src/core/deploy-runner.js +190 -39
- package/build/src/core/deploy-runner.js.map +1 -1
- package/build/src/core/recover-generation-transition.d.ts +17 -0
- package/build/src/core/recover-generation-transition.d.ts.map +1 -0
- package/build/src/core/recover-generation-transition.js +91 -0
- package/build/src/core/recover-generation-transition.js.map +1 -0
- package/build/src/core/release-manager.d.ts +43 -0
- package/build/src/core/release-manager.d.ts.map +1 -1
- package/build/src/core/release-manager.js +162 -1
- package/build/src/core/release-manager.js.map +1 -1
- package/build/src/core/runtime-errors.d.ts +4 -4
- package/build/src/core/runtime-errors.d.ts.map +1 -1
- package/build/src/core/runtime-errors.js +2 -2
- package/build/src/core/runtime-errors.js.map +1 -1
- package/build/src/runtimes/none-runtime.d.ts +2 -0
- package/build/src/runtimes/none-runtime.d.ts.map +1 -1
- package/build/src/runtimes/none-runtime.js +4 -0
- package/build/src/runtimes/none-runtime.js.map +1 -1
- package/build/src/runtimes/rollbridge-runtime.d.ts +36 -3
- package/build/src/runtimes/rollbridge-runtime.d.ts.map +1 -1
- package/build/src/runtimes/rollbridge-runtime.js +123 -24
- package/build/src/runtimes/rollbridge-runtime.js.map +1 -1
- package/build/src/test-helpers.d.ts +4 -2
- package/build/src/test-helpers.d.ts.map +1 -1
- package/build/src/test-helpers.js +5 -5
- package/build/src/test-helpers.js.map +1 -1
- package/build/src/types.d.ts +34 -1
- package/build/src/types.d.ts.map +1 -1
- package/docs/config-reference.md +12 -0
- package/docs/failed-generation-recovery.md +44 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -107,6 +107,7 @@ rampway production runtime-validate
|
|
|
107
107
|
rampway production runtime-status
|
|
108
108
|
rampway production runtime-logs
|
|
109
109
|
rampway production runtime-recover --yes
|
|
110
|
+
rampway production runtime-recover-generation-transition <failed-release-id> --yes
|
|
110
111
|
|
|
111
112
|
# Local foreground host-restart entrypoint for the last accepted release
|
|
112
113
|
rampway production runtime-boot --config /absolute/path/rampway.config.mjs
|
|
@@ -115,6 +116,12 @@ rampway production runtime-boot --config /absolute/path/rampway.config.mjs
|
|
|
115
116
|
The older `rollbridge-validate`, `rollbridge-status`, `rollbridge-logs`, and
|
|
116
117
|
`rollbridge-recover` names remain aliases for Rollbridge stages.
|
|
117
118
|
|
|
119
|
+
Use [exact failed-generation recovery](docs/failed-generation-recovery.md) when
|
|
120
|
+
a Rollbridge deploy timed out or failed before publication and retained its
|
|
121
|
+
candidate transition fence. Recovery supports stages without an explicit
|
|
122
|
+
`runtime.config`, and later successful Rollbridge deploys refresh live retained
|
|
123
|
+
release pins before cleanup.
|
|
124
|
+
|
|
118
125
|
### Deploy transports
|
|
119
126
|
|
|
120
127
|
Deploys run over one of three transports selected with `--transport`:
|
|
@@ -409,11 +416,18 @@ Every successful deploy, rollback, or resumed publication appends one JSON objec
|
|
|
409
416
|
- `healthChecks: "passed"`
|
|
410
417
|
- sanitized runtime status
|
|
411
418
|
- `cleanupRemoved` release IDs
|
|
419
|
+
- optional `warnings` for non-fatal maintenance failures after runtime acceptance
|
|
412
420
|
|
|
413
421
|
Rollback events include `event: "rollback"`, target `releaseId` and `revision`,
|
|
414
422
|
`rolledBackAt`, `durationMs`, `previousRelease`, `healthChecks: "passed"`, and a
|
|
415
423
|
sanitized runtime result. Reports intentionally record runtime result summaries,
|
|
416
|
-
not runtime configuration or secrets.
|
|
424
|
+
not runtime configuration or secrets. A provisional cleanup-pin removal failure
|
|
425
|
+
is reported as a warning and retained for later reconciliation; it does not turn
|
|
426
|
+
an already-accepted runtime activation into a failed deploy or rollback. Rampway
|
|
427
|
+
stores provisional pins outside accepted runtime state and clears only the pins
|
|
428
|
+
owned by the exact runtime configuration that positively reports its live
|
|
429
|
+
release references. Runtime changes preserve the previous owner's pins, and
|
|
430
|
+
runtimes without reference reporting retain their unresolved pins.
|
|
417
431
|
|
|
418
432
|
Resumed-publication events use `event: "resume-publication"`, `resumedAt`, the
|
|
419
433
|
exact target and previous release identities, `healthChecks: "passed"`, the
|
package/build/src/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":";0CAmBwC,iCAAiC;AA0CzE;;;GAGG;AACH,2BAHW,MAAM,EAAE,GACN,OAAO,CAAC,IAAI,CAAC,CAmCzB;AAED;;;;;;;GAOG;AACH,wCAHW,MAAM,EAAE,GACN;IAAC,OAAO,EAAE,MAAM,GAAC,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,GAAC,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,QAAQ,EAAE,cAAc,CAAA;CAAC,CA+C9G"}
|
package/build/src/cli.js
CHANGED
|
@@ -8,6 +8,7 @@ import { deployCommand } from "./commands/deploy.js";
|
|
|
8
8
|
import { releasesCommand, statusCommand } from "./commands/releases.js";
|
|
9
9
|
import { rollbackCommand } from "./commands/rollback.js";
|
|
10
10
|
import { resumePublicationCommand } from "./commands/resume-publication.js";
|
|
11
|
+
import { runtimeRecoverGenerationTransitionCommand } from "./commands/recover-generation-transition.js";
|
|
11
12
|
import { rollbridgeValidateCommand, rollbridgeStatusCommand, rollbridgeLogsCommand, rollbridgeRecoverCommand, runtimeValidateCommand, runtimeStatusCommand, runtimeLogsCommand, runtimeRecoverCommand } from "./commands/rollbridge.js";
|
|
12
13
|
import { tasksCommand } from "./commands/tasks.js";
|
|
13
14
|
import { taskCommand } from "./commands/task.js";
|
|
@@ -38,6 +39,7 @@ const COMMANDS = {
|
|
|
38
39
|
"runtime-status": runtimeStatusCommand,
|
|
39
40
|
"runtime-logs": runtimeLogsCommand,
|
|
40
41
|
"runtime-recover": runtimeRecoverCommand,
|
|
42
|
+
"runtime-recover-generation-transition": runtimeRecoverGenerationTransitionCommand,
|
|
41
43
|
"runtime-boot": runtimeBootCommand,
|
|
42
44
|
doctor: doctorCommand
|
|
43
45
|
};
|
|
@@ -134,6 +136,14 @@ function resolveInvocation(argv) {
|
|
|
134
136
|
throw new Error(`Command 'resume-publication' does not support option --${toKebab(unsupported[0])}.`);
|
|
135
137
|
options.releaseId = operands[0];
|
|
136
138
|
}
|
|
139
|
+
else if (command === "runtime-recover-generation-transition") {
|
|
140
|
+
if (operands.length !== 1)
|
|
141
|
+
throw new Error("Command 'runtime-recover-generation-transition' requires exactly one failed release ID.");
|
|
142
|
+
const unsupported = Object.keys(options).filter(option => !["config", "json", "sshForwardAgent", "yes"].includes(option));
|
|
143
|
+
if (unsupported.length > 0)
|
|
144
|
+
throw new Error(`Command 'runtime-recover-generation-transition' does not support option --${toKebab(unsupported[0])}.`);
|
|
145
|
+
options.releaseId = operands[0];
|
|
146
|
+
}
|
|
137
147
|
else if (command === "task") {
|
|
138
148
|
if (operands.length !== 1)
|
|
139
149
|
throw new Error("Command 'task' requires exactly one task name.");
|
package/build/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":";AACA,OAAO,EAAC,YAAY,EAAC,MAAM,SAAS,CAAA;AACpC,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAA;AAEtC,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAC,eAAe,EAAE,aAAa,EAAC,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAC,wBAAwB,EAAC,MAAM,kCAAkC,CAAA;AACzE,OAAO,EAAC,yCAAyC,EAAC,MAAM,6CAA6C,CAAA;AACrG,OAAO,EAAC,yBAAyB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,qBAAqB,EAAC,MAAM,0BAA0B,CAAA;AACrO,OAAO,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAC,0BAA0B,EAAC,MAAM,6BAA6B,CAAA;AACtE,OAAO,EAAC,0BAA0B,EAAE,qBAAqB,EAAC,MAAM,uBAAuB,CAAA;AACvF,OAAO,EAAC,yBAAyB,EAAC,MAAM,iCAAiC,CAAA;AACzE,OAAO,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAA;AAElD,OAAO,EAAC,yBAAyB,EAAC,CAAA;AAElC,uCAAuC;AACvC,MAAM,QAAQ,GAAG;IACf,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,eAAe;IACzB,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,aAAa;IACrB,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,YAAY;IACnB,QAAQ,EAAE,eAAe;IACzB,oBAAoB,EAAE,wBAAwB;IAC9C,qBAAqB,EAAE,yBAAyB;IAChD,mBAAmB,EAAE,uBAAuB;IAC5C,iBAAiB,EAAE,qBAAqB;IACxC,oBAAoB,EAAE,wBAAwB;IAC9C,kBAAkB,EAAE,sBAAsB;IAC1C,gBAAgB,EAAE,oBAAoB;IACtC,cAAc,EAAE,kBAAkB;IAClC,iBAAiB,EAAE,qBAAqB;IACxC,uCAAuC,EAAE,yCAAyC;IAClF,cAAc,EAAE,kBAAkB;IAClC,MAAM,EAAE,aAAa;CACtB,CAAA;AAED;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AAE5C,uBAAuB;AACvB,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAA;AAE7F,MAAM,KAAK,GAAG,8HAA8H,CAAA;AAE5I;;;GAGG;AACH,KAAK,UAAU,IAAI,CAAC,IAAI;IACtB,MAAM,EAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;IAE7D,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAA;IACpC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,iBAAiB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvH,IAAI,CAAC,SAAS,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,sDAAsD,OAAO,GAAG,CAAC,CAAA;IAE5K,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAC,SAAS,EAAE,OAAO,EAAC,CAAC,CAAA;QAC7C,OAAM;IACR,CAAC;IACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAC,SAAS,EAAE,OAAO,EAAC,CAAC,CAAA;QAC7C,OAAM;IACR,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;IACxF,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QAC/B,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QAChI,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAC,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAC,CAAC,CAAA;QAC/E,OAAM;IACR,CAAC;IACD,MAAM,cAAc,GAAG,oEAAoE,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;IAC7M,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB;;;;WAIG;QACH,MAAM,kBAAkB,GAAG,QAAQ,CAAC,EAAE,CAAC,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAC,aAAa,EAAE,IAAI,EAAC,CAAC,CAAA;QAC3G,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAC,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAC,CAAC,CAAA;QACjF,OAAM;IACR,CAAC;IACD,MAAM,yBAAyB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAC,SAAS,EAAE,OAAO,EAAE,cAAc,EAAC,CAAC,EAAE,EAAC,aAAa,EAAE,IAAI,EAAC,CAAC,CAAA;AACjI,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,IAAI;IAC7B,MAAM,EAAC,UAAU,EAAE,OAAO,EAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAE7C,qCAAqC;IACrC,IAAI,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,sBAAsB,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;QAC7H,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAA;QAC/G,OAAO,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAC,CAAA;IAChE,CAAC;IAED,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAA;IACpD,IAAI,OAAO,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;QACrG,IAAI,OAAO,OAAO,CAAC,sBAAsB,KAAK,QAAQ,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAA;IAC3N,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC/C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,iCAAiC,CAAC,CAAA;QAC9F,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;YAC1E,CAAC;YACD,gEAAgE;YAChE,wEAAwE;YACxE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,KAAK,oBAAoB,EAAE,CAAC;QAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;QAC3G,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;QAClH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACjI,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACjC,CAAC;SAAM,IAAI,OAAO,KAAK,uCAAuC,EAAE,CAAC;QAC/D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAA;QACrI,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;QACzH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6EAA6E,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACpJ,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACjC,CAAC;SAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC9B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;QAC5F,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAChH,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/F,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACnH,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC5B,CAAC;SAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,wCAAwC,CAAC,CAAA;IAC9E,CAAC;IACD,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAC,CAAA;AACtC,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAI;IACrB,MAAM,UAAU,GAAG,EAAE,CAAA;IACrB,uDAAuD;IACvD,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,UAAU,CAAC,6BAA6B,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAA;YACtH,CAAC;YACD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACzB,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAA;iBAC1D,CAAC;gBACJ,KAAK,IAAI,CAAC,CAAA;gBACV,IAAI,IAAI,KAAK,0BAA0B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAA;gBAC7M,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;;YAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,EAAC,UAAU,EAAE,OAAO,EAAE,8CAA8C,CAAC,CAAC,OAAO,CAAC,EAAC,CAAA;AACxF,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,IAAI;IACnB,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;AACvE,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,IAAI;IACnB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;AACrE,CAAC;AAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9F,IAAI,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC5B,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;;YACpD,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,OAAO,EAAC,IAAI,EAAE,iBAAiB,EAAC,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {import('#types').CommandArgs} args
|
|
3
|
+
* @returns {Promise<void>}
|
|
4
|
+
*/
|
|
5
|
+
export function runtimeRecoverGenerationTransitionCommand({ stageName, options, commandContext }: import("#types").CommandArgs): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=recover-generation-transition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recover-generation-transition.d.ts","sourceRoot":"","sources":["../../../src/commands/recover-generation-transition.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH,kGAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAWzB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { commandContext as defaultCommandContext } from "./context.js";
|
|
2
|
+
import { recoverGenerationTransition } from "../core/recover-generation-transition.js";
|
|
3
|
+
/**
|
|
4
|
+
* @param {import('#types').CommandArgs} args
|
|
5
|
+
* @returns {Promise<void>}
|
|
6
|
+
*/
|
|
7
|
+
export async function runtimeRecoverGenerationTransitionCommand({ stageName, options, commandContext = defaultCommandContext }) {
|
|
8
|
+
if (!options.yes && stageName === "production")
|
|
9
|
+
throw new Error("Refusing production failed-generation recovery without --yes in non-interactive mode.");
|
|
10
|
+
const { stage, transport } = await commandContext(options, stageName);
|
|
11
|
+
const result = await recoverGenerationTransition({
|
|
12
|
+
releaseId: /** @type {string} */ (options.releaseId),
|
|
13
|
+
stage,
|
|
14
|
+
transport
|
|
15
|
+
});
|
|
16
|
+
console.log(JSON.stringify(result, null, 2));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=recover-generation-transition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recover-generation-transition.js","sourceRoot":"","sources":["../../../src/commands/recover-generation-transition.js"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,IAAI,qBAAqB,EAAC,MAAM,cAAc,CAAA;AACpE,OAAO,EAAC,2BAA2B,EAAC,MAAM,0CAA0C,CAAA;AAEpF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,yCAAyC,CAAC,EAAC,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,qBAAqB,EAAC;IAC1H,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,SAAS,KAAK,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAA;IACxJ,MAAM,EAAC,KAAK,EAAE,SAAS,EAAC,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACnE,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;QAC/C,SAAS,EAAE,qBAAqB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACpD,KAAK;QACL,SAAS;KACV,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC9C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-runner.d.ts","sourceRoot":"","sources":["../../../src/core/deploy-runner.js"],"names":[],"mappings":"AAmCA;;;;GAIG;AACH,wCAJW,OAAO,QAAQ,EAAE,WAAW,oDAC5B;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAC,GACtE,MAAM,EAAE,CAIpB;AAED;;;;GAIG;AACH,+CAJW,OAAO,QAAQ,EAAE,WAAW,oDAC5B;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAC,GACtE,OAAO,QAAQ,EAAE,cAAc,EAAE,CAqB7C;AAaD;;;GAGG;AACH,uIAHW,OAAO,QAAQ,EAAE,aAAa,GAC5B,OAAO,CAAC,OAAO,QAAQ,EAAE,YAAY,GAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"deploy-runner.d.ts","sourceRoot":"","sources":["../../../src/core/deploy-runner.js"],"names":[],"mappings":"AAmCA;;;;GAIG;AACH,wCAJW,OAAO,QAAQ,EAAE,WAAW,oDAC5B;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAC,GACtE,MAAM,EAAE,CAIpB;AAED;;;;GAIG;AACH,+CAJW,OAAO,QAAQ,EAAE,WAAW,oDAC5B;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAC,GACtE,OAAO,QAAQ,EAAE,cAAc,EAAE,CAqB7C;AAaD;;;GAGG;AACH,uIAHW,OAAO,QAAQ,EAAE,aAAa,GAC5B,OAAO,CAAC,OAAO,QAAQ,EAAE,YAAY,GAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAC,CAAC,CA+RnE;AAED;;;GAGG;AACH,6DAHW;IAAC,SAAS,EAAE,OAAO,QAAQ,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,QAAQ,EAAE,WAAW,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAC,GAC5G,OAAO,CAAC,OAAO,QAAQ,EAAE,cAAc,CAAC,CAoJpD;AAED;;;;;;;GAOG;AACH,6EAHW;IAAC,SAAS,EAAE,OAAO,QAAQ,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,QAAQ,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAC,GAClH,OAAO,CAAC,OAAO,QAAQ,EAAE,uBAAuB,CAAC,CA4G7D;AA0VD;;;GAGG;AACH,6FAHW;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,QAAQ,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAC,GAClH,MAAM,CAqBlB;yBA3+BsB,eAAe"}
|
|
@@ -6,7 +6,7 @@ import { Reporter } from "./reporter.js";
|
|
|
6
6
|
import { releaseIdFromDate } from "./release-id.js";
|
|
7
7
|
import { deployPaths } from "./paths.js";
|
|
8
8
|
import { acquireLock, releaseLock } from "./locks.js";
|
|
9
|
-
import { ensureBaseDirs, prepareSharedLinks, publishCurrent, cleanupReleases, currentReleaseId, previousRelease, readReleaseRevision, requireCurrentRelease, resolveRetainedRelease } from "./release-manager.js";
|
|
9
|
+
import { ensureBaseDirs, prepareSharedLinks, publishCurrent, cleanupReleases, currentReleaseId, previousRelease, readReleaseRevision, requireCurrentRelease, requireReleaseMetadata, resolveRetainedRelease, pinRuntimeReleaseForCleanup, clearRuntimeReleasePinsForCleanup } from "./release-manager.js";
|
|
10
10
|
import { runTasks } from "./task-runner.js";
|
|
11
11
|
import { runHealthChecks } from "./health-checks.js";
|
|
12
12
|
import { runHooks } from "./hooks.js";
|
|
@@ -111,6 +111,8 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
|
|
|
111
111
|
/** @type {object|undefined} */
|
|
112
112
|
let runtimeResult;
|
|
113
113
|
let deployedRevision = releaseRevision;
|
|
114
|
+
/** @type {string[]} */
|
|
115
|
+
const warnings = [];
|
|
114
116
|
const runtime = runtimeFor(stage);
|
|
115
117
|
reporter.line(`Deploying ${stage.application}/${stage.stageName} revision ${releaseRevision} as release ${releaseId}`);
|
|
116
118
|
await runHooks(transport, stage, null, "before_deploy");
|
|
@@ -132,6 +134,7 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
|
|
|
132
134
|
const current = await requireCurrentRelease(transport, stage);
|
|
133
135
|
const currentRevision = await readReleaseRevision(transport, current.releasePath);
|
|
134
136
|
if (currentRevision.toLowerCase() === deployedRevision.toLowerCase()) {
|
|
137
|
+
warnings.push(...await reconcileRuntimeReleasePinsForIdempotentDeploy(runtime, transport, stage, current, currentRevision, reporter));
|
|
135
138
|
reporter.line(` * Revision ${currentRevision} is already active as release ${current.releaseId}; skipping release and runtime lifecycle`);
|
|
136
139
|
const report = {
|
|
137
140
|
application: stage.application,
|
|
@@ -144,7 +147,8 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
|
|
|
144
147
|
durationMs: Date.now() - startedAt.getTime(),
|
|
145
148
|
healthChecks: "unchanged",
|
|
146
149
|
cleanupRemoved: [],
|
|
147
|
-
idempotent: true
|
|
150
|
+
idempotent: true,
|
|
151
|
+
...(warnings.length > 0 ? { warnings } : {})
|
|
148
152
|
};
|
|
149
153
|
await appendReport(transport, stage, report);
|
|
150
154
|
return report;
|
|
@@ -203,6 +207,10 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
|
|
|
203
207
|
previousRuntimeRelease = { releaseId: activeReleaseId, revision: previousRevision, runtime: previousSnapshot };
|
|
204
208
|
}
|
|
205
209
|
}
|
|
210
|
+
await preserveSupersededRuntimeReferences(transport, stage, currentRuntimeState, activeReleaseId);
|
|
211
|
+
// Keep accepted state immutable while the candidate may become live before
|
|
212
|
+
// Rampway can read the runtime owner's references.
|
|
213
|
+
await pinRuntimeReleaseForCleanup(transport, stage, runtimeSnapshot, releaseId);
|
|
206
214
|
runtimeAttempted = true;
|
|
207
215
|
runtimeResult = await runtime.deploy(transport, {
|
|
208
216
|
releasePath,
|
|
@@ -229,11 +237,15 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
|
|
|
229
237
|
await runHooks(transport, stage, releasePath, "after_health", { previousReleasePath });
|
|
230
238
|
const previous = await currentReleaseId(transport, stage);
|
|
231
239
|
await runHooks(transport, stage, releasePath, "before_publish", { previousReleasePath });
|
|
240
|
+
const referencedReleaseIds = await readRuntimeReferencesBeforePublication(runtime, transport, stage, { releaseId, revision: deployedRevision, runtime: runtimeSnapshot }, runtimeResult);
|
|
232
241
|
let publicationAttempted = false;
|
|
233
242
|
/** @type {import('#types').RuntimeBootState|undefined} */
|
|
234
243
|
let acceptedBoot;
|
|
235
244
|
try {
|
|
236
|
-
await writeRuntimeState(transport, stage, { releaseId, revision: deployedRevision, runtime: runtimeSnapshot }, {
|
|
245
|
+
await writeRuntimeState(transport, stage, { releaseId, revision: deployedRevision, runtime: runtimeSnapshot }, {
|
|
246
|
+
retain: previousRuntimeRelease ? [previousRuntimeRelease] : [],
|
|
247
|
+
referencedReleaseIds
|
|
248
|
+
});
|
|
237
249
|
if (runtime.commit)
|
|
238
250
|
await runtime.commit(transport, { snapshot: runtimeSnapshot });
|
|
239
251
|
reporter.line(" * Publishing current symlink");
|
|
@@ -273,23 +285,31 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
|
|
|
273
285
|
await runHealthChecks(transport, stage.healthChecks, previousReleasePath);
|
|
274
286
|
if (publicationAttempted)
|
|
275
287
|
await publishCurrent(transport, stage, previousReleasePath);
|
|
276
|
-
await
|
|
288
|
+
await writeRuntimeStateWithLiveReferences(runtime, transport, stage, { releaseId: activeReleaseId, revision: previousRevision, runtime: restorationSnapshot });
|
|
277
289
|
if (runtime.commit)
|
|
278
290
|
await runtime.commit(transport, { snapshot: restorationSnapshot });
|
|
279
291
|
runtimeRestored = true;
|
|
280
292
|
}
|
|
281
293
|
catch (error) {
|
|
282
|
-
|
|
294
|
+
const restorationError = /** @type {Error} */ (error);
|
|
295
|
+
if (isRuntimeIncumbentPreservedError(restorationError) && restorationError.recovery) {
|
|
296
|
+
await persistRuntimeRecoveryPins(transport, stage, previousRuntimeRelease?.runtime ?? currentRuntimeSnapshot ?? runtimeSnapshot, restorationError.recovery);
|
|
297
|
+
}
|
|
298
|
+
throw new Error(`${transitionError.message}\nRestoration of previous release '${activeReleaseId}' also failed: ${restorationError.message}`, { cause: transitionError });
|
|
283
299
|
}
|
|
284
300
|
throw new Error(`${transitionError.message}\nPrevious release '${activeReleaseId}' was reactivated and health-checked; current ${publicationAttempted ? "was republished" : "was not changed"}.`, { cause: transitionError });
|
|
285
301
|
}
|
|
286
|
-
await completeRuntimeOwnerHandoff(runtime, transport, stage, lock, acceptedBoot, { releaseId, revision: deployedRevision, runtime: runtimeSnapshot }, runtimeResult);
|
|
302
|
+
const handoffReferencesPersisted = await completeRuntimeOwnerHandoff(runtime, transport, stage, lock, acceptedBoot, { releaseId, revision: deployedRevision, runtime: runtimeSnapshot }, runtimeResult);
|
|
303
|
+
warnings.push(...await reconcileRuntimeReleasePinsAfterAcceptance(transport, stage, reporter, {
|
|
304
|
+
referencesAuthoritative: referencedReleaseIds !== undefined || handoffReferencesPersisted,
|
|
305
|
+
runtimeSnapshot
|
|
306
|
+
}));
|
|
287
307
|
await runHooks(transport, stage, releasePath, "after_publish", { previousReleasePath });
|
|
288
308
|
await runHooks(transport, stage, releasePath, "before_cleanup", { previousReleasePath });
|
|
289
309
|
reporter.line(` * Cleaning up old releases keeping ${stage.keepReleases}`);
|
|
290
310
|
const removed = await cleanupReleases(transport, stage);
|
|
291
311
|
await runHooks(transport, stage, releasePath, "after_cleanup", { previousReleasePath });
|
|
292
|
-
const report = { application: stage.application, stage: stage.stageName, releaseId, revision: deployedRevision, branch, deployedAt: new Date().toISOString(), event: "deploy", durationMs: Date.now() - startedAt.getTime(), previousRelease: previous ?? undefined, healthChecks: "passed", runtime: sanitizeRuntimeResult(runtimeResult, stage), cleanupRemoved: removed };
|
|
312
|
+
const report = { application: stage.application, stage: stage.stageName, releaseId, revision: deployedRevision, branch, deployedAt: new Date().toISOString(), event: "deploy", durationMs: Date.now() - startedAt.getTime(), previousRelease: previous ?? undefined, healthChecks: "passed", runtime: sanitizeRuntimeResult(runtimeResult, stage), cleanupRemoved: removed, ...(warnings.length > 0 ? { warnings } : {}) };
|
|
293
313
|
await appendReport(transport, stage, report);
|
|
294
314
|
return report;
|
|
295
315
|
}
|
|
@@ -306,6 +326,9 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
|
|
|
306
326
|
failureHookError = /** @type {Error} */ (hookError);
|
|
307
327
|
}
|
|
308
328
|
if (isRuntimeIncumbentPreservedError(err)) {
|
|
329
|
+
if (err.recovery) {
|
|
330
|
+
await persistRuntimeRecoveryPins(transport, stage, runtimeSnapshot, err.recovery);
|
|
331
|
+
}
|
|
309
332
|
restorationMessage = "The incumbent runtime remains authoritative; automatic runtime restoration was not attempted.";
|
|
310
333
|
}
|
|
311
334
|
else if (isRuntimeRecoveryFailedError(err)) {
|
|
@@ -328,7 +351,7 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
|
|
|
328
351
|
deferCommit: true
|
|
329
352
|
});
|
|
330
353
|
await runHealthChecks(transport, stage.healthChecks, previousReleasePath);
|
|
331
|
-
await
|
|
354
|
+
await writeRuntimeStateWithLiveReferences(runtime, transport, stage, previousRuntimeRelease);
|
|
332
355
|
if (runtime.commit)
|
|
333
356
|
await runtime.commit(transport, { snapshot: previousRuntimeRelease.runtime });
|
|
334
357
|
runtimeRestored = true;
|
|
@@ -336,6 +359,9 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
|
|
|
336
359
|
}
|
|
337
360
|
catch (restoreError) {
|
|
338
361
|
restorationError = /** @type {Error} */ (restoreError);
|
|
362
|
+
if (isRuntimeIncumbentPreservedError(restorationError) && restorationError.recovery) {
|
|
363
|
+
await persistRuntimeRecoveryPins(transport, stage, previousRuntimeRelease.runtime, restorationError.recovery);
|
|
364
|
+
}
|
|
339
365
|
}
|
|
340
366
|
}
|
|
341
367
|
}
|
|
@@ -361,6 +387,8 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
|
|
|
361
387
|
const lock = await acquireLock(transport, stage);
|
|
362
388
|
try {
|
|
363
389
|
const startedAt = new Date();
|
|
390
|
+
/** @type {string[]} */
|
|
391
|
+
const warnings = [];
|
|
364
392
|
const current = await requireCurrentRelease(transport, stage);
|
|
365
393
|
const targetId = to ?? await previousRelease(transport, stage, current.releaseId);
|
|
366
394
|
if (!targetId)
|
|
@@ -369,6 +397,7 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
|
|
|
369
397
|
throw new Error(`Rollback target '${targetId}' is already current.`);
|
|
370
398
|
const target = await resolveRetainedRelease(transport, stage, targetId);
|
|
371
399
|
const revision = await readReleaseRevision(transport, target.releasePath);
|
|
400
|
+
const currentRevision = await readReleaseRevision(transport, current.releasePath);
|
|
372
401
|
const runtime = runtimeFor(stage);
|
|
373
402
|
const state = await readRuntimeState(transport, stage);
|
|
374
403
|
const currentSnapshot = runtimeSnapshotForRollback(runtime, stage, state, current.releaseId);
|
|
@@ -386,9 +415,14 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
|
|
|
386
415
|
let publicationAttempted = false;
|
|
387
416
|
/** @type {import('#types').RuntimeBootState|undefined} */
|
|
388
417
|
let acceptedBoot;
|
|
418
|
+
/** @type {string[]|undefined} */
|
|
419
|
+
let referencedReleaseIds;
|
|
389
420
|
try {
|
|
390
421
|
reporter.line(`Rolling back ${stage.application}/${stage.stageName} from ${current.releaseId} to ${target.releaseId}`);
|
|
391
422
|
reporter.line(` * Handing off to ${runtime.type ?? stage.runtime.type} runtime`);
|
|
423
|
+
await preserveSupersededRuntimeReferences(transport, stage, state, current.releaseId);
|
|
424
|
+
// A rollback target needs the same pre-activation cleanup pin as a newly deployed candidate.
|
|
425
|
+
await pinRuntimeReleaseForCleanup(transport, stage, targetSnapshot, target.releaseId);
|
|
392
426
|
runtimeResult = await runtime.deploy(transport, {
|
|
393
427
|
releasePath: target.releasePath,
|
|
394
428
|
currentPath: current.releasePath,
|
|
@@ -409,10 +443,11 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
|
|
|
409
443
|
if (stage.healthChecks.length > 0)
|
|
410
444
|
reporter.line(" * Running health checks");
|
|
411
445
|
await runHealthChecks(transport, stage.healthChecks, target.releasePath);
|
|
446
|
+
referencedReleaseIds = await readRuntimeReferencesBeforePublication(runtime, transport, stage, { releaseId: target.releaseId, revision, runtime: acceptedTargetSnapshot }, runtimeResult);
|
|
412
447
|
reporter.line(" * Publishing current symlink");
|
|
413
448
|
publicationAttempted = true;
|
|
414
449
|
await publishCurrent(transport, stage, target.releasePath);
|
|
415
|
-
await writeRuntimeState(transport, stage, { releaseId: target.releaseId, revision, runtime: acceptedTargetSnapshot });
|
|
450
|
+
await writeRuntimeState(transport, stage, { releaseId: target.releaseId, revision, runtime: acceptedTargetSnapshot }, { referencedReleaseIds });
|
|
416
451
|
if (runtime.commit)
|
|
417
452
|
await runtime.commit(transport, { snapshot: acceptedTargetSnapshot });
|
|
418
453
|
acceptedBoot = await persistRuntimeBootState(runtime, transport, stage, acceptedTargetSnapshot, { releasePath: target.releasePath, releaseId: target.releaseId, revision });
|
|
@@ -420,6 +455,9 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
|
|
|
420
455
|
catch (error) {
|
|
421
456
|
const targetError = /** @type {Error} */ (error);
|
|
422
457
|
if (isRuntimeIncumbentPreservedError(targetError)) {
|
|
458
|
+
if (targetError.recovery) {
|
|
459
|
+
await persistRuntimeRecoveryPins(transport, stage, targetSnapshot, targetError.recovery);
|
|
460
|
+
}
|
|
423
461
|
targetError.message = `Rollback to '${target.releaseId}' failed: ${targetError.message}\nThe incumbent release '${current.releaseId}' remains authoritative; automatic runtime restoration was not attempted. Current was not changed.`;
|
|
424
462
|
throw targetError;
|
|
425
463
|
}
|
|
@@ -437,7 +475,7 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
|
|
|
437
475
|
currentPath: target.releasePath,
|
|
438
476
|
releaseId: current.releaseId,
|
|
439
477
|
previousReleaseId: target.releaseId,
|
|
440
|
-
revision:
|
|
478
|
+
revision: currentRevision,
|
|
441
479
|
targetSnapshot: currentSnapshot,
|
|
442
480
|
currentSnapshot: targetSnapshot,
|
|
443
481
|
deferCommit: true
|
|
@@ -445,25 +483,27 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
|
|
|
445
483
|
await runHealthChecks(transport, stage.healthChecks, current.releasePath);
|
|
446
484
|
if (publicationAttempted) {
|
|
447
485
|
await publishCurrent(transport, stage, current.releasePath);
|
|
448
|
-
if (state) {
|
|
449
|
-
await writeRuntimeState(transport, stage, state.active);
|
|
450
|
-
}
|
|
451
|
-
else if (await transport.exists(deployPaths(stage).statePath)) {
|
|
452
|
-
await transport.rm(deployPaths(stage).statePath);
|
|
453
|
-
}
|
|
454
486
|
}
|
|
487
|
+
await writeRuntimeStateWithLiveReferences(runtime, transport, stage, { releaseId: current.releaseId, revision: currentRevision, runtime: currentSnapshot });
|
|
455
488
|
if (runtime.commit)
|
|
456
489
|
await runtime.commit(transport, { snapshot: currentSnapshot });
|
|
457
490
|
}
|
|
458
491
|
catch (error) {
|
|
459
492
|
const restorationError = /** @type {Error} */ (error);
|
|
493
|
+
if (isRuntimeIncumbentPreservedError(restorationError) && restorationError.recovery) {
|
|
494
|
+
await persistRuntimeRecoveryPins(transport, stage, currentSnapshot, restorationError.recovery);
|
|
495
|
+
}
|
|
460
496
|
const combined = /** @type {Error & {restorationError?: Error}} */ (new Error(`Rollback to '${target.releaseId}' failed: ${targetError.message}\nRestoration of previous release '${current.releaseId}' also failed: ${restorationError.message}`, { cause: targetError }));
|
|
461
497
|
combined.restorationError = restorationError;
|
|
462
498
|
throw combined;
|
|
463
499
|
}
|
|
464
500
|
throw new Error(`Rollback to '${target.releaseId}' failed: ${targetError.message}\nPrevious release '${current.releaseId}' was reactivated and passed health checks. Current was ${publicationAttempted ? "restored" : "not changed"}.`, { cause: targetError });
|
|
465
501
|
}
|
|
466
|
-
await completeRuntimeOwnerHandoff(runtime, transport, stage, lock, acceptedBoot, { releaseId: target.releaseId, revision, runtime: acceptedTargetSnapshot }, runtimeResult);
|
|
502
|
+
const handoffReferencesPersisted = await completeRuntimeOwnerHandoff(runtime, transport, stage, lock, acceptedBoot, { releaseId: target.releaseId, revision, runtime: acceptedTargetSnapshot }, runtimeResult);
|
|
503
|
+
warnings.push(...await reconcileRuntimeReleasePinsAfterAcceptance(transport, stage, reporter, {
|
|
504
|
+
referencesAuthoritative: referencedReleaseIds !== undefined || handoffReferencesPersisted,
|
|
505
|
+
runtimeSnapshot: acceptedTargetSnapshot
|
|
506
|
+
}));
|
|
467
507
|
const report = {
|
|
468
508
|
application: stage.application,
|
|
469
509
|
stage: stage.stageName,
|
|
@@ -474,7 +514,8 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
|
|
|
474
514
|
previousRelease: current.releaseId,
|
|
475
515
|
healthChecks: "passed",
|
|
476
516
|
runtime: sanitizeRuntimeResult(runtimeResult, stage),
|
|
477
|
-
event: "rollback"
|
|
517
|
+
event: "rollback",
|
|
518
|
+
...(warnings.length > 0 ? { warnings } : {})
|
|
478
519
|
};
|
|
479
520
|
await appendReport(transport, stage, report);
|
|
480
521
|
return report;
|
|
@@ -716,25 +757,37 @@ function validateRecoveredPublication(stage, recovered, releaseId) {
|
|
|
716
757
|
/**
|
|
717
758
|
* @param {import('#types').Transport} transport
|
|
718
759
|
* @param {import('#types').StageConfig} stage
|
|
719
|
-
* @param {
|
|
720
|
-
* @param {
|
|
721
|
-
* @returns {Promise<
|
|
760
|
+
* @param {import('#types').RuntimeSnapshot|undefined} runtimeSnapshot
|
|
761
|
+
* @param {import('#types').GenerationTransitionRecovery} recovery
|
|
762
|
+
* @returns {Promise<void>}
|
|
722
763
|
*/
|
|
723
|
-
async function
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
}
|
|
731
|
-
catch (error) {
|
|
732
|
-
throw new Error(`Retained release metadata is malformed at ${metadataPath}: ${ /** @type {Error} */(error).message}`);
|
|
764
|
+
async function persistRuntimeRecoveryPins(transport, stage, runtimeSnapshot, recovery) {
|
|
765
|
+
if (!runtimeSnapshot)
|
|
766
|
+
throw new Error("Cannot persist runtime recovery pins without the attempted runtime snapshot.");
|
|
767
|
+
for (const releaseId of recovery.referencedReleaseIds) {
|
|
768
|
+
if (releaseId === recovery.activeReleaseId)
|
|
769
|
+
continue;
|
|
770
|
+
await pinRuntimeReleaseForCleanup(transport, stage, runtimeSnapshot, releaseId);
|
|
733
771
|
}
|
|
734
|
-
|
|
735
|
-
|
|
772
|
+
}
|
|
773
|
+
/**
|
|
774
|
+
* Move accepted references to owner-scoped pins before a runtime can replace
|
|
775
|
+
* stable state. An unchanged owner clears them after its authoritative report;
|
|
776
|
+
* a changed owner cannot clear another owner's pins.
|
|
777
|
+
*
|
|
778
|
+
* @param {import('#types').Transport} transport
|
|
779
|
+
* @param {import('#types').StageConfig} stage
|
|
780
|
+
* @param {import('#types').RuntimeState|null} state
|
|
781
|
+
* @param {string|null} activeReleaseId
|
|
782
|
+
* @returns {Promise<void>}
|
|
783
|
+
*/
|
|
784
|
+
async function preserveSupersededRuntimeReferences(transport, stage, state, activeReleaseId) {
|
|
785
|
+
if (!state)
|
|
786
|
+
return;
|
|
787
|
+
const releaseIds = new Set([...state.referencedReleaseIds, ...(activeReleaseId ? [activeReleaseId] : [])]);
|
|
788
|
+
for (const releaseId of releaseIds) {
|
|
789
|
+
await pinRuntimeReleaseForCleanup(transport, stage, state.active.runtime, releaseId);
|
|
736
790
|
}
|
|
737
|
-
return metadata;
|
|
738
791
|
}
|
|
739
792
|
/**
|
|
740
793
|
* @param {import('#types').RuntimeAdapter} runtime
|
|
@@ -766,6 +819,43 @@ async function persistRuntimeBootState(runtime, transport, stage, snapshot, targ
|
|
|
766
819
|
return undefined;
|
|
767
820
|
return await writeRuntimeBootState(transport, stage, identity);
|
|
768
821
|
}
|
|
822
|
+
/**
|
|
823
|
+
* @param {import('#types').RuntimeAdapter} runtime
|
|
824
|
+
* @param {import('#types').Transport} transport
|
|
825
|
+
* @param {import('#types').StageConfig} stage
|
|
826
|
+
* @param {import('#types').RuntimeRelease} active
|
|
827
|
+
* @param {any} runtimeResult
|
|
828
|
+
* @returns {Promise<string[]|undefined>}
|
|
829
|
+
*/
|
|
830
|
+
async function readRuntimeReferencesBeforePublication(runtime, transport, stage, active, runtimeResult) {
|
|
831
|
+
if (runtime.handoffExternalOwner && runtimeResult?.externalOwnerVerificationRequired)
|
|
832
|
+
return undefined;
|
|
833
|
+
return await readRuntimeReferences(runtime, transport, stage, active);
|
|
834
|
+
}
|
|
835
|
+
/**
|
|
836
|
+
* @param {import('#types').RuntimeAdapter} runtime
|
|
837
|
+
* @param {import('#types').Transport} transport
|
|
838
|
+
* @param {import('#types').StageConfig} stage
|
|
839
|
+
* @param {import('#types').RuntimeRelease} active
|
|
840
|
+
* @returns {Promise<string[]|undefined>}
|
|
841
|
+
*/
|
|
842
|
+
async function readRuntimeReferences(runtime, transport, stage, active) {
|
|
843
|
+
if (!runtime.readReferencedReleaseIds)
|
|
844
|
+
return undefined;
|
|
845
|
+
const releasePath = path.join(deployPaths(stage).releasesPath, active.releaseId);
|
|
846
|
+
return await runtime.readReferencedReleaseIds(transport, { releasePath, snapshot: active.runtime });
|
|
847
|
+
}
|
|
848
|
+
/**
|
|
849
|
+
* @param {import('#types').RuntimeAdapter} runtime
|
|
850
|
+
* @param {import('#types').Transport} transport
|
|
851
|
+
* @param {import('#types').StageConfig} stage
|
|
852
|
+
* @param {import('#types').RuntimeRelease} active
|
|
853
|
+
* @returns {Promise<void>}
|
|
854
|
+
*/
|
|
855
|
+
async function writeRuntimeStateWithLiveReferences(runtime, transport, stage, active) {
|
|
856
|
+
const referencedReleaseIds = await readRuntimeReferences(runtime, transport, stage, active);
|
|
857
|
+
await writeRuntimeState(transport, stage, active, { referencedReleaseIds });
|
|
858
|
+
}
|
|
769
859
|
/**
|
|
770
860
|
* @param {import('#types').RuntimeAdapter} runtime
|
|
771
861
|
* @param {import('#types').Transport} transport
|
|
@@ -774,13 +864,11 @@ async function persistRuntimeBootState(runtime, transport, stage, snapshot, targ
|
|
|
774
864
|
* @param {import('#types').RuntimeBootState|undefined} boot
|
|
775
865
|
* @param {import('#types').RuntimeRelease} active
|
|
776
866
|
* @param {any} runtimeResult
|
|
777
|
-
* @returns {Promise<
|
|
867
|
+
* @returns {Promise<boolean>} Whether an external owner persisted an authoritative release-reference set.
|
|
778
868
|
*/
|
|
779
869
|
async function completeRuntimeOwnerHandoff(runtime, transport, stage, lock, boot, active, runtimeResult) {
|
|
780
|
-
if (!runtime.handoffExternalOwner || !runtimeResult?.externalOwnerVerificationRequired)
|
|
781
|
-
|
|
782
|
-
return;
|
|
783
|
-
}
|
|
870
|
+
if (!runtime.handoffExternalOwner || !runtimeResult?.externalOwnerVerificationRequired)
|
|
871
|
+
return false;
|
|
784
872
|
if (!boot)
|
|
785
873
|
throw new Error("External runtime ownership handoff requires accepted runtime boot state.");
|
|
786
874
|
const request = await writeRuntimeOwnerHandoff(transport, stage, boot, lock);
|
|
@@ -793,6 +881,69 @@ async function completeRuntimeOwnerHandoff(runtime, transport, stage, lock, boot
|
|
|
793
881
|
if (!referencesPersisted)
|
|
794
882
|
throw new Error("External runtime owner did not report its referenced releases; cleanup pins and handoff request were preserved.");
|
|
795
883
|
await removeRuntimeOwnerHandoff(transport, stage, request);
|
|
884
|
+
return true;
|
|
885
|
+
}
|
|
886
|
+
/**
|
|
887
|
+
* Provisional cleanup pins are conservative recovery metadata rather than part
|
|
888
|
+
* of runtime acceptance. Once activation is accepted, a pin-removal failure is
|
|
889
|
+
* reported but cannot turn the healthy activation into a failed deployment.
|
|
890
|
+
* Pins are cleared only when the runtime owner supplied an authoritative live
|
|
891
|
+
* reference set.
|
|
892
|
+
*
|
|
893
|
+
* @param {import('#types').Transport} transport
|
|
894
|
+
* @param {import('#types').StageConfig} stage
|
|
895
|
+
* @param {Reporter} reporter
|
|
896
|
+
* @param {{referencesAuthoritative: boolean, runtimeSnapshot: import('#types').RuntimeSnapshot}} opts
|
|
897
|
+
* @returns {Promise<string[]>}
|
|
898
|
+
*/
|
|
899
|
+
async function reconcileRuntimeReleasePinsAfterAcceptance(transport, stage, reporter, { referencesAuthoritative, runtimeSnapshot }) {
|
|
900
|
+
if (!referencesAuthoritative)
|
|
901
|
+
return [];
|
|
902
|
+
try {
|
|
903
|
+
await clearRuntimeReleasePinsForCleanup(transport, stage, runtimeSnapshot);
|
|
904
|
+
return [];
|
|
905
|
+
}
|
|
906
|
+
catch (error) {
|
|
907
|
+
return runtimeReleasePinReconciliationWarning(reporter, /** @type {Error} */ (error));
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
/**
|
|
911
|
+
* An idempotent deploy may repair a stale standalone pin only after the runtime
|
|
912
|
+
* positively refreshes the accepted release's live reference set.
|
|
913
|
+
*
|
|
914
|
+
* @param {import('#types').RuntimeAdapter} runtime
|
|
915
|
+
* @param {import('#types').Transport} transport
|
|
916
|
+
* @param {import('#types').StageConfig} stage
|
|
917
|
+
* @param {{releaseId: string, releasePath: string}} current
|
|
918
|
+
* @param {string} currentRevision
|
|
919
|
+
* @param {Reporter} reporter
|
|
920
|
+
* @returns {Promise<string[]>}
|
|
921
|
+
*/
|
|
922
|
+
async function reconcileRuntimeReleasePinsForIdempotentDeploy(runtime, transport, stage, current, currentRevision, reporter) {
|
|
923
|
+
if (!runtime.readReferencedReleaseIds)
|
|
924
|
+
return [];
|
|
925
|
+
try {
|
|
926
|
+
const state = await readRuntimeState(transport, stage);
|
|
927
|
+
if (state?.active.releaseId !== current.releaseId || state.active.revision.toLowerCase() !== currentRevision.toLowerCase() || state.active.runtime.type !== stage.runtime.type)
|
|
928
|
+
return [];
|
|
929
|
+
const referencedReleaseIds = await runtime.readReferencedReleaseIds(transport, { releasePath: current.releasePath, snapshot: state.active.runtime });
|
|
930
|
+
await writeRuntimeState(transport, stage, state.active, { referencedReleaseIds });
|
|
931
|
+
await clearRuntimeReleasePinsForCleanup(transport, stage, state.active.runtime);
|
|
932
|
+
return [];
|
|
933
|
+
}
|
|
934
|
+
catch (error) {
|
|
935
|
+
return runtimeReleasePinReconciliationWarning(reporter, /** @type {Error} */ (error));
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
/**
|
|
939
|
+
* @param {Reporter} reporter
|
|
940
|
+
* @param {Error} error
|
|
941
|
+
* @returns {string[]}
|
|
942
|
+
*/
|
|
943
|
+
function runtimeReleasePinReconciliationWarning(reporter, error) {
|
|
944
|
+
const warning = `Runtime activation was accepted, but provisional cleanup pins could not be cleared: ${error.message}`;
|
|
945
|
+
reporter.line(` ! Warning: ${warning}`);
|
|
946
|
+
return [warning];
|
|
796
947
|
}
|
|
797
948
|
/**
|
|
798
949
|
* @param {import('#types').RuntimeAdapter} runtime
|