@sparkwing/sdk 0.0.0-stage → 0.68.2
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 +183 -2
- package/dist/command.js +272 -0
- package/dist/command.js.map +1 -0
- package/dist/context.js +69 -0
- package/dist/context.js.map +1 -0
- package/dist/describe.js +70 -0
- package/dist/describe.js.map +1 -0
- package/dist/errors.js +88 -0
- package/dist/errors.js.map +1 -0
- package/dist/helpers/docker.js +267 -0
- package/dist/helpers/docker.js.map +1 -0
- package/dist/helpers/files.js +141 -0
- package/dist/helpers/files.js.map +1 -0
- package/dist/helpers/git.js +263 -0
- package/dist/helpers/git.js.map +1 -0
- package/dist/helpers/memo.js +29 -0
- package/dist/helpers/memo.js.map +1 -0
- package/dist/helpers/services.js +160 -0
- package/dist/helpers/services.js.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/json.js +27 -0
- package/dist/json.js.map +1 -0
- package/dist/log.js +42 -0
- package/dist/log.js.map +1 -0
- package/dist/main.js +68 -0
- package/dist/main.js.map +1 -0
- package/dist/plan-wire.js +2 -0
- package/dist/plan-wire.js.map +1 -0
- package/dist/plan.js +811 -0
- package/dist/plan.js.map +1 -0
- package/dist/protocol.js +209 -0
- package/dist/protocol.js.map +1 -0
- package/dist/routes.js +185 -0
- package/dist/routes.js.map +1 -0
- package/dist/runner.js +380 -0
- package/dist/runner.js.map +1 -0
- package/dist/scope.js +27 -0
- package/dist/scope.js.map +1 -0
- package/dist/step-state.js +53 -0
- package/dist/step-state.js.map +1 -0
- package/dist/transport.js +50 -0
- package/dist/transport.js.map +1 -0
- package/index.d.ts +390 -0
- package/native/win32-arm64/protocol.node +0 -0
- package/native/win32-arm64/verification.json +1 -0
- package/native/win32-x64/protocol.node +0 -0
- package/native/win32-x64/verification.json +1 -0
- package/package.json +47 -4
package/README.md
CHANGED
|
@@ -1,3 +1,184 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @sparkwing/sdk
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Declare Sparkwing pipelines in TypeScript. The host schedules jobs and owns
|
|
4
|
+
placement, retries, risk authorization, storage and credentials. SDK processes
|
|
5
|
+
build declarations and execute the bodies and closures the host requests.
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { definePipeline, main } from "@sparkwing/sdk";
|
|
9
|
+
|
|
10
|
+
definePipeline({
|
|
11
|
+
name: "check",
|
|
12
|
+
args: [{ name: "target", type: "string", default: "all" }],
|
|
13
|
+
secrets: [{ name: "DEPLOY_TOKEN", optional: true }],
|
|
14
|
+
plan(plan, run) {
|
|
15
|
+
const build = plan
|
|
16
|
+
.job("build", async (ctx) => {
|
|
17
|
+
await ctx.exec(["npm", "run", "build"]).run();
|
|
18
|
+
return { target: run.args.target };
|
|
19
|
+
})
|
|
20
|
+
.artifacts("dist/**");
|
|
21
|
+
plan
|
|
22
|
+
.job("report", async (ctx) => {
|
|
23
|
+
const output = await ctx.output(build);
|
|
24
|
+
await ctx.summary(`Built ${output?.target}`);
|
|
25
|
+
})
|
|
26
|
+
.needs(build)
|
|
27
|
+
.consumes(build, { into: "build-output" });
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
await main();
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`name` is the registration key. The `entrypoint` of a `sparkwing.yaml`
|
|
35
|
+
pipeline names it, and the run context's `pipeline` carries the invoked name.
|
|
36
|
+
|
|
37
|
+
Declare allowed child runs with `job.startsChildren("deploy")` for the parent
|
|
38
|
+
repository or `job.startsChildrenIn("gh:123", "publish")` for an explicit canonical
|
|
39
|
+
repository key. Calls append targets and can be chained.
|
|
40
|
+
|
|
41
|
+
Use an exact package version in `.sparkwing/package.json`. Its version selects
|
|
42
|
+
the matching engine. The package requires Node.js 22.18 or later. The public
|
|
43
|
+
API is [index.d.ts](index.d.ts).
|
|
44
|
+
|
|
45
|
+
Numeric duration options use milliseconds. Memory uses bytes. Omitted options
|
|
46
|
+
remain unset. Explicit zero remains zero, including an
|
|
47
|
+
indefinite approval timeout. Argument values stay strings, including `int64`.
|
|
48
|
+
The host validates arguments after describe and before planning. Empty defaults
|
|
49
|
+
mean no default. Required arguments with non-empty defaults are refused. NaN and
|
|
50
|
+
infinity are refused. Help and describe inspect declarations without requiring
|
|
51
|
+
invocation values. Errors come from host preparation as `invalid_args`.
|
|
52
|
+
Duration arguments use Go syntax such as `1h30m`, including `0`, `+0` and `-0`.
|
|
53
|
+
String-array arguments use comma splitting, trimming and empty-item removal in
|
|
54
|
+
both the raw argument map and typed values. The host trims enum choices and checks
|
|
55
|
+
each list item. Scalar string values keep their whitespace.
|
|
56
|
+
SDK declarations and direct `toDoc()` calls rely on host validation of argument
|
|
57
|
+
schemas, plan graphs and secret declarations. Generated jobs carry argument
|
|
58
|
+
declarations in their job specification. The host validates and prepares values
|
|
59
|
+
from the accepted run snapshot after generation, then sends them with execution
|
|
60
|
+
requests. Enable `extra` for supplied flags that only a generator declares. Annotation locations are validated
|
|
61
|
+
by the host service; TypeScript retains transport type checks.
|
|
62
|
+
Initial jobs may only use argument declarations discovered by zero-input describe,
|
|
63
|
+
with job IDs allowed to change. The gated expansion path registers secrets for new
|
|
64
|
+
generated declarations before execution.
|
|
65
|
+
|
|
66
|
+
`Context` provides lazy secrets and plain variables, typed outputs, references,
|
|
67
|
+
annotations, summaries, acknowledged masking, OIDC, child runs and cleanup.
|
|
68
|
+
Command, Git, Docker, service and filesystem helpers use the same context
|
|
69
|
+
and cancellation signal. Memo helpers declare input recipes for host evaluation. Plan callbacks declare work; helpers that perform I/O
|
|
70
|
+
refuse calls during planning. Generated jobs reconstruct from recorded source
|
|
71
|
+
output. The host validates the reconstructed declarations against accepted state.
|
|
72
|
+
|
|
73
|
+
Step output reads stay within the current attempt. Before a step condition or
|
|
74
|
+
body runs, the host supplies the terminal predecessor state. A skipped predecessor
|
|
75
|
+
has no local output. A terminal step cannot run again in the same attempt.
|
|
76
|
+
Run facts stay read-only across planning and retries, including trigger details
|
|
77
|
+
and nested pull-request facts.
|
|
78
|
+
Cancellation reaches bodies and every closure kind. A callback that finishes
|
|
79
|
+
after cancellation still reports a failed invocation. The SDK acknowledges
|
|
80
|
+
cancellation after the selected operations finish and receive their own replies.
|
|
81
|
+
Closure evaluations run in request order. Canceling a queued evaluation returns
|
|
82
|
+
without calling its author code or waiting for the running closure. Overlapping
|
|
83
|
+
generator replays return the recorded declaration after the first evaluation.
|
|
84
|
+
Service scopes also reject after cancellation when their callback returns normally.
|
|
85
|
+
They remove their containers before rejecting. If removal fails, host cleanup
|
|
86
|
+
stays registered and the cancellation error is preserved.
|
|
87
|
+
|
|
88
|
+
Git fileset hashes omit files beneath literal directory paths in `.dockerignore`,
|
|
89
|
+
including paths written without a trailing slash. Included file edits still
|
|
90
|
+
change the hash.
|
|
91
|
+
|
|
92
|
+
The host starts `node <entry> --sw-node-protocol`. Protocol 2 begins with hello,
|
|
93
|
+
which supplies granted runner identity and an optional in-memory service binding.
|
|
94
|
+
Requests and frames use private pipes. Standard output and error remain author
|
|
95
|
+
output. No preload or environment bearer is used. The SDK does not filter debug
|
|
96
|
+
logs or assign job identity to log frames.
|
|
97
|
+
|
|
98
|
+
Every encoded frame must fit the 17 MiB wire limit. Oversized logs fail before
|
|
99
|
+
writing. Typed job and step outputs also have a separate 16 MiB limit.
|
|
100
|
+
Generated declarations use the frame budget. The Sparkwing host masks output and
|
|
101
|
+
protocol payloads after receiving them from the SDK. Pipeline code run without a
|
|
102
|
+
Sparkwing host has unmasked logs and errors.
|
|
103
|
+
|
|
104
|
+
Memo helpers declare recipes in the plan. The executing host evaluates them
|
|
105
|
+
against its checkout and effective job environment, under the job admission
|
|
106
|
+
permit. Tracked inputs encode paths, entry types and file bytes or symlink target
|
|
107
|
+
text. Tree inputs include regular files and skip symlinks. Custom callbacks return
|
|
108
|
+
JSON values for host hashing. `memoKey` collects parts and performs no hashing.
|
|
109
|
+
|
|
110
|
+
On Windows, the host supplies decimal handles through
|
|
111
|
+
`--sw-protocol-handles <request>,<frame>`. A packaged native bridge converts them
|
|
112
|
+
to Node descriptors and clears inheritance before SDK tools spawn. Independently
|
|
113
|
+
imported modules may execute before SDK initialization.
|
|
114
|
+
|
|
115
|
+
Build and verify each bridge in its matching native Windows MSVC environment,
|
|
116
|
+
with Node and Go running on that architecture:
|
|
117
|
+
|
|
118
|
+
```sh
|
|
119
|
+
npm run release:native -- --version <engine-version> --headers <node-headers/include/node> --node-lib <node.lib> --arch x64
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Repeat with `--arch arm64` on native Windows arm64. The command stamps both npm
|
|
123
|
+
manifests, builds the bridge and runs `TestNativeProtocol` and
|
|
124
|
+
`TestNativeConformance`. Missing, skipped or failed native tests stop the build.
|
|
125
|
+
Each output directory contains `protocol.node` and a `verification.json` record
|
|
126
|
+
bound to the engine version, bridge bytes and SDK sources.
|
|
127
|
+
|
|
128
|
+
Build both architectures from the same source and version. Transfer their output
|
|
129
|
+
directories to the package checkout, then assemble the package:
|
|
130
|
+
|
|
131
|
+
```sh
|
|
132
|
+
npm run release:pack -- --version <engine-version> --destination <output-directory>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
The release package must contain `native/win32-x64/protocol.node` and
|
|
136
|
+
`native/win32-arm64/protocol.node`. `npm pack` refuses the development version
|
|
137
|
+
and inconsistent lockfile versions. It also checks both bridge files and their
|
|
138
|
+
architecture and DLL headers. Both matching native verification records are
|
|
139
|
+
required because header checks cannot prove that Node can load and use a bridge.
|
|
140
|
+
The bridge source is in [native/protocol.c](native/protocol.c). End users need
|
|
141
|
+
no compiler.
|
|
142
|
+
|
|
143
|
+
## Local dogfooding
|
|
144
|
+
|
|
145
|
+
On Linux or macOS, build a local package without Windows bridges:
|
|
146
|
+
|
|
147
|
+
```sh
|
|
148
|
+
npm ci
|
|
149
|
+
npm run pack:local -- --version <engine-version> --destination <output-directory>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
This command builds the SDK and stamps a temporary package with the exact engine
|
|
153
|
+
release version. It leaves the source manifests unchanged. The tarball carries
|
|
154
|
+
`private: true`, so npm refuses publication even with `--ignore-scripts`.
|
|
155
|
+
Use `release:pack` with verified Windows bridges for published packages.
|
|
156
|
+
Local packages support Linux and macOS. They cannot run on Windows.
|
|
157
|
+
|
|
158
|
+
In the pipeline's package manifest, pin the tarball with
|
|
159
|
+
`"@sparkwing/sdk": "file:vendor/sparkwing-sdk-<engine-version>.tgz"` and run
|
|
160
|
+
`npm install` to record it in the lockfile. The tarball's package version selects
|
|
161
|
+
the exact engine, including any prerelease suffix. Commit the tarball inside the
|
|
162
|
+
repository if fetched checkouts need it. An editable SDK directory can use
|
|
163
|
+
`file:../sdk` after building and stamping that directory's package version.
|
|
164
|
+
|
|
165
|
+
For development, run `npm ci`, `npm run typecheck`, `npm test` and `npm run build`.
|
|
166
|
+
The build emits ESM into `dist/`; package exports expose only the public root.
|
|
167
|
+
The release process stamps `package.json` and its lockfile with the engine
|
|
168
|
+
release version. Hello reads that package version.
|
|
169
|
+
|
|
170
|
+
Run `npm run test:native` from this directory with the repository's Go toolchain
|
|
171
|
+
installed and `GOWORK=off` when a parent workspace points at another checkout.
|
|
172
|
+
The tests build the SDK and launch public-package fixtures with inherited
|
|
173
|
+
Unix descriptors or Windows argv handles. It exchanges requests and replies
|
|
174
|
+
using the Go contract types and check that a child tool cannot access the
|
|
175
|
+
protocol pipes. A second fixture runs the same v2 corpus as the Go SDK, including
|
|
176
|
+
strict plan validation, generated hashes, replay and canonical error envelopes. Use Node and Go for the same CPU architecture. On Windows,
|
|
177
|
+
build the matching native bridge first. Missing Node, TypeScript dependencies
|
|
178
|
+
or bridge binaries fail the test.
|
|
179
|
+
|
|
180
|
+
The Go acceptance suite also runs SDK boundary tests for the protocol scenarios.
|
|
181
|
+
These tests use native pipes, fake bound services and a temporary Git file remote.
|
|
182
|
+
Run the native pipe test on Windows to verify raw handles there. Controller
|
|
183
|
+
authorization, store transitions, artifact/memo persistence, real DinD and the
|
|
184
|
+
six placement paths require their corresponding integration hosts.
|
package/dist/command.js
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { isAbsolute, resolve } from "node:path";
|
|
4
|
+
import { assertExecution, projectRoot } from "./scope.js";
|
|
5
|
+
export const exitNotStarted = -1;
|
|
6
|
+
const bindings = new WeakMap();
|
|
7
|
+
export class ExecError extends Error {
|
|
8
|
+
command;
|
|
9
|
+
stdout;
|
|
10
|
+
stderr;
|
|
11
|
+
exitCode;
|
|
12
|
+
terminated;
|
|
13
|
+
constructor(result, terminated = "", cause) {
|
|
14
|
+
let message = terminated
|
|
15
|
+
? `command terminated by ${terminated}: ${result.command}`
|
|
16
|
+
: result.exitCode === exitNotStarted
|
|
17
|
+
? `command failed to start: ${result.command}`
|
|
18
|
+
: `command failed (exit ${result.exitCode}): ${result.command}`;
|
|
19
|
+
const output = result.stderr.trim() || result.stdout.trim();
|
|
20
|
+
if (cause instanceof Error && (terminated || result.exitCode === exitNotStarted))
|
|
21
|
+
message += `: ${cause.message}`;
|
|
22
|
+
else if (output)
|
|
23
|
+
message += `\n${output}`;
|
|
24
|
+
super(message, cause === undefined ? undefined : { cause });
|
|
25
|
+
this.name = "ExecError";
|
|
26
|
+
this.command = result.command;
|
|
27
|
+
this.stdout = result.stdout;
|
|
28
|
+
this.stderr = result.stderr;
|
|
29
|
+
this.exitCode = result.exitCode;
|
|
30
|
+
this.terminated = terminated;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function registerCommandContext(ctx, emit, env = {}) {
|
|
34
|
+
bindings.set(ctx, { emit, env: { ...env } });
|
|
35
|
+
}
|
|
36
|
+
function binding(ctx) {
|
|
37
|
+
return bindings.get(ctx) ?? { emit: (event, attrs) => ctx.log.info(event, attrs), env: {} };
|
|
38
|
+
}
|
|
39
|
+
function deriveContext(ctx, signal, env) {
|
|
40
|
+
const derived = Object.create(ctx);
|
|
41
|
+
const registered = bindings.has(ctx);
|
|
42
|
+
Object.defineProperties(derived, {
|
|
43
|
+
signal: { value: signal, enumerable: true },
|
|
44
|
+
exec: {
|
|
45
|
+
value: (argv, options) => registered ? createCommand(derived, argv, options) : ctx.exec.call(derived, argv, { ...options, env: { ...env, ...options?.env } }),
|
|
46
|
+
},
|
|
47
|
+
bash: {
|
|
48
|
+
value: (script, options) => registered
|
|
49
|
+
? createCommand(derived, ["bash", "-c", script], options)
|
|
50
|
+
: ctx.bash.call(derived, script, { ...options, env: { ...env, ...options?.env } }),
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
if (registered)
|
|
54
|
+
registerCommandContext(derived, binding(ctx).emit, env);
|
|
55
|
+
return derived;
|
|
56
|
+
}
|
|
57
|
+
export function withCommandEnv(ctx, env) {
|
|
58
|
+
return deriveContext(ctx, ctx.signal, { ...binding(ctx).env, ...env });
|
|
59
|
+
}
|
|
60
|
+
export function withSignal(ctx, signal) {
|
|
61
|
+
return deriveContext(ctx, signal, binding(ctx).env);
|
|
62
|
+
}
|
|
63
|
+
export function cleanupContext(ctx) {
|
|
64
|
+
return withSignal(ctx, new AbortController().signal);
|
|
65
|
+
}
|
|
66
|
+
export function createCommand(ctx, argv, options = {}) {
|
|
67
|
+
let cwd = options.cwd;
|
|
68
|
+
const env = Object.assign(Object.create(null), options.env);
|
|
69
|
+
const args = [argv[0], ...argv.slice(1)];
|
|
70
|
+
const execute = (capture) => runCommand(ctx, args, { ...(cwd === undefined ? {} : { cwd }), env, capture });
|
|
71
|
+
return {
|
|
72
|
+
dir(value) {
|
|
73
|
+
cwd = value;
|
|
74
|
+
return this;
|
|
75
|
+
},
|
|
76
|
+
env(name, value) {
|
|
77
|
+
env[name] = value;
|
|
78
|
+
return this;
|
|
79
|
+
},
|
|
80
|
+
envMap(values) {
|
|
81
|
+
Object.assign(env, values);
|
|
82
|
+
return this;
|
|
83
|
+
},
|
|
84
|
+
run() {
|
|
85
|
+
return execute(false);
|
|
86
|
+
},
|
|
87
|
+
capture() {
|
|
88
|
+
return execute(true);
|
|
89
|
+
},
|
|
90
|
+
async string() {
|
|
91
|
+
return (await execute(true)).stdout.trim();
|
|
92
|
+
},
|
|
93
|
+
async lines() {
|
|
94
|
+
return (await execute(true)).stdout
|
|
95
|
+
.split("\n")
|
|
96
|
+
.map((line) => line.trim())
|
|
97
|
+
.filter(Boolean);
|
|
98
|
+
},
|
|
99
|
+
async json() {
|
|
100
|
+
const result = await execute(true);
|
|
101
|
+
try {
|
|
102
|
+
return JSON.parse(result.stdout);
|
|
103
|
+
}
|
|
104
|
+
catch (cause) {
|
|
105
|
+
throw new Error(`parse JSON from ${result.command}`, { cause });
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
async mustBeEmpty(reason) {
|
|
109
|
+
const output = (await execute(true)).stdout.trim();
|
|
110
|
+
if (output)
|
|
111
|
+
throw new Error(`${reason}:\n${output}`);
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const protocolEnv = new Set([
|
|
116
|
+
"SPARKWING_NODE_TOKEN",
|
|
117
|
+
"SPARKWING_AGENT_TOKEN",
|
|
118
|
+
"SPARKWING_CACHE_GRANT",
|
|
119
|
+
"SPARKWING_SOURCE_TOKEN",
|
|
120
|
+
"SPARKWING_API_TOKEN",
|
|
121
|
+
"SPARKWING_LEASE_TOKEN",
|
|
122
|
+
"SPARKWING_SECRETS_KEY",
|
|
123
|
+
"SPARKWING_SECRETS_PREVIOUS_KEY",
|
|
124
|
+
"SPARKWING_RELEASE_SIGNING_KEY",
|
|
125
|
+
"SPARKWING_NODE_URL",
|
|
126
|
+
"SPARKWING_PROTOCOL_HANDLES",
|
|
127
|
+
"SPARKWING_CONTROLLER_URL",
|
|
128
|
+
]);
|
|
129
|
+
function commandEnv(ctx, options) {
|
|
130
|
+
const env = Object.create(null);
|
|
131
|
+
for (const layer of [process.env, binding(ctx).env, options.env ?? {}]) {
|
|
132
|
+
for (const [name, value] of Object.entries(layer)) {
|
|
133
|
+
const key = process.platform === "win32" ? name.toUpperCase() : name;
|
|
134
|
+
if (!protocolEnv.has(key) && !key.startsWith("SPARKWING_NODE_CLAIM_"))
|
|
135
|
+
env[key] = value;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return env;
|
|
139
|
+
}
|
|
140
|
+
export function runInput(ctx, argv, input, options = {}) {
|
|
141
|
+
return runCommand(ctx, argv, { ...options, input, capture: true });
|
|
142
|
+
}
|
|
143
|
+
export async function runCommand(ctx, argv, options = {}) {
|
|
144
|
+
assertExecution();
|
|
145
|
+
const command = argv[0] === "bash" && argv[1] === "-c" && argv.length === 3 ? argv[2] : argv.join(" ");
|
|
146
|
+
const emit = binding(ctx).emit;
|
|
147
|
+
const started = performance.now();
|
|
148
|
+
let result = { command, stdout: "", stderr: "", exitCode: exitNotStarted };
|
|
149
|
+
let terminated = "";
|
|
150
|
+
emit("exec_start", { command });
|
|
151
|
+
try {
|
|
152
|
+
if (ctx.signal.aborted)
|
|
153
|
+
throw new ExecError(result, "cancellation", ctx.signal.reason);
|
|
154
|
+
const cwd = options.cwd !== undefined && isAbsolute(options.cwd) ? options.cwd : resolve(projectRoot(), options.cwd ?? "");
|
|
155
|
+
const child = spawn(argv[0], argv.slice(1), {
|
|
156
|
+
cwd,
|
|
157
|
+
env: commandEnv(ctx, options),
|
|
158
|
+
detached: process.platform !== "win32",
|
|
159
|
+
// safety: Only these three handles are inherited; protocol handles never enter a tool.
|
|
160
|
+
stdio: [options.input === undefined ? "ignore" : "pipe", "pipe", "pipe"],
|
|
161
|
+
windowsHide: true,
|
|
162
|
+
});
|
|
163
|
+
const completion = await collectCommand(ctx, child, options, emit);
|
|
164
|
+
result = { command, stdout: completion.stdout, stderr: completion.stderr, exitCode: completion.exitCode };
|
|
165
|
+
terminated = completion.terminated;
|
|
166
|
+
if (completion.cause !== undefined || result.exitCode !== 0 || terminated)
|
|
167
|
+
throw new ExecError(result, terminated, completion.cause);
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
catch (cause) {
|
|
171
|
+
const error = cause instanceof ExecError ? cause : new ExecError(result, terminated, cause);
|
|
172
|
+
terminated = error.terminated;
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
emit("exec_end", { command, exit_code: result.exitCode, duration_ms: performance.now() - started, terminated });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function collectCommand(ctx, child, options, emit) {
|
|
180
|
+
return new Promise((resolveDone) => {
|
|
181
|
+
let cause;
|
|
182
|
+
let cancelled = false;
|
|
183
|
+
const kill = () => {
|
|
184
|
+
try {
|
|
185
|
+
terminate(child, commandEnv(ctx, {}));
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
cause ??= error;
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
const abort = () => {
|
|
192
|
+
cancelled = true;
|
|
193
|
+
kill();
|
|
194
|
+
};
|
|
195
|
+
const onError = (error) => {
|
|
196
|
+
cause ??= error;
|
|
197
|
+
kill();
|
|
198
|
+
};
|
|
199
|
+
const commandID = randomUUID();
|
|
200
|
+
const stdout = collectStream(child.stdout, "stdout", `${commandID}:stdout`, options.stdout, options.capture === true, emit, onError);
|
|
201
|
+
const stderr = collectStream(child.stderr, "stderr", `${commandID}:stderr`, options.stderr, options.capture === true, emit, onError);
|
|
202
|
+
child.on("error", (error) => {
|
|
203
|
+
cause ??= error;
|
|
204
|
+
});
|
|
205
|
+
ctx.signal.addEventListener("abort", abort, { once: true });
|
|
206
|
+
if (ctx.signal.aborted)
|
|
207
|
+
abort();
|
|
208
|
+
child.once("close", (code, signal) => {
|
|
209
|
+
ctx.signal.removeEventListener("abort", abort);
|
|
210
|
+
resolveDone({
|
|
211
|
+
stdout: stdout(),
|
|
212
|
+
stderr: stderr(),
|
|
213
|
+
exitCode: cancelled || code === null || code < 0 ? exitNotStarted : code,
|
|
214
|
+
terminated: cancelled ? "cancellation" : signal ? "signal" : "",
|
|
215
|
+
cause: cancelled ? ctx.signal.reason : (cause ?? (signal ? new Error(`process received ${signal}`) : undefined)),
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
if (child.stdin) {
|
|
219
|
+
child.stdin.on("error", onError);
|
|
220
|
+
child.stdin.end(options.input);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
function collectStream(stream, name, streamID, callback, silent, emit, onError) {
|
|
225
|
+
const chunks = [];
|
|
226
|
+
stream?.on("data", (chunk) => {
|
|
227
|
+
chunks.push(Buffer.from(chunk));
|
|
228
|
+
try {
|
|
229
|
+
callback?.(chunk);
|
|
230
|
+
if (!silent)
|
|
231
|
+
emit("exec_chunk", { stream: streamID, source: name, data: chunk.toString("base64") });
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
onError(error);
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
stream?.on("error", onError);
|
|
238
|
+
stream?.once("end", () => {
|
|
239
|
+
if (silent)
|
|
240
|
+
return;
|
|
241
|
+
try {
|
|
242
|
+
emit("exec_chunk", { stream: streamID, source: name, end: true });
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
onError(error);
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
return () => Buffer.concat(chunks).toString("utf8");
|
|
249
|
+
}
|
|
250
|
+
function terminate(child, env) {
|
|
251
|
+
if (child.pid === undefined)
|
|
252
|
+
return;
|
|
253
|
+
if (process.platform === "win32") {
|
|
254
|
+
const killer = spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], { env, stdio: "ignore", windowsHide: true });
|
|
255
|
+
killer.once("error", () => {
|
|
256
|
+
child.kill("SIGKILL");
|
|
257
|
+
});
|
|
258
|
+
killer.once("exit", (code) => {
|
|
259
|
+
if (code !== 0)
|
|
260
|
+
child.kill("SIGKILL");
|
|
261
|
+
});
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
process.kill(-child.pid, "SIGKILL");
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
if (!(error instanceof Error && "code" in error && error.code === "ESRCH"))
|
|
269
|
+
throw error;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"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"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { createCommand, registerCommandContext } from "./command.js";
|
|
2
|
+
import { SDKError, failure } from "./errors.js";
|
|
3
|
+
import { LogWriter } from "./log.js";
|
|
4
|
+
export function makeContext(options) {
|
|
5
|
+
const { run, signal, jobId } = options;
|
|
6
|
+
const log = new LogWriter(options.frames, options.stepId);
|
|
7
|
+
const services = () => {
|
|
8
|
+
signal.throwIfAborted();
|
|
9
|
+
if (!options.services)
|
|
10
|
+
throw failure("unavailable", "this process has no bound host services");
|
|
11
|
+
return options.services;
|
|
12
|
+
};
|
|
13
|
+
const read = async (name, variable) => {
|
|
14
|
+
const declaration = options.definition.secrets?.find((s) => s.name === name && Boolean(s.variable) === variable);
|
|
15
|
+
if (!declaration)
|
|
16
|
+
throw failure("forbidden", "value was not declared by this pipeline", { reason: "secret_undeclared" });
|
|
17
|
+
try {
|
|
18
|
+
return await services().secret(name, signal);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (declaration.optional && error instanceof SDKError && error.code === "not_found")
|
|
22
|
+
return undefined;
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const ctx = {
|
|
27
|
+
run,
|
|
28
|
+
jobId,
|
|
29
|
+
args: options.args,
|
|
30
|
+
dryRun: run.dryRun,
|
|
31
|
+
runner: run.runner,
|
|
32
|
+
signal,
|
|
33
|
+
log,
|
|
34
|
+
...(options.stepId === undefined ? {} : { stepId: options.stepId }),
|
|
35
|
+
...(options.failure === undefined ? {} : { failure: options.failure }),
|
|
36
|
+
secret: (name) => read(name, false),
|
|
37
|
+
variable: (name) => read(name, true),
|
|
38
|
+
output: (job) => services().output(typeof job === "string" ? job : job.id, signal),
|
|
39
|
+
stepOutput: (step) => options.outputs.get(typeof step === "string" ? step : step.id),
|
|
40
|
+
annotate: async (annotation) => {
|
|
41
|
+
checkAnnotation(annotation);
|
|
42
|
+
await services().annotate(annotation, signal, options.stepId);
|
|
43
|
+
},
|
|
44
|
+
summary: async (markdown) => {
|
|
45
|
+
if (typeof markdown !== "string")
|
|
46
|
+
throw failure("bad_request", "summary markdown must be a string");
|
|
47
|
+
await services().summary(markdown, signal, options.stepId);
|
|
48
|
+
},
|
|
49
|
+
mask: (value) => services().mask(value, signal),
|
|
50
|
+
oidcToken: (audience) => services().oidcToken(audience, signal),
|
|
51
|
+
runPipeline: (pipeline, job, child = {}) => services().runPipeline(pipeline, job, child, signal),
|
|
52
|
+
latest: (ref) => services().latest(ref, signal),
|
|
53
|
+
cleanup: (spec) => services().cleanup(spec, signal),
|
|
54
|
+
exec: (argv, opts) => createCommand(ctx, argv, opts),
|
|
55
|
+
bash: (script, opts) => createCommand(ctx, ["bash", "-c", script], opts),
|
|
56
|
+
};
|
|
57
|
+
registerCommandContext(ctx, (event, attrs) => log.event(event, attrs), options.bodyEnv);
|
|
58
|
+
return ctx;
|
|
59
|
+
}
|
|
60
|
+
function checkAnnotation(annotation) {
|
|
61
|
+
if (typeof annotation.message !== "string")
|
|
62
|
+
throw failure("bad_request", "annotation message must be a string");
|
|
63
|
+
if (annotation.level !== undefined && typeof annotation.level !== "string")
|
|
64
|
+
throw failure("bad_request", "annotation level must be a string");
|
|
65
|
+
for (const value of [annotation.line, annotation.endLine, annotation.column])
|
|
66
|
+
if (value !== undefined && !Number.isSafeInteger(value))
|
|
67
|
+
throw failure("bad_request", "annotation location must be an integer");
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/describe.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Plan, pipelines } from "./plan.js";
|
|
2
|
+
import { SDKError, errorFields } from "./errors.js";
|
|
3
|
+
export function argument(spec, jobID) {
|
|
4
|
+
const arg = { name: spec.name, type: spec.type, required: spec.required ?? false };
|
|
5
|
+
if (spec.short !== undefined)
|
|
6
|
+
arg.short = spec.short;
|
|
7
|
+
if (spec.description !== undefined)
|
|
8
|
+
arg.desc = spec.description;
|
|
9
|
+
if (spec.default !== undefined && spec.default !== "")
|
|
10
|
+
arg.default = spec.default;
|
|
11
|
+
if (spec.enum !== undefined)
|
|
12
|
+
arg.enum = [...spec.enum];
|
|
13
|
+
if (spec.secret !== undefined)
|
|
14
|
+
arg.secret = spec.secret;
|
|
15
|
+
if (jobID !== undefined)
|
|
16
|
+
arg.job_id = jobID;
|
|
17
|
+
return arg;
|
|
18
|
+
}
|
|
19
|
+
export async function describe(run) {
|
|
20
|
+
const descriptions = [];
|
|
21
|
+
const definitions = pipelines();
|
|
22
|
+
for (const definition of definitions) {
|
|
23
|
+
const plan = new Plan();
|
|
24
|
+
try {
|
|
25
|
+
const entry = { name: definition.name, args: (definition.args ?? []).map((spec) => argument(spec)) };
|
|
26
|
+
if (definition.short !== undefined)
|
|
27
|
+
entry.short = definition.short;
|
|
28
|
+
const help = definition.help ?? definition.description;
|
|
29
|
+
if (help !== undefined)
|
|
30
|
+
entry.help = help;
|
|
31
|
+
if (definition.extra !== undefined)
|
|
32
|
+
entry.extra = definition.extra;
|
|
33
|
+
if (definition.examples)
|
|
34
|
+
entry.examples = definition.examples.map((example) => ({ command: example.command, comment: example.comment ?? "" }));
|
|
35
|
+
if (definition.envVars)
|
|
36
|
+
entry.env_vars = definition.envVars.map((env) => ({ ...env }));
|
|
37
|
+
if (definition.secrets)
|
|
38
|
+
entry.secrets = definition.secrets.map((secret) => ({
|
|
39
|
+
name: secret.name,
|
|
40
|
+
...(secret.optional === undefined ? {} : { optional: secret.optional }),
|
|
41
|
+
}));
|
|
42
|
+
const args = {};
|
|
43
|
+
await definition.plan(plan, { ...run, pipeline: definition.name, args });
|
|
44
|
+
const risks = new Set();
|
|
45
|
+
const byStep = [];
|
|
46
|
+
for (const job of plan.jobs()) {
|
|
47
|
+
entry.args.push(...job.argSpecs().map((spec) => argument(spec, job.id)));
|
|
48
|
+
for (const step of job.steps()) {
|
|
49
|
+
const labels = step.toSpec().risks ?? [];
|
|
50
|
+
if (labels.length)
|
|
51
|
+
byStep.push({ job_id: job.id, step_id: step.id, labels });
|
|
52
|
+
for (const label of labels)
|
|
53
|
+
risks.add(label);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (risks.size)
|
|
57
|
+
entry.risks = [...risks].sort();
|
|
58
|
+
if (byStep.length)
|
|
59
|
+
entry.risks_by_step = byStep;
|
|
60
|
+
plan.seal();
|
|
61
|
+
descriptions.push(entry);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
65
|
+
descriptions.push({ name: definition.name, args: [], error: errorFields(new SDKError(`describe pipeline ${JSON.stringify(definition.name)}: ${message}`, { code: "plan_failed" })) });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { pipelines: descriptions };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=describe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../src/describe.ts"],"names":[],"mappings":"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"}
|