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
|
@@ -46,4 +46,15 @@ export function previousRelease(transport: import("#types").Transport, stage: im
|
|
|
46
46
|
* @returns {Promise<string|null>}
|
|
47
47
|
*/
|
|
48
48
|
export function currentReleaseId(transport: import("#types").Transport, stage: import("#types").StageConfig): Promise<string | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Strictly resolves the active release for an executable operation.
|
|
51
|
+
*
|
|
52
|
+
* @param {import('#types').Transport} transport
|
|
53
|
+
* @param {import('#types').StageConfig} stage
|
|
54
|
+
* @returns {Promise<{releaseId: string, releasePath: string}>}
|
|
55
|
+
*/
|
|
56
|
+
export function requireCurrentRelease(transport: import("#types").Transport, stage: import("#types").StageConfig): Promise<{
|
|
57
|
+
releaseId: string;
|
|
58
|
+
releasePath: string;
|
|
59
|
+
}>;
|
|
49
60
|
//# sourceMappingURL=release-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-manager.d.ts","sourceRoot":"","sources":["../../../src/core/release-manager.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,0CAJW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAQzB;AAED;;;;;GAKG;AACH,8CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,eAC5B,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAwBzB;AAWD;;;;;GAKG;AACH,0CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,eAC5B,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAOzB;AAED;;;;GAIG;AACH,wCAJW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC,CAK7B;AAED;;;;;GAKG;AACH,2CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,aAC5B;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAU7B;AAED;;;;;GAKG;AACH,2CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,mBAC5B,MAAM,GAAC,IAAI,GACT,OAAO,CAAC,MAAM,GAAC,SAAS,CAAC,CAOrC;AAED;;;;GAIG;AACH,4CAJW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,MAAM,GAAC,IAAI,CAAC,CAMhC"}
|
|
1
|
+
{"version":3,"file":"release-manager.d.ts","sourceRoot":"","sources":["../../../src/core/release-manager.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,0CAJW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAQzB;AAED;;;;;GAKG;AACH,8CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,eAC5B,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAwBzB;AAWD;;;;;GAKG;AACH,0CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,eAC5B,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAOzB;AAED;;;;GAIG;AACH,wCAJW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC,CAK7B;AAED;;;;;GAKG;AACH,2CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,aAC5B;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAU7B;AAED;;;;;GAKG;AACH,2CALW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,mBAC5B,MAAM,GAAC,IAAI,GACT,OAAO,CAAC,MAAM,GAAC,SAAS,CAAC,CAOrC;AAED;;;;GAIG;AACH,4CAJW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,MAAM,GAAC,IAAI,CAAC,CAMhC;AAED;;;;;;GAMG;AACH,iDAJW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,CAAC,CAe7D"}
|
|
@@ -112,4 +112,26 @@ export async function currentReleaseId(transport, stage) {
|
|
|
112
112
|
return null;
|
|
113
113
|
return path.basename(await transport.readlink(currentPath));
|
|
114
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Strictly resolves the active release for an executable operation.
|
|
117
|
+
*
|
|
118
|
+
* @param {import('#types').Transport} transport
|
|
119
|
+
* @param {import('#types').StageConfig} stage
|
|
120
|
+
* @returns {Promise<{releaseId: string, releasePath: string}>}
|
|
121
|
+
*/
|
|
122
|
+
export async function requireCurrentRelease(transport, stage) {
|
|
123
|
+
const paths = deployPaths(stage);
|
|
124
|
+
if (!await transport.exists(paths.currentPath))
|
|
125
|
+
throw new Error(`No current release exists at ${paths.currentPath}.`);
|
|
126
|
+
const target = await transport.readlink(paths.currentPath);
|
|
127
|
+
const releasesPath = path.resolve(paths.releasesPath);
|
|
128
|
+
const releasePath = path.resolve(path.dirname(paths.currentPath), target);
|
|
129
|
+
const relative = path.relative(releasesPath, releasePath);
|
|
130
|
+
if (!relative || relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative) || relative.includes(path.sep)) {
|
|
131
|
+
throw new Error(`Current release target must resolve to one direct child of ${releasesPath}.`);
|
|
132
|
+
}
|
|
133
|
+
if (!await transport.exists(releasePath))
|
|
134
|
+
throw new Error(`Current release '${relative}' does not exist at ${releasePath}.`);
|
|
135
|
+
return { releaseId: relative, releasePath };
|
|
136
|
+
}
|
|
115
137
|
//# sourceMappingURL=release-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-manager.js","sourceRoot":"","sources":["../../../src/core/release-manager.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"release-manager.js","sourceRoot":"","sources":["../../../src/core/release-manager.js"],"names":[],"mappings":"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"}
|
|
@@ -26,13 +26,14 @@ export function jsonReporter(): Reporter;
|
|
|
26
26
|
*/
|
|
27
27
|
export class Reporter {
|
|
28
28
|
/**
|
|
29
|
-
* @param {{lifecycle?: boolean, streamCommands?: boolean, out?: import('node:stream').Writable, err?: import('node:stream').Writable}} [opts]
|
|
29
|
+
* @param {{lifecycle?: boolean, streamCommands?: boolean, out?: import('node:stream').Writable, err?: import('node:stream').Writable, logStream?: import('node:stream').Writable|null}} [opts]
|
|
30
30
|
*/
|
|
31
|
-
constructor({ lifecycle, streamCommands, out, err }?: {
|
|
31
|
+
constructor({ lifecycle, streamCommands, out, err, logStream }?: {
|
|
32
32
|
lifecycle?: boolean;
|
|
33
33
|
streamCommands?: boolean;
|
|
34
34
|
out?: import("node:stream").Writable;
|
|
35
35
|
err?: import("node:stream").Writable;
|
|
36
|
+
logStream?: import("node:stream").Writable | null;
|
|
36
37
|
});
|
|
37
38
|
/** @type {boolean} */
|
|
38
39
|
lifecycleEnabled: boolean;
|
|
@@ -42,26 +43,56 @@ export class Reporter {
|
|
|
42
43
|
out: import("node:stream").Writable;
|
|
43
44
|
/** @type {import('node:stream').Writable} */
|
|
44
45
|
err: import("node:stream").Writable;
|
|
46
|
+
/**
|
|
47
|
+
* Optional persistent per-deploy log. When attached, every lifecycle line
|
|
48
|
+
* and streamed command chunk is tee'd here in addition to the live
|
|
49
|
+
* stdout/stderr contract, so a full deploy transcript survives on disk.
|
|
50
|
+
*
|
|
51
|
+
* @type {import('node:stream').Writable|null}
|
|
52
|
+
*/
|
|
53
|
+
logStream: import("node:stream").Writable | null;
|
|
45
54
|
/**
|
|
46
55
|
* Whether live command stdout/stderr should be streamed as it arrives.
|
|
47
56
|
*
|
|
48
57
|
* @returns {boolean}
|
|
49
58
|
*/
|
|
50
59
|
get streamsCommands(): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Whether the transport should feed redacted command output to the reporter at
|
|
62
|
+
* all — either to live-stream it or to persist it to the deploy log. This is
|
|
63
|
+
* decoupled from {@link streamsCommands} so a `--json` deploy still records a
|
|
64
|
+
* full command transcript in its log even though nothing is streamed live.
|
|
65
|
+
*
|
|
66
|
+
* @returns {boolean}
|
|
67
|
+
*/
|
|
68
|
+
get capturesCommands(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Attaches a persistent per-deploy log stream after construction. The deploy
|
|
71
|
+
* command builds the reporter before the config (and therefore the log path)
|
|
72
|
+
* is known, so the log is tee'd in once resolved.
|
|
73
|
+
*
|
|
74
|
+
* @param {import('node:stream').Writable|null} stream
|
|
75
|
+
* @returns {void}
|
|
76
|
+
*/
|
|
77
|
+
attachLogStream(stream: import("node:stream").Writable | null): void;
|
|
51
78
|
/**
|
|
52
79
|
* Prints a Capistrano-style lifecycle line in human mode; no-op otherwise.
|
|
80
|
+
* The line is always tee'd to the persistent log (when attached) so the log
|
|
81
|
+
* stays readable even for a `--json` automation deploy.
|
|
53
82
|
*
|
|
54
83
|
* @param {string} message
|
|
55
84
|
* @returns {void}
|
|
56
85
|
*/
|
|
57
86
|
line(message: string): void;
|
|
58
87
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
88
|
+
* Records already-redacted command output. It is always tee'd to the deploy
|
|
89
|
+
* log when one is attached, so the log is a full transcript regardless of
|
|
90
|
+
* output mode. It is streamed live to the error stream only when
|
|
91
|
+
* {@link streamsCommands} is set (human mode) — the error stream keeps human
|
|
92
|
+
* stdout reserved for lifecycle progress and JSON stdout clean.
|
|
62
93
|
*
|
|
63
94
|
* @param {string} text
|
|
64
|
-
* @returns {boolean}
|
|
95
|
+
* @returns {boolean} Backpressure signal: `false` asks the caller to pause. Only the live stream can request a pause; log-only writes never do.
|
|
65
96
|
*/
|
|
66
97
|
writeCommandOutput(text: string): boolean;
|
|
67
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../src/core/reporter.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../src/core/reporter.js"],"names":[],"mappings":"AAsGA;;;;GAIG;AACH,iCAFa,QAAQ,CAIpB;AAED;;;;;GAKG;AACH,gCAFa,QAAQ,CAIpB;AArHD;;;;;;;;GAQG;AAEH;;;GAGG;AACH;IACE;;OAEG;IACH,iEAFW;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,aAAa,EAAE,QAAQ,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,aAAa,EAAE,QAAQ,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,aAAa,EAAE,QAAQ,GAAC,IAAI,CAAA;KAAC,EAmBtL;IAhBC,sBAAsB;IACtB,kBADW,OAAO,CACe;IACjC,sBAAsB;IACtB,gBADW,OAAO,CACkB;IACpC,6CAA6C;IAC7C,KADW,OAAO,aAAa,EAAE,QAAQ,CAC3B;IACd,6CAA6C;IAC7C,KADW,OAAO,aAAa,EAAE,QAAQ,CAC3B;IACd;;;;;;OAMG;IACH,WAFU,OAAO,aAAa,EAAE,QAAQ,GAAC,IAAI,CAEnB;IAG5B;;;;OAIG;IACH,uBAFa,OAAO,CAInB;IAED;;;;;;;OAOG;IACH,wBAFa,OAAO,CAInB;IAED;;;;;;;OAOG;IACH,wBAHW,OAAO,aAAa,EAAE,QAAQ,GAAC,IAAI,GACjC,IAAI,CAIhB;IAED;;;;;;;OAOG;IACH,cAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;;;;;;;OASG;IACH,yBAHW,MAAM,GACJ,OAAO,CAMnB;CACF"}
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
*/
|
|
15
15
|
export class Reporter {
|
|
16
16
|
/**
|
|
17
|
-
* @param {{lifecycle?: boolean, streamCommands?: boolean, out?: import('node:stream').Writable, err?: import('node:stream').Writable}} [opts]
|
|
17
|
+
* @param {{lifecycle?: boolean, streamCommands?: boolean, out?: import('node:stream').Writable, err?: import('node:stream').Writable, logStream?: import('node:stream').Writable|null}} [opts]
|
|
18
18
|
*/
|
|
19
|
-
constructor({ lifecycle = true, streamCommands = true, out = process.stdout, err = process.stderr } = {}) {
|
|
19
|
+
constructor({ lifecycle = true, streamCommands = true, out = process.stdout, err = process.stderr, logStream = null } = {}) {
|
|
20
20
|
/** @type {boolean} */
|
|
21
21
|
this.lifecycleEnabled = lifecycle;
|
|
22
22
|
/** @type {boolean} */
|
|
@@ -25,6 +25,14 @@ export class Reporter {
|
|
|
25
25
|
this.out = out;
|
|
26
26
|
/** @type {import('node:stream').Writable} */
|
|
27
27
|
this.err = err;
|
|
28
|
+
/**
|
|
29
|
+
* Optional persistent per-deploy log. When attached, every lifecycle line
|
|
30
|
+
* and streamed command chunk is tee'd here in addition to the live
|
|
31
|
+
* stdout/stderr contract, so a full deploy transcript survives on disk.
|
|
32
|
+
*
|
|
33
|
+
* @type {import('node:stream').Writable|null}
|
|
34
|
+
*/
|
|
35
|
+
this.logStream = logStream;
|
|
28
36
|
}
|
|
29
37
|
/**
|
|
30
38
|
* Whether live command stdout/stderr should be streamed as it arrives.
|
|
@@ -34,8 +42,32 @@ export class Reporter {
|
|
|
34
42
|
get streamsCommands() {
|
|
35
43
|
return this.streamCommands;
|
|
36
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Whether the transport should feed redacted command output to the reporter at
|
|
47
|
+
* all — either to live-stream it or to persist it to the deploy log. This is
|
|
48
|
+
* decoupled from {@link streamsCommands} so a `--json` deploy still records a
|
|
49
|
+
* full command transcript in its log even though nothing is streamed live.
|
|
50
|
+
*
|
|
51
|
+
* @returns {boolean}
|
|
52
|
+
*/
|
|
53
|
+
get capturesCommands() {
|
|
54
|
+
return this.streamCommands || this.logStream !== null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Attaches a persistent per-deploy log stream after construction. The deploy
|
|
58
|
+
* command builds the reporter before the config (and therefore the log path)
|
|
59
|
+
* is known, so the log is tee'd in once resolved.
|
|
60
|
+
*
|
|
61
|
+
* @param {import('node:stream').Writable|null} stream
|
|
62
|
+
* @returns {void}
|
|
63
|
+
*/
|
|
64
|
+
attachLogStream(stream) {
|
|
65
|
+
this.logStream = stream;
|
|
66
|
+
}
|
|
37
67
|
/**
|
|
38
68
|
* Prints a Capistrano-style lifecycle line in human mode; no-op otherwise.
|
|
69
|
+
* The line is always tee'd to the persistent log (when attached) so the log
|
|
70
|
+
* stays readable even for a `--json` automation deploy.
|
|
39
71
|
*
|
|
40
72
|
* @param {string} message
|
|
41
73
|
* @returns {void}
|
|
@@ -43,16 +75,24 @@ export class Reporter {
|
|
|
43
75
|
line(message) {
|
|
44
76
|
if (this.lifecycleEnabled)
|
|
45
77
|
this.out.write(`${message}\n`);
|
|
78
|
+
if (this.logStream)
|
|
79
|
+
this.logStream.write(`${message}\n`);
|
|
46
80
|
}
|
|
47
81
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
82
|
+
* Records already-redacted command output. It is always tee'd to the deploy
|
|
83
|
+
* log when one is attached, so the log is a full transcript regardless of
|
|
84
|
+
* output mode. It is streamed live to the error stream only when
|
|
85
|
+
* {@link streamsCommands} is set (human mode) — the error stream keeps human
|
|
86
|
+
* stdout reserved for lifecycle progress and JSON stdout clean.
|
|
51
87
|
*
|
|
52
88
|
* @param {string} text
|
|
53
|
-
* @returns {boolean}
|
|
89
|
+
* @returns {boolean} Backpressure signal: `false` asks the caller to pause. Only the live stream can request a pause; log-only writes never do.
|
|
54
90
|
*/
|
|
55
91
|
writeCommandOutput(text) {
|
|
92
|
+
if (this.logStream)
|
|
93
|
+
this.logStream.write(text);
|
|
94
|
+
if (!this.streamCommands)
|
|
95
|
+
return true;
|
|
56
96
|
return this.err.write(text);
|
|
57
97
|
}
|
|
58
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/core/reporter.js"],"names":[],"mappings":"AAAA,YAAY;AAEZ;;;;;;;;GAQG;AAEH;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACnB;;OAEG;IACH,YAAY,EAAC,SAAS,GAAG,IAAI,EAAE,cAAc,GAAG,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAC,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/core/reporter.js"],"names":[],"mappings":"AAAA,YAAY;AAEZ;;;;;;;;GAQG;AAEH;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACnB;;OAEG;IACH,YAAY,EAAC,SAAS,GAAG,IAAI,EAAE,cAAc,GAAG,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,EAAC,GAAG,EAAE;QACtH,sBAAsB;QACtB,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAA;QACjC,sBAAsB;QACtB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;QACpC,6CAA6C;QAC7C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,6CAA6C;QAC7C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd;;;;;;WAMG;QACH,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED;;;;OAIG;IACH,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAA;IACvD,CAAC;IAED;;;;;;;OAOG;IACH,eAAe,CAAC,MAAM;QACpB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAA;IACzB,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,CAAC,OAAO;QACV,IAAI,IAAI,CAAC,gBAAgB;YAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAA;QACzD,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;;;;;OASG;IACH,kBAAkB,CAAC,IAAI;QACrB,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAA;QACrC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,QAAQ,CAAC,EAAC,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAC,CAAC,CAAA;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,QAAQ,CAAC,EAAC,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAC,CAAC,CAAA;AAChE,CAAC"}
|
|
@@ -30,12 +30,14 @@ export function normalizeTask(name: string, entry: string | import("#types").Tas
|
|
|
30
30
|
* @param {import('#types').Transport} transport
|
|
31
31
|
* @param {import('#types').TaskEntry} task
|
|
32
32
|
* @param {string} cwd
|
|
33
|
-
* @param {{previousReleasePath?: string|null, reporter?: Reporter}} [opts]
|
|
33
|
+
* @param {{previousReleasePath?: string|null, reporter?: Reporter, secretEnv?: Record<string, string>, strictCwd?: boolean}} [opts]
|
|
34
34
|
* @returns {Promise<import('#types').TaskResult>}
|
|
35
35
|
*/
|
|
36
|
-
export function runTask(transport: import("#types").Transport, task: import("#types").TaskEntry, cwd: string, { previousReleasePath, reporter }?: {
|
|
36
|
+
export function runTask(transport: import("#types").Transport, task: import("#types").TaskEntry, cwd: string, { previousReleasePath, reporter, secretEnv, strictCwd }?: {
|
|
37
37
|
previousReleasePath?: string | null;
|
|
38
38
|
reporter?: Reporter;
|
|
39
|
+
secretEnv?: Record<string, string>;
|
|
40
|
+
strictCwd?: boolean;
|
|
39
41
|
}): Promise<import("#types").TaskResult>;
|
|
40
42
|
import { Reporter } from "./reporter.js";
|
|
41
43
|
//# sourceMappingURL=task-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../../../src/core/task-runner.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../../../src/core/task-runner.js"],"names":[],"mappings":"AAMA;;;GAGG;AACH,oCAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,QAAQ,EAAE,SAAS,EAAE,CAQxC;AAED;;;;;;GAMG;AACH,oCANW,OAAO,QAAQ,EAAE,SAAS,SAC1B,OAAO,QAAQ,EAAE,WAAW,eAC5B,MAAM,sCACN;IAAC,mBAAmB,CAAC,EAAE,MAAM,GAAC,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAC,GACtD,OAAO,CAAC,OAAO,QAAQ,EAAE,UAAU,EAAE,CAAC,CAQlD;AAED;;;;GAIG;AACH,yCAJW,MAAM,WACN,MAAM,GAAC,OAAO,QAAQ,EAAE,SAAS,GAAC,KAAK,CAAC,MAAM,GAAC,OAAO,QAAQ,EAAE,SAAS,CAAC,GACxE,OAAO,QAAQ,EAAE,SAAS,EAAE,CASxC;AAED;;;;GAIG;AACH,oCAJW,MAAM,SACN,MAAM,GAAC,OAAO,QAAQ,EAAE,SAAS,GAC/B,OAAO,QAAQ,EAAE,SAAS,CAOtC;AAED;;;;;;GAMG;AACH,mCANW,OAAO,QAAQ,EAAE,SAAS,QAC1B,OAAO,QAAQ,EAAE,SAAS,OAC1B,MAAM,4DACN;IAAC,mBAAmB,CAAC,EAAE,MAAM,GAAC,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAC,GAC/G,OAAO,CAAC,OAAO,QAAQ,EAAE,UAAU,CAAC,CAgChD;yBA7FsB,eAAe"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
+
import path from "node:path";
|
|
2
3
|
import { redactText } from "./redaction.js";
|
|
3
4
|
import { Reporter } from "./reporter.js";
|
|
4
5
|
import { pathsChanged } from "./path-change-gate.js";
|
|
@@ -58,10 +59,10 @@ export function normalizeTask(name, entry) {
|
|
|
58
59
|
* @param {import('#types').Transport} transport
|
|
59
60
|
* @param {import('#types').TaskEntry} task
|
|
60
61
|
* @param {string} cwd
|
|
61
|
-
* @param {{previousReleasePath?: string|null, reporter?: Reporter}} [opts]
|
|
62
|
+
* @param {{previousReleasePath?: string|null, reporter?: Reporter, secretEnv?: Record<string, string>, strictCwd?: boolean}} [opts]
|
|
62
63
|
* @returns {Promise<import('#types').TaskResult>}
|
|
63
64
|
*/
|
|
64
|
-
export async function runTask(transport, task, cwd, { previousReleasePath, reporter = new Reporter({ lifecycle: false }) } = {}) {
|
|
65
|
+
export async function runTask(transport, task, cwd, { previousReleasePath, reporter = new Reporter({ lifecycle: false }), secretEnv, strictCwd = false } = {}) {
|
|
65
66
|
if (task.onlyIfChanged && previousReleasePath) {
|
|
66
67
|
const changed = await pathsChanged(transport, previousReleasePath, cwd, task.onlyIfChanged);
|
|
67
68
|
if (!changed) {
|
|
@@ -69,22 +70,47 @@ export async function runTask(transport, task, cwd, { previousReleasePath, repor
|
|
|
69
70
|
return taskResult(task, task.optional === true, "skipped", undefined, "no paths changed");
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
|
-
const taskCwd =
|
|
73
|
+
const taskCwd = resolveTaskCwd(cwd, task.cwd, strictCwd);
|
|
73
74
|
const optional = task.optional === true;
|
|
74
|
-
|
|
75
|
+
const knownSecrets = Object.values(secretEnv ?? {});
|
|
76
|
+
reporter.line(` * Running task ${task.name}: ${redactText(task.command, knownSecrets)}`);
|
|
75
77
|
try {
|
|
76
|
-
|
|
78
|
+
const runOptions = {
|
|
79
|
+
cwd: taskCwd,
|
|
80
|
+
env: task.env ?? {},
|
|
81
|
+
...(secretEnv === undefined ? {} : { secretEnv })
|
|
82
|
+
};
|
|
83
|
+
await transport.run(task.command, runOptions);
|
|
77
84
|
return taskResult(task, optional, "passed", undefined);
|
|
78
85
|
}
|
|
79
86
|
catch (error) {
|
|
80
87
|
if (optional) {
|
|
81
88
|
const err = /** @type {Error} */ (error);
|
|
82
|
-
|
|
83
|
-
|
|
89
|
+
const redactedError = new Error(redactText(err.message, knownSecrets));
|
|
90
|
+
reporter.line(` * Optional task '${task.name}' failed: ${redactedError.message}`);
|
|
91
|
+
return taskResult(task, optional, "failed", redactedError);
|
|
84
92
|
}
|
|
85
93
|
const err = /** @type {Error} */ (error);
|
|
86
|
-
throw new Error(`Task '${task.name}' failed while running ${redactText(task.command)}: ${err.message}`);
|
|
94
|
+
throw new Error(`Task '${task.name}' failed while running ${redactText(task.command, knownSecrets)}: ${redactText(err.message, knownSecrets)}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* @param {string} releasePath
|
|
99
|
+
* @param {string|undefined} taskCwd
|
|
100
|
+
* @param {boolean} strict
|
|
101
|
+
* @returns {string}
|
|
102
|
+
*/
|
|
103
|
+
function resolveTaskCwd(releasePath, taskCwd, strict) {
|
|
104
|
+
if (!taskCwd)
|
|
105
|
+
return releasePath;
|
|
106
|
+
if (!strict)
|
|
107
|
+
return `${releasePath}/${taskCwd}`;
|
|
108
|
+
const resolved = path.resolve(releasePath, taskCwd);
|
|
109
|
+
const relative = path.relative(path.resolve(releasePath), resolved);
|
|
110
|
+
if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
111
|
+
throw new Error(`Task working directory '${taskCwd}' escapes active release ${releasePath}.`);
|
|
87
112
|
}
|
|
113
|
+
return resolved;
|
|
88
114
|
}
|
|
89
115
|
/**
|
|
90
116
|
* @param {import('#types').TaskEntry} task
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-runner.js","sourceRoot":"","sources":["../../../src/core/task-runner.js"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAA;AACtC,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAA;AAElD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAK;IAChC,MAAM,QAAQ,GAAG,EAAE,CAAA;IACnB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,QAAQ,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IACrD,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,EAAC,mBAAmB,EAAE,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAC,SAAS,EAAE,KAAK,EAAC,CAAC,EAAC,GAAG,EAAE;IACnI,MAAM,OAAO,GAAG,EAAE,CAAA;IAClB,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,EAAC,mBAAmB,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAA;IAC5F,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAI,EAAE,OAAO;IAC9C,MAAM,QAAQ,GAAG,EAAE,CAAA;IACnB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACzD,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAI,EAAE,KAAK;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAC,CAAA;IAC5D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,uDAAuD,CAAC,CAAA;IACtJ,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,uBAAuB,CAAC,CAAA;IAC1H,OAAO,EAAC,IAAI,EAAE,GAAG,KAAK,EAAC,CAAA;AACzB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,EAAC,mBAAmB,EAAE,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAC,SAAS,EAAE,KAAK,EAAC,CAAC,EAAC,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"task-runner.js","sourceRoot":"","sources":["../../../src/core/task-runner.js"],"names":[],"mappings":"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"}
|
|
@@ -46,6 +46,22 @@ export class LocalTransport {
|
|
|
46
46
|
* @returns {Promise<void>}
|
|
47
47
|
*/
|
|
48
48
|
writeFile(filePath: string, content: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* @param {string} filePath
|
|
51
|
+
* @param {string} content
|
|
52
|
+
* @returns {Promise<boolean>}
|
|
53
|
+
*/
|
|
54
|
+
writeFileExclusive(filePath: string, content: string): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Removes a file only while it still contains the exact expected content.
|
|
57
|
+
* Conditional removers are serialized by a kernel-owned advisory lock, which
|
|
58
|
+
* is released if the remover is interrupted.
|
|
59
|
+
*
|
|
60
|
+
* @param {string} filePath
|
|
61
|
+
* @param {string} expectedContent
|
|
62
|
+
* @returns {Promise<boolean>}
|
|
63
|
+
*/
|
|
64
|
+
removeFileIfContent(filePath: string, expectedContent: string): Promise<boolean>;
|
|
49
65
|
/**
|
|
50
66
|
* @param {string} filePath
|
|
51
67
|
* @returns {Promise<string>}
|
|
@@ -64,12 +80,13 @@ export class LocalTransport {
|
|
|
64
80
|
copyDir(from: string, to: string): Promise<void>;
|
|
65
81
|
/**
|
|
66
82
|
* @param {string} command
|
|
67
|
-
* @param {{cwd?: string, env?: Record<string, string>}} [opts]
|
|
83
|
+
* @param {{cwd?: string, env?: Record<string, string>, secretEnv?: Record<string, string>}} [opts]
|
|
68
84
|
* @returns {Promise<import('#types').SpawnResult>}
|
|
69
85
|
*/
|
|
70
|
-
run(command: string, { cwd, env }?: {
|
|
86
|
+
run(command: string, { cwd, env, secretEnv }?: {
|
|
71
87
|
cwd?: string;
|
|
72
88
|
env?: Record<string, string>;
|
|
89
|
+
secretEnv?: Record<string, string>;
|
|
73
90
|
}): Promise<import("#types").SpawnResult>;
|
|
74
91
|
}
|
|
75
92
|
//# sourceMappingURL=local-transport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-transport.d.ts","sourceRoot":"","sources":["../../../src/transports/local-transport.js"],"names":[],"mappings":"AAOA;IACE;;OAEG;IACH,2BAFW;QAAC,QAAQ,CAAC,EAAE,OAAO,qBAAqB,EAAE,QAAQ,CAAA;KAAC,EAK7D;IAFC,qDAAqD;IACrD,UADW,OAAO,qBAAqB,EAAE,QAAQ,CACzB;IAG1B;;;OAGG;IACH,mBAHW,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;OAGG;IACH,mBAHW,MAAM,GACJ,OAAO,CAAC,OAAO,CAAC,CAW5B;IAED;;;;;OAKG;IACH,gBALW,MAAM,YACN,MAAM,SACN,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;OAGG;IACH,mBAHW,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CAI3B;IAED;;;OAGG;IACH,eAHW,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,aAJW,MAAM,MACN,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,oBAJW,MAAM,WACN,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAKzB;IAED;;;OAGG;IACH,mBAHW,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CAI3B;IAED;;;OAGG;IACH,iBAHW,MAAM,GACJ,OAAO,CAAC,MAAM,EAAE,CAAC,CAU7B;IAED;;;;OAIG;IACH,cAJW,MAAM,MACN,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,aAJW,MAAM,
|
|
1
|
+
{"version":3,"file":"local-transport.d.ts","sourceRoot":"","sources":["../../../src/transports/local-transport.js"],"names":[],"mappings":"AAOA;IACE;;OAEG;IACH,2BAFW;QAAC,QAAQ,CAAC,EAAE,OAAO,qBAAqB,EAAE,QAAQ,CAAA;KAAC,EAK7D;IAFC,qDAAqD;IACrD,UADW,OAAO,qBAAqB,EAAE,QAAQ,CACzB;IAG1B;;;OAGG;IACH,mBAHW,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;OAGG;IACH,mBAHW,MAAM,GACJ,OAAO,CAAC,OAAO,CAAC,CAW5B;IAED;;;;;OAKG;IACH,gBALW,MAAM,YACN,MAAM,SACN,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;OAGG;IACH,mBAHW,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CAI3B;IAED;;;OAGG;IACH,eAHW,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,aAJW,MAAM,MACN,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,oBAJW,MAAM,WACN,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAKzB;IAED;;;;OAIG;IACH,6BAJW,MAAM,WACN,MAAM,GACJ,OAAO,CAAC,OAAO,CAAC,CAY5B;IAED;;;;;;;;OAQG;IACH,8BAJW,MAAM,mBACN,MAAM,GACJ,OAAO,CAAC,OAAO,CAAC,CAc5B;IAED;;;OAGG;IACH,mBAHW,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CAI3B;IAED;;;OAGG;IACH,iBAHW,MAAM,GACJ,OAAO,CAAC,MAAM,EAAE,CAAC,CAU7B;IAED;;;;OAIG;IACH,cAJW,MAAM,MACN,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,aAJW,MAAM,4BACN;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAC,GAC9E,OAAO,CAAC,OAAO,QAAQ,EAAE,WAAW,CAAC,CAuCjD;CACF"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { spawn } from "node:child_process";
|
|
5
|
-
import { redactText, StreamingRedactor } from "../core/redaction.js";
|
|
5
|
+
import { isValidEnvironmentName, redactText, StreamingRedactor } from "../core/redaction.js";
|
|
6
6
|
import { Reporter } from "../core/reporter.js";
|
|
7
7
|
export class LocalTransport {
|
|
8
8
|
/**
|
|
@@ -75,6 +75,45 @@ export class LocalTransport {
|
|
|
75
75
|
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
76
76
|
await fs.writeFile(filePath, content);
|
|
77
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* @param {string} filePath
|
|
80
|
+
* @param {string} content
|
|
81
|
+
* @returns {Promise<boolean>}
|
|
82
|
+
*/
|
|
83
|
+
async writeFileExclusive(filePath, content) {
|
|
84
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
85
|
+
try {
|
|
86
|
+
await fs.writeFile(filePath, content, { flag: "wx" });
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const err = /** @type {{code?: string}} */ (error);
|
|
91
|
+
if (err.code === "EEXIST")
|
|
92
|
+
return false;
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Removes a file only while it still contains the exact expected content.
|
|
98
|
+
* Conditional removers are serialized by a kernel-owned advisory lock, which
|
|
99
|
+
* is released if the remover is interrupted.
|
|
100
|
+
*
|
|
101
|
+
* @param {string} filePath
|
|
102
|
+
* @param {string} expectedContent
|
|
103
|
+
* @returns {Promise<boolean>}
|
|
104
|
+
*/
|
|
105
|
+
async removeFileIfContent(filePath, expectedContent) {
|
|
106
|
+
const guardPath = `${filePath}.rampway-remove`;
|
|
107
|
+
await fs.mkdir(guardPath, { recursive: true });
|
|
108
|
+
const exitCode = await runConditionalRemove(path.join(guardPath, "guard.lock"), filePath, expectedContent);
|
|
109
|
+
if (exitCode === 0)
|
|
110
|
+
return true;
|
|
111
|
+
if (exitCode === 75)
|
|
112
|
+
throw new Error(`File ownership removal is already in progress: ${filePath}`);
|
|
113
|
+
if (exitCode === 76)
|
|
114
|
+
return false;
|
|
115
|
+
throw new Error(`Conditional file removal failed with exit ${exitCode ?? "unknown"}: ${filePath}`);
|
|
116
|
+
}
|
|
78
117
|
/**
|
|
79
118
|
* @param {string} filePath
|
|
80
119
|
* @returns {Promise<string>}
|
|
@@ -107,19 +146,21 @@ export class LocalTransport {
|
|
|
107
146
|
}
|
|
108
147
|
/**
|
|
109
148
|
* @param {string} command
|
|
110
|
-
* @param {{cwd?: string, env?: Record<string, string>}} [opts]
|
|
149
|
+
* @param {{cwd?: string, env?: Record<string, string>, secretEnv?: Record<string, string>}} [opts]
|
|
111
150
|
* @returns {Promise<import('#types').SpawnResult>}
|
|
112
151
|
*/
|
|
113
|
-
async run(command, { cwd, env = {} } = {}) {
|
|
114
|
-
|
|
152
|
+
async run(command, { cwd, env = {}, secretEnv = {} } = {}) {
|
|
153
|
+
validateEnvironment(env, secretEnv);
|
|
154
|
+
const knownSecrets = Object.values(secretEnv);
|
|
155
|
+
const shouldCapture = this.reporter.capturesCommands;
|
|
115
156
|
return await new Promise((resolve, reject) => {
|
|
116
|
-
const child = spawn(command, { cwd, env: { ...process.env, ...env }, shell: true });
|
|
157
|
+
const child = spawn(command, { cwd, env: { ...process.env, ...env, ...secretEnv }, shell: true });
|
|
117
158
|
let output = "";
|
|
118
|
-
const redactor = new StreamingRedactor();
|
|
159
|
+
const redactor = new StreamingRedactor({ knownSecrets });
|
|
119
160
|
const emit = /** @param {Buffer|string} chunk */ /** @param {Buffer|string} chunk */ chunk => {
|
|
120
161
|
const text = chunk.toString();
|
|
121
162
|
output += text;
|
|
122
|
-
if (!
|
|
163
|
+
if (!shouldCapture)
|
|
123
164
|
return;
|
|
124
165
|
const safe = redactor.push(text);
|
|
125
166
|
if (safe && !this.reporter.writeCommandOutput(safe)) {
|
|
@@ -132,7 +173,7 @@ export class LocalTransport {
|
|
|
132
173
|
}
|
|
133
174
|
};
|
|
134
175
|
const flush = () => {
|
|
135
|
-
if (!
|
|
176
|
+
if (!shouldCapture)
|
|
136
177
|
return;
|
|
137
178
|
const rest = redactor.flush();
|
|
138
179
|
if (rest)
|
|
@@ -140,16 +181,63 @@ export class LocalTransport {
|
|
|
140
181
|
};
|
|
141
182
|
child.stdout.on("data", emit);
|
|
142
183
|
child.stderr.on("data", emit);
|
|
143
|
-
child.on("error", /** @param {Error} error */ /** @param {Error} error */ error => { flush(); reject(error); });
|
|
184
|
+
child.on("error", /** @param {Error} error */ /** @param {Error} error */ error => { flush(); reject(new Error(redactText(error.message, knownSecrets))); });
|
|
144
185
|
child.on("close", /** @param {number|null} code */ /** @param {number|null} code */ code => {
|
|
145
186
|
flush();
|
|
146
187
|
if (code === 0)
|
|
147
|
-
resolve({ code, output: redactText(output) });
|
|
188
|
+
resolve({ code, output: redactText(output, knownSecrets) });
|
|
148
189
|
else
|
|
149
|
-
reject(new Error(`Command failed with exit ${code}: ${redactText(command)}
|
|
150
|
-
${redactText(output)}`));
|
|
190
|
+
reject(new Error(`Command failed with exit ${code}: ${redactText(command, knownSecrets)}
|
|
191
|
+
${redactText(output, knownSecrets)}`));
|
|
151
192
|
});
|
|
152
193
|
});
|
|
153
194
|
}
|
|
154
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* @param {string} guardLockPath
|
|
198
|
+
* @param {string} filePath
|
|
199
|
+
* @param {string} expectedContent
|
|
200
|
+
* @returns {Promise<number|null>}
|
|
201
|
+
*/
|
|
202
|
+
async function runConditionalRemove(guardLockPath, filePath, expectedContent) {
|
|
203
|
+
const script = 'if ! test -f "$1"; then exit 76; fi; cmp -s "$1" -; status=$?; if test "$status" -eq 1; then exit 76; elif test "$status" -ne 0; then exit 74; fi; rm -f "$1" || exit 74';
|
|
204
|
+
return await new Promise((resolve, reject) => {
|
|
205
|
+
const child = spawn("flock", ["-n", "-E", "75", "--", guardLockPath, "sh", "-c", script, "rampway-remove", filePath]);
|
|
206
|
+
let settled = false;
|
|
207
|
+
const fail = /** @param {Error} error */ /** @param {Error} error */ error => {
|
|
208
|
+
if (settled)
|
|
209
|
+
return;
|
|
210
|
+
settled = true;
|
|
211
|
+
reject(error);
|
|
212
|
+
};
|
|
213
|
+
child.on("error", fail);
|
|
214
|
+
child.stdin.on("error", error => {
|
|
215
|
+
if ( /** @type {{code?: string}} */(error).code !== "EPIPE")
|
|
216
|
+
fail(error);
|
|
217
|
+
});
|
|
218
|
+
child.stderr.resume();
|
|
219
|
+
child.on("close", code => {
|
|
220
|
+
if (settled)
|
|
221
|
+
return;
|
|
222
|
+
settled = true;
|
|
223
|
+
resolve(code);
|
|
224
|
+
});
|
|
225
|
+
child.stdin.end(expectedContent);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* @param {Record<string, string>} env
|
|
230
|
+
* @param {Record<string, string>} secretEnv
|
|
231
|
+
* @returns {void}
|
|
232
|
+
*/
|
|
233
|
+
function validateEnvironment(env, secretEnv) {
|
|
234
|
+
for (const name of [...Object.keys(env), ...Object.keys(secretEnv)]) {
|
|
235
|
+
if (!isValidEnvironmentName(name))
|
|
236
|
+
throw new Error(`Invalid environment variable name: ${name}`);
|
|
237
|
+
}
|
|
238
|
+
for (const [name, value] of Object.entries(secretEnv)) {
|
|
239
|
+
if (value.includes("\0"))
|
|
240
|
+
throw new Error(`Secret environment variable '${name}' contains NUL and cannot be transported.`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
155
243
|
//# sourceMappingURL=local-transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-transport.js","sourceRoot":"","sources":["../../../src/transports/local-transport.js"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAA;AACxC,OAAO,EAAC,UAAU,EAAE,iBAAiB,EAAC,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"local-transport.js","sourceRoot":"","sources":["../../../src/transports/local-transport.js"],"names":[],"mappings":"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"}
|