rampway 0.2.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/build/src/cli.d.ts.map +1 -1
- package/build/src/cli.js +35 -7
- package/build/src/cli.js.map +1 -1
- package/build/src/commands/deploy.d.ts.map +1 -1
- package/build/src/commands/deploy.js +31 -7
- package/build/src/commands/deploy.js.map +1 -1
- package/build/src/commands/task.d.ts +9 -0
- package/build/src/commands/task.d.ts.map +1 -0
- package/build/src/commands/task.js +23 -0
- package/build/src/commands/task.js.map +1 -0
- package/build/src/config/validate-config.d.ts +5 -0
- package/build/src/config/validate-config.d.ts.map +1 -1
- package/build/src/config/validate-config.js +139 -0
- package/build/src/config/validate-config.js.map +1 -1
- package/build/src/core/deploy-log.d.ts +66 -0
- package/build/src/core/deploy-log.d.ts.map +1 -0
- package/build/src/core/deploy-log.js +112 -0
- package/build/src/core/deploy-log.js.map +1 -0
- package/build/src/core/deploy-runner.js +5 -5
- package/build/src/core/deploy-runner.js.map +1 -1
- package/build/src/core/locks.d.ts +2 -1
- package/build/src/core/locks.d.ts.map +1 -1
- package/build/src/core/locks.js +28 -9
- package/build/src/core/locks.js.map +1 -1
- package/build/src/core/operational-task-runner.d.ts +21 -0
- package/build/src/core/operational-task-runner.d.ts.map +1 -0
- package/build/src/core/operational-task-runner.js +66 -0
- package/build/src/core/operational-task-runner.js.map +1 -0
- package/build/src/core/redaction.d.ts +31 -3
- package/build/src/core/redaction.d.ts.map +1 -1
- package/build/src/core/redaction.js +83 -5
- package/build/src/core/redaction.js.map +1 -1
- package/build/src/core/release-manager.d.ts +11 -0
- package/build/src/core/release-manager.d.ts.map +1 -1
- package/build/src/core/release-manager.js +22 -0
- package/build/src/core/release-manager.js.map +1 -1
- package/build/src/core/reporter.d.ts +37 -6
- package/build/src/core/reporter.d.ts.map +1 -1
- package/build/src/core/reporter.js +46 -6
- package/build/src/core/reporter.js.map +1 -1
- package/build/src/core/task-runner.d.ts +4 -2
- package/build/src/core/task-runner.d.ts.map +1 -1
- package/build/src/core/task-runner.js +34 -8
- package/build/src/core/task-runner.js.map +1 -1
- package/build/src/transports/local-transport.d.ts +19 -2
- package/build/src/transports/local-transport.d.ts.map +1 -1
- package/build/src/transports/local-transport.js +100 -12
- package/build/src/transports/local-transport.js.map +1 -1
- package/build/src/transports/ssh-transport.d.ts +43 -4
- package/build/src/transports/ssh-transport.d.ts.map +1 -1
- package/build/src/transports/ssh-transport.js +111 -18
- package/build/src/transports/ssh-transport.js.map +1 -1
- package/build/src/types.d.ts +20 -0
- package/build/src/types.d.ts.map +1 -1
- package/docs/config-reference.md +57 -0
- package/docs/migration-from-capistrano.md +25 -3
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -40,6 +40,8 @@ rampway production deploy <revision>
|
|
|
40
40
|
rampway production status
|
|
41
41
|
rampway production releases
|
|
42
42
|
rampway production releases --json
|
|
43
|
+
rampway production task cache:warm
|
|
44
|
+
rampway production task cache:warm --json
|
|
43
45
|
rampway production tasks
|
|
44
46
|
rampway production tasks --json
|
|
45
47
|
rampway production rollback
|
|
@@ -124,6 +126,14 @@ export default {
|
|
|
124
126
|
{command: "npm run assets:verify", cwd: "app", env: {NODE_ENV: "production"}}
|
|
125
127
|
]
|
|
126
128
|
},
|
|
129
|
+
operationalTasks: {
|
|
130
|
+
"cache:warm": {
|
|
131
|
+
command: "npm run cache:warm",
|
|
132
|
+
cwd: "backend",
|
|
133
|
+
env: {NODE_ENV: "production"},
|
|
134
|
+
forwardEnv: ["CACHE_WARM_CREDENTIAL"]
|
|
135
|
+
}
|
|
136
|
+
},
|
|
127
137
|
runtime: {
|
|
128
138
|
type: "rollbridge",
|
|
129
139
|
command: "npx rollbridge",
|
|
@@ -157,6 +167,8 @@ Task entries can be strings or objects.
|
|
|
157
167
|
|
|
158
168
|
Task groups run in config order. Required task failures stop the deploy before publish. Deploy failures include whether `current` changed and recovery hints for the affected stage, such as rerunning a before-publish failure, inspecting a newly created failed release directory, or inspecting `rampway status`, `rampway releases`, and `rampway rollback` after a failure that happened after publish. Existing release-id collisions do not suggest deleting the release directory.
|
|
159
169
|
|
|
170
|
+
Standalone operational tasks are configured separately under `operationalTasks` and run only when explicitly selected with `rampway <stage> task <exact-name>`. Rampway acquires the shared deploy lock, strictly resolves the active release, and runs every required entry against that immutable release path. `forwardEnv` names caller-supplied environment variables that must be present; their values are transported separately from ordinary `env` and redacted from output and errors. Operational tasks do not run during deploy, accept no command arguments or `--force`, and are not included in the plural `tasks` deploy-task inventory.
|
|
171
|
+
|
|
160
172
|
## Deployment reports
|
|
161
173
|
|
|
162
174
|
Every successful deploy or rollback appends one JSON object per line to `shared/log/rampway-deployments.jsonl`. Deploy events include:
|
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":";AA8CA;;;GAGG;AACH,2BAHW,MAAM,EAAE,GACN,OAAO,CAAC,IAAI,CAAC,CAUzB;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,CA2B9G"}
|
package/build/src/cli.js
CHANGED
|
@@ -9,7 +9,9 @@ import { releasesCommand, statusCommand } from "./commands/releases.js";
|
|
|
9
9
|
import { rollbackCommand } from "./commands/rollback.js";
|
|
10
10
|
import { rollbridgeValidateCommand, rollbridgeStatusCommand, rollbridgeLogsCommand, rollbridgeRecoverCommand } from "./commands/rollbridge.js";
|
|
11
11
|
import { tasksCommand } from "./commands/tasks.js";
|
|
12
|
+
import { taskCommand } from "./commands/task.js";
|
|
12
13
|
import { initCommand } from "./commands/init.js";
|
|
14
|
+
import { isValidOperationalTaskName } from "./config/validate-config.js";
|
|
13
15
|
/** @type {Record<string, Function>} */
|
|
14
16
|
const COMMANDS = {
|
|
15
17
|
init: initCommand,
|
|
@@ -18,6 +20,7 @@ const COMMANDS = {
|
|
|
18
20
|
deploy: deployCommand,
|
|
19
21
|
releases: releasesCommand,
|
|
20
22
|
status: statusCommand,
|
|
23
|
+
task: taskCommand,
|
|
21
24
|
tasks: tasksCommand,
|
|
22
25
|
rollback: rollbackCommand,
|
|
23
26
|
"rollbridge-validate": rollbridgeValidateCommand,
|
|
@@ -34,7 +37,7 @@ const COMMANDS = {
|
|
|
34
37
|
const STAGELESS_COMMANDS = new Set(["init"]);
|
|
35
38
|
/** @type {string[]} */
|
|
36
39
|
const BOOLEAN_FLAGS = ["yes", "dry-run", "force", "allow-dirty", "json"];
|
|
37
|
-
const USAGE = "Usage: rampway <environment> <command> [
|
|
40
|
+
const USAGE = "Usage: rampway <environment> <command> [operand] [--config path] (for example: rampway production deploy) OR rampway init";
|
|
38
41
|
/**
|
|
39
42
|
* @param {string[]} argv
|
|
40
43
|
* @returns {Promise<void>}
|
|
@@ -61,14 +64,32 @@ function resolveInvocation(argv) {
|
|
|
61
64
|
const { positional, options } = parseArgs(argv);
|
|
62
65
|
// Command-only form: `rampway init`.
|
|
63
66
|
if (STAGELESS_COMMANDS.has(positional[0])) {
|
|
67
|
+
if (positional.length !== 1)
|
|
68
|
+
throw new Error(`Command '${positional[0]}' does not accept positional operands.`);
|
|
64
69
|
return { command: positional[0], stageName: undefined, options };
|
|
65
70
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
const [stageName, command, ...operands] = positional;
|
|
72
|
+
if (command === "deploy") {
|
|
73
|
+
if (operands.length > 1)
|
|
74
|
+
throw new Error("Command 'deploy' accepts at most one revision.");
|
|
75
|
+
// An explicit positional revision overrides every other source; otherwise
|
|
76
|
+
// deployCommand's --revision/--branch/config precedence stands.
|
|
77
|
+
if (operands[0] !== undefined)
|
|
78
|
+
options.revision = operands[0];
|
|
79
|
+
}
|
|
80
|
+
else if (command === "task") {
|
|
81
|
+
if (operands.length !== 1)
|
|
82
|
+
throw new Error("Command 'task' requires exactly one task name.");
|
|
83
|
+
if (!isValidOperationalTaskName(operands[0]))
|
|
84
|
+
throw new Error(`Invalid operational task name '${operands[0]}'.`);
|
|
85
|
+
const unsupported = Object.keys(options).filter(option => !["config", "json"].includes(option));
|
|
86
|
+
if (unsupported.length > 0)
|
|
87
|
+
throw new Error(`Command 'task' does not support option --${toKebab(unsupported[0])}.`);
|
|
88
|
+
options.task = operands[0];
|
|
89
|
+
}
|
|
90
|
+
else if (operands.length > 0) {
|
|
91
|
+
throw new Error(`Command '${command}' does not accept positional operands.`);
|
|
92
|
+
}
|
|
72
93
|
return { command, stageName, options };
|
|
73
94
|
}
|
|
74
95
|
/**
|
|
@@ -102,6 +123,13 @@ function parseArgs(argv) {
|
|
|
102
123
|
function toCamel(name) {
|
|
103
124
|
return name.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
104
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* @param {string} name
|
|
128
|
+
* @returns {string}
|
|
129
|
+
*/
|
|
130
|
+
function toKebab(name) {
|
|
131
|
+
return name.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);
|
|
132
|
+
}
|
|
105
133
|
const invokedPath = process.argv[1] ? pathToFileURL(realpathSync(process.argv[1])).href : null;
|
|
106
134
|
if (invokedPath && import.meta.url === invokedPath) {
|
|
107
135
|
main(process.argv.slice(2)).catch(error => {
|
package/build/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,yBAAyB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,wBAAwB,EAAC,MAAM,0BAA0B,CAAA;AAC5I,OAAO,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy.js"],"names":[],"mappings":"AAMA;;;GAGG;AACH,sEAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAgCzB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import { commandContext as defaultCommandContext } from "./context.js";
|
|
3
3
|
import { deploy } from "../core/deploy-runner.js";
|
|
4
|
+
import { openDeployLog } from "../core/deploy-log.js";
|
|
4
5
|
import { humanReporter, jsonReporter } from "../core/reporter.js";
|
|
5
6
|
/**
|
|
6
7
|
* @param {import('#types').CommandArgs} args
|
|
@@ -8,22 +9,43 @@ import { humanReporter, jsonReporter } from "../core/reporter.js";
|
|
|
8
9
|
*/
|
|
9
10
|
export async function deployCommand({ stageName, options, commandContext = defaultCommandContext }) {
|
|
10
11
|
const reporter = options.json ? jsonReporter() : humanReporter();
|
|
11
|
-
const { stage, transport } = await commandContext(options, stageName, { reporter });
|
|
12
|
+
const { config, stage, transport } = await commandContext(options, stageName, { reporter });
|
|
12
13
|
const resolvedStage = options.branch && !options.revision ? { ...stage, revision: undefined } : stage;
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
const sourcePath = options.source ?? process.cwd();
|
|
15
|
+
// A dry run only prints a plan, so there is no deploy transcript worth keeping.
|
|
16
|
+
const deployLog = options.dryRun ? null : openDeployLog({ config, sourcePath, stageName });
|
|
17
|
+
if (deployLog) {
|
|
18
|
+
reporter.attachLogStream(deployLog.stream);
|
|
19
|
+
// Emitted through the reporter so it records its own path as the log's first
|
|
20
|
+
// line and stays off stdout in `--json` mode.
|
|
21
|
+
reporter.line(`Logging deploy output to ${deployLog.path}`);
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const report = await deploy({ transport, stage: resolvedStage, sourcePath, revision: options.revision, branch: options.branch ?? stage.branch, dryRun: options.dryRun, force: options.force, reporter });
|
|
25
|
+
if (options.json || "plan" in report) {
|
|
26
|
+
console.log(JSON.stringify(report, null, 2));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
printSummary(/** @type {import('#types').DeployReport} */ (report), deployLog?.path);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (deployLog)
|
|
33
|
+
deployLog.stream.write(`\nDeploy failed: ${ /** @type {Error} */(error).message}\n`);
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
if (deployLog)
|
|
38
|
+
await deployLog.close();
|
|
17
39
|
}
|
|
18
|
-
printSummary(/** @type {import('#types').DeployReport} */ (report));
|
|
19
40
|
}
|
|
20
41
|
/**
|
|
21
42
|
* Prints a concise Capistrano-style final summary of a successful deploy.
|
|
22
43
|
*
|
|
23
44
|
* @param {import('#types').DeployReport} report
|
|
45
|
+
* @param {string} [logPath] Path of the persistent per-deploy log, when written.
|
|
24
46
|
* @returns {void}
|
|
25
47
|
*/
|
|
26
|
-
function printSummary(report) {
|
|
48
|
+
function printSummary(report, logPath) {
|
|
27
49
|
const seconds = report.durationMs === undefined ? undefined : (report.durationMs / 1000).toFixed(1);
|
|
28
50
|
console.log(`✔ Deployed ${report.application}/${report.stage} revision ${report.revision} as release ${report.releaseId}${seconds === undefined ? "" : ` in ${seconds}s`}`);
|
|
29
51
|
if (report.previousRelease)
|
|
@@ -31,5 +53,7 @@ function printSummary(report) {
|
|
|
31
53
|
console.log(` Health checks: ${report.healthChecks ?? "n/a"}`);
|
|
32
54
|
const removed = report.cleanupRemoved ?? [];
|
|
33
55
|
console.log(` Cleaned up: ${removed.length} old release${removed.length === 1 ? "" : "s"}`);
|
|
56
|
+
if (logPath)
|
|
57
|
+
console.log(` Deploy log: ${logPath}`);
|
|
34
58
|
}
|
|
35
59
|
//# sourceMappingURL=deploy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/deploy.js"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,EAAC,cAAc,IAAI,qBAAqB,EAAC,MAAM,cAAc,CAAA;AACpE,OAAO,EAAC,MAAM,EAAC,MAAM,0BAA0B,CAAA;AAC/C,OAAO,EAAC,aAAa,EAAE,YAAY,EAAC,MAAM,qBAAqB,CAAA;AAE/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAC,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,qBAAqB,EAAC;IAC9F,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IAChE,MAAM,EAAC,KAAK,EAAE,SAAS,EAAC,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,EAAC,QAAQ,EAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/deploy.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {import('#types').CommandArgs & {operationalTaskRunner?: typeof runOperationalTask}} args
|
|
3
|
+
* @returns {Promise<void>}
|
|
4
|
+
*/
|
|
5
|
+
export function taskCommand({ stageName, options, commandContext, operationalTaskRunner }: import("#types").CommandArgs & {
|
|
6
|
+
operationalTaskRunner?: typeof runOperationalTask;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
import { runOperationalTask } from "../core/operational-task-runner.js";
|
|
9
|
+
//# sourceMappingURL=task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../../src/commands/task.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH,2FAHW,OAAO,QAAQ,EAAE,WAAW,GAAG;IAAC,qBAAqB,CAAC,EAAE,OAAO,kBAAkB,CAAA;CAAC,GAChF,OAAO,CAAC,IAAI,CAAC,CAkBzB;mCAvBgC,oCAAoC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { commandContext as defaultCommandContext } from "./context.js";
|
|
3
|
+
import { runOperationalTask } from "../core/operational-task-runner.js";
|
|
4
|
+
import { humanReporter, jsonReporter } from "../core/reporter.js";
|
|
5
|
+
/**
|
|
6
|
+
* @param {import('#types').CommandArgs & {operationalTaskRunner?: typeof runOperationalTask}} args
|
|
7
|
+
* @returns {Promise<void>}
|
|
8
|
+
*/
|
|
9
|
+
export async function taskCommand({ stageName, options, commandContext = defaultCommandContext, operationalTaskRunner = runOperationalTask }) {
|
|
10
|
+
if (!options.task)
|
|
11
|
+
throw new Error("Command 'task' requires exactly one task name.");
|
|
12
|
+
const reporter = options.json ? jsonReporter() : humanReporter();
|
|
13
|
+
const { stage, transport } = await commandContext(options, stageName, { reporter });
|
|
14
|
+
const report = await operationalTaskRunner({
|
|
15
|
+
transport,
|
|
16
|
+
stage,
|
|
17
|
+
taskName: options.task,
|
|
18
|
+
reporter
|
|
19
|
+
});
|
|
20
|
+
if (options.json)
|
|
21
|
+
console.log(JSON.stringify(report));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../../src/commands/task.js"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,EAAC,cAAc,IAAI,qBAAqB,EAAC,MAAM,cAAc,CAAA;AACpE,OAAO,EAAC,kBAAkB,EAAC,MAAM,oCAAoC,CAAA;AACrE,OAAO,EAAC,aAAa,EAAE,YAAY,EAAC,MAAM,qBAAqB,CAAA;AAE/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAChC,SAAS,EACT,OAAO,EACP,cAAc,GAAG,qBAAqB,EACtC,qBAAqB,GAAG,kBAAkB,EAC3C;IACC,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IAChE,MAAM,EAAC,KAAK,EAAE,SAAS,EAAC,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,EAAC,QAAQ,EAAC,CAAC,CAAA;IAC/E,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;QACzC,SAAS;QACT,KAAK;QACL,QAAQ,EAAE,OAAO,CAAC,IAAI;QACtB,QAAQ;KACT,CAAC,CAAA;IACF,IAAI,OAAO,CAAC,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;AACvD,CAAC"}
|
|
@@ -4,4 +4,9 @@
|
|
|
4
4
|
* @returns {import('#types').StageConfig}
|
|
5
5
|
*/
|
|
6
6
|
export function validateConfig(config: Record<string, unknown>, stageName: string): import("#types").StageConfig;
|
|
7
|
+
/**
|
|
8
|
+
* @param {unknown} name
|
|
9
|
+
* @returns {boolean}
|
|
10
|
+
*/
|
|
11
|
+
export function isValidOperationalTaskName(name: unknown): boolean;
|
|
7
12
|
//# sourceMappingURL=validate-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-config.d.ts","sourceRoot":"","sources":["../../../src/config/validate-config.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate-config.d.ts","sourceRoot":"","sources":["../../../src/config/validate-config.js"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,uCAJW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aACvB,MAAM,GACJ,OAAO,QAAQ,EAAE,WAAW,CAcxC;AAmED;;;GAGG;AACH,iDAHW,OAAO,GACL,OAAO,CAInB"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import path from "node:path";
|
|
1
2
|
import { runtimeTypeNames } from "../runtimes/index.js";
|
|
2
3
|
import { isGitRevision } from "../core/git-source.js";
|
|
4
|
+
import { isSecretKey, isValidEnvironmentName } from "../core/redaction.js";
|
|
5
|
+
import { commandsForEntries } from "../core/task-runner.js";
|
|
3
6
|
const SUPPORTED_TRANSPORTS = new Set(["local", "ssh"]);
|
|
4
7
|
const SUPPORTED_STRATEGIES = new Set(["local-copy", "remote-git", "archive-upload"]);
|
|
8
|
+
const OPERATIONAL_TASK_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9:_-]*$/u;
|
|
9
|
+
const OPERATIONAL_TASK_FIELDS = new Set(["command", "cwd", "env", "forwardEnv"]);
|
|
5
10
|
/**
|
|
6
11
|
* @param {Record<string, unknown>} config
|
|
7
12
|
* @param {string} stageName
|
|
@@ -56,6 +61,7 @@ function validateStage(stage, errors) {
|
|
|
56
61
|
errors.push("stage.linkedDirs must be an array");
|
|
57
62
|
if (stage.tasks && typeof stage.tasks !== "object")
|
|
58
63
|
errors.push("stage.tasks must be an object");
|
|
64
|
+
validateOperationalTasks(stage, errors);
|
|
59
65
|
const runtimeType = String(/** @type {{type?: string}|undefined} */ (stage.runtime)?.type ?? (stage.rollbridge ? "rollbridge" : "none"));
|
|
60
66
|
const supportedRuntimes = runtimeTypeNames();
|
|
61
67
|
if (!supportedRuntimes.includes(runtimeType))
|
|
@@ -93,11 +99,144 @@ function normalizedStage(config, stageName) {
|
|
|
93
99
|
linkedFiles: normalizeLinkedEntries(/** @type {Array<string|{path: string, required?: boolean}>} */ (stage.linkedFiles ?? [])),
|
|
94
100
|
linkedDirs: normalizeLinkedEntries(/** @type {Array<string|{path: string, required?: boolean}>} */ (stage.linkedDirs ?? [])),
|
|
95
101
|
tasks: /** @type {Record<string, import('#types').TaskEntry[]>} */ (stage.tasks ?? {}),
|
|
102
|
+
operationalTasks: normalizeOperationalTasks(Object.hasOwn(stage, "operationalTasks") ? stage.operationalTasks : undefined),
|
|
96
103
|
hooks: /** @type {Record<string, import('#types').TaskEntry[]>} */ (stage.hooks ?? {}),
|
|
97
104
|
healthChecks: /** @type {import('#types').HealthCheckEntry[]} */ (stage.healthChecks ?? []),
|
|
98
105
|
runtime: /** @type {import('#types').RuntimeConfig} */ (stage.runtime ?? (rollbridgeObj ? { type: "rollbridge", ...rollbridgeObj } : { type: "none" }))
|
|
99
106
|
};
|
|
100
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* @param {unknown} name
|
|
110
|
+
* @returns {boolean}
|
|
111
|
+
*/
|
|
112
|
+
export function isValidOperationalTaskName(name) {
|
|
113
|
+
return typeof name === "string" && name.length >= 1 && name.length <= 128 && OPERATIONAL_TASK_NAME_PATTERN.test(name);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* @param {Record<string, unknown>} stage
|
|
117
|
+
* @param {string[]} errors
|
|
118
|
+
* @returns {void}
|
|
119
|
+
*/
|
|
120
|
+
function validateOperationalTasks(stage, errors) {
|
|
121
|
+
if (!Object.hasOwn(stage, "operationalTasks"))
|
|
122
|
+
return;
|
|
123
|
+
if (!isRecord(stage.operationalTasks)) {
|
|
124
|
+
errors.push("stage.operationalTasks must be an object");
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (const [name, configured] of Object.entries(stage.operationalTasks)) {
|
|
128
|
+
const taskPath = `stage.operationalTasks.${name}`;
|
|
129
|
+
if (!isValidOperationalTaskName(name))
|
|
130
|
+
errors.push(`${taskPath}: Invalid operational task name '${name}'`);
|
|
131
|
+
if (Array.isArray(configured) && configured.length === 0) {
|
|
132
|
+
errors.push(`${taskPath} must not be an empty array`);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const entries = Array.isArray(configured) ? configured : [configured];
|
|
136
|
+
for (const [index, rawEntry] of entries.entries()) {
|
|
137
|
+
const entryPath = entries.length === 1 ? taskPath : `${taskPath}[${index}]`;
|
|
138
|
+
validateOperationalTaskEntry(name, rawEntry, entryPath, errors);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* @param {string} name
|
|
144
|
+
* @param {unknown} rawEntry
|
|
145
|
+
* @param {string} entryPath
|
|
146
|
+
* @param {string[]} errors
|
|
147
|
+
* @returns {void}
|
|
148
|
+
*/
|
|
149
|
+
function validateOperationalTaskEntry(name, rawEntry, entryPath, errors) {
|
|
150
|
+
if (typeof rawEntry !== "string" && !isRecord(rawEntry)) {
|
|
151
|
+
errors.push(`${entryPath} must be a string or operational task object`);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (isRecord(rawEntry)) {
|
|
155
|
+
for (const field of Object.keys(rawEntry)) {
|
|
156
|
+
if (!OPERATIONAL_TASK_FIELDS.has(field))
|
|
157
|
+
errors.push(`${entryPath} has unknown field '${field}'`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
let entry;
|
|
161
|
+
try {
|
|
162
|
+
entry = commandsForEntries(name, /** @type {string|import('#types').TaskEntry} */ (rawEntry))[0];
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
errors.push(`${entryPath}: ${ /** @type {Error} */(error).message}`);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (entry.command.trim().length === 0)
|
|
169
|
+
errors.push(`${entryPath}.command must be a non-empty string`);
|
|
170
|
+
if (entry.cwd !== undefined && !isReleaseRelativeCwd(entry.cwd))
|
|
171
|
+
errors.push(`${entryPath}.cwd must be a non-empty release-relative path that does not escape the release`);
|
|
172
|
+
const rawEnv = /** @type {{env?: unknown}} */ (rawEntry).env;
|
|
173
|
+
if (rawEnv !== undefined && !isRecord(rawEnv)) {
|
|
174
|
+
errors.push(`${entryPath}.env must be an object`);
|
|
175
|
+
}
|
|
176
|
+
else if (isRecord(rawEnv)) {
|
|
177
|
+
for (const [key, value] of Object.entries(rawEnv)) {
|
|
178
|
+
if (!isValidEnvironmentName(key))
|
|
179
|
+
errors.push(`${entryPath}.env: Invalid environment variable name '${key}'`);
|
|
180
|
+
if (typeof value !== "string")
|
|
181
|
+
errors.push(`${entryPath}.env.${key} must be a string`);
|
|
182
|
+
if (isSecretKey(key))
|
|
183
|
+
errors.push(`${entryPath}.env.${key} is secret-like; use forwardEnv instead`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const rawForwardEnv = /** @type {{forwardEnv?: unknown}} */ (rawEntry).forwardEnv;
|
|
187
|
+
if (rawForwardEnv !== undefined && !Array.isArray(rawForwardEnv)) {
|
|
188
|
+
errors.push(`${entryPath}.forwardEnv must be an array`);
|
|
189
|
+
}
|
|
190
|
+
else if (Array.isArray(rawForwardEnv)) {
|
|
191
|
+
const seen = new Set();
|
|
192
|
+
for (const value of rawForwardEnv) {
|
|
193
|
+
if (!isValidEnvironmentName(value)) {
|
|
194
|
+
errors.push(`${entryPath}.forwardEnv: Invalid environment variable name '${String(value)}'`);
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (seen.has(value))
|
|
198
|
+
errors.push(`${entryPath} has duplicate forwardEnv '${value}'`);
|
|
199
|
+
seen.add(value);
|
|
200
|
+
if (isRecord(rawEnv) && Object.hasOwn(rawEnv, value))
|
|
201
|
+
errors.push(`${entryPath}.${value} cannot be in both env and forwardEnv`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* @param {unknown} configured
|
|
207
|
+
* @returns {Record<string, import('#types').OperationalTaskEntry[]>}
|
|
208
|
+
*/
|
|
209
|
+
function normalizeOperationalTasks(configured) {
|
|
210
|
+
if (!isRecord(configured))
|
|
211
|
+
return {};
|
|
212
|
+
/** @type {Record<string, import('#types').OperationalTaskEntry[]>} */
|
|
213
|
+
const normalized = {};
|
|
214
|
+
for (const [name, entries] of Object.entries(configured)) {
|
|
215
|
+
normalized[name] = /** @type {import('#types').OperationalTaskEntry[]} */ (commandsForEntries(name, /** @type {string|import('#types').TaskEntry|Array<string|import('#types').TaskEntry>} */ (entries)));
|
|
216
|
+
}
|
|
217
|
+
return normalized;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* @param {unknown} value
|
|
221
|
+
* @returns {value is Record<string, unknown>}
|
|
222
|
+
*/
|
|
223
|
+
function isRecord(value) {
|
|
224
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
225
|
+
return false;
|
|
226
|
+
const prototype = Object.getPrototypeOf(value);
|
|
227
|
+
return prototype === Object.prototype || prototype === null;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* @param {unknown} cwd
|
|
231
|
+
* @returns {cwd is string}
|
|
232
|
+
*/
|
|
233
|
+
function isReleaseRelativeCwd(cwd) {
|
|
234
|
+
if (typeof cwd !== "string" || cwd.trim().length === 0 || cwd.includes("\0"))
|
|
235
|
+
return false;
|
|
236
|
+
if (path.posix.isAbsolute(cwd) || path.win32.isAbsolute(cwd))
|
|
237
|
+
return false;
|
|
238
|
+
return !cwd.split(/[\\/]+/u).includes("..");
|
|
239
|
+
}
|
|
101
240
|
/**
|
|
102
241
|
* @param {Array<string|{path: string, required?: boolean}>} entries
|
|
103
242
|
* @returns {import('#types').LinkedEntry[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-config.js","sourceRoot":"","sources":["../../../src/config/validate-config.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validate-config.js","sourceRoot":"","sources":["../../../src/config/validate-config.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @name DeployLogSettings
|
|
3
|
+
* @typedef {object} DeployLogSettings
|
|
4
|
+
* @property {boolean} enabled Whether a per-deploy log file is written.
|
|
5
|
+
* @property {string} dir Log directory; relative paths resolve against the deploy source.
|
|
6
|
+
* @property {number} keep Number of most-recent deploy logs to retain.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Resolves the per-deploy log settings from the loaded Rampway config, applying
|
|
10
|
+
* defaults. `deployLog: false` (or `{enabled: false}`) disables logging.
|
|
11
|
+
*
|
|
12
|
+
* @param {unknown} rawConfig Full loaded Rampway config object.
|
|
13
|
+
* @returns {DeployLogSettings}
|
|
14
|
+
*/
|
|
15
|
+
export function resolveDeployLogConfig(rawConfig: unknown): DeployLogSettings;
|
|
16
|
+
/**
|
|
17
|
+
* @name DeployLog
|
|
18
|
+
* @typedef {object} DeployLog
|
|
19
|
+
* @property {string} path Absolute path of the log file being written.
|
|
20
|
+
* @property {import('node:fs').WriteStream} stream Append stream to tee reporter output into.
|
|
21
|
+
* @property {() => Promise<void>} close Flushes and closes the log stream.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Opens the per-deploy log for a run: resolves the directory relative to the
|
|
25
|
+
* deploy source, creates a timestamped file, prunes old logs to the configured
|
|
26
|
+
* keep count, and returns an append stream. Returns `null` when logging is
|
|
27
|
+
* disabled.
|
|
28
|
+
*
|
|
29
|
+
* @param {{config: unknown, sourcePath: string, stageName: string, now?: Date}} args
|
|
30
|
+
* @returns {DeployLog | null}
|
|
31
|
+
*/
|
|
32
|
+
export function openDeployLog({ config, sourcePath, stageName, now }: {
|
|
33
|
+
config: unknown;
|
|
34
|
+
sourcePath: string;
|
|
35
|
+
stageName: string;
|
|
36
|
+
now?: Date;
|
|
37
|
+
}): DeployLog | null;
|
|
38
|
+
export type DeployLogSettings = {
|
|
39
|
+
/**
|
|
40
|
+
* Whether a per-deploy log file is written.
|
|
41
|
+
*/
|
|
42
|
+
enabled: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Log directory; relative paths resolve against the deploy source.
|
|
45
|
+
*/
|
|
46
|
+
dir: string;
|
|
47
|
+
/**
|
|
48
|
+
* Number of most-recent deploy logs to retain.
|
|
49
|
+
*/
|
|
50
|
+
keep: number;
|
|
51
|
+
};
|
|
52
|
+
export type DeployLog = {
|
|
53
|
+
/**
|
|
54
|
+
* Absolute path of the log file being written.
|
|
55
|
+
*/
|
|
56
|
+
path: string;
|
|
57
|
+
/**
|
|
58
|
+
* Append stream to tee reporter output into.
|
|
59
|
+
*/
|
|
60
|
+
stream: import("node:fs").WriteStream;
|
|
61
|
+
/**
|
|
62
|
+
* Flushes and closes the log stream.
|
|
63
|
+
*/
|
|
64
|
+
close: () => Promise<void>;
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=deploy-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-log.d.ts","sourceRoot":"","sources":["../../../src/core/deploy-log.js"],"names":[],"mappings":"AAqBA;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,kDAHW,OAAO,GACL,iBAAiB,CAiB7B;AAED;;;;;;GAMG;AAEH;;;;;;;;GAQG;AACH,sEAHW;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAC,GAClE,SAAS,GAAG,IAAI,CAmB5B;;;;;aA/Da,OAAO;;;;SACP,MAAM;;;;UACN,MAAM;;;;;;UA8BN,MAAM;;;;YACN,OAAO,SAAS,EAAE,WAAW;;;;WAC7B,MAAM,OAAO,CAAC,IAAI,CAAC"}
|