redkite 0.1.6
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/LICENSE +21 -0
- package/README.md +819 -0
- package/bin/redkite.mjs +12 -0
- package/dist/build.d.ts +27 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +132 -0
- package/dist/build.js.map +1 -0
- package/dist/checks.d.ts +4 -0
- package/dist/checks.d.ts.map +1 -0
- package/dist/checks.js +49 -0
- package/dist/checks.js.map +1 -0
- package/dist/cli/agent.d.ts +2 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +24 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/config.d.ts +5 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +217 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +11 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +438 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/log.d.ts +9 -0
- package/dist/cli/log.d.ts.map +1 -0
- package/dist/cli/log.js +128 -0
- package/dist/cli/log.js.map +1 -0
- package/dist/cli/screen.d.ts +34 -0
- package/dist/cli/screen.d.ts.map +1 -0
- package/dist/cli/screen.js +298 -0
- package/dist/cli/screen.js.map +1 -0
- package/dist/cli/viewer.d.ts +9 -0
- package/dist/cli/viewer.d.ts.map +1 -0
- package/dist/cli/viewer.js +139 -0
- package/dist/cli/viewer.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -0
- package/dist/deploy.d.ts +19 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +275 -0
- package/dist/deploy.js.map +1 -0
- package/dist/docker.d.ts +96 -0
- package/dist/docker.d.ts.map +1 -0
- package/dist/docker.js +325 -0
- package/dist/docker.js.map +1 -0
- package/dist/dockerfile.d.ts +14 -0
- package/dist/dockerfile.d.ts.map +1 -0
- package/dist/dockerfile.js +160 -0
- package/dist/dockerfile.js.map +1 -0
- package/dist/health.d.ts +13 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +54 -0
- package/dist/health.js.map +1 -0
- package/dist/host.d.ts +21 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +27 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.d.ts +5 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +45 -0
- package/dist/layout.js.map +1 -0
- package/dist/localHost.d.ts +7 -0
- package/dist/localHost.d.ts.map +1 -0
- package/dist/localHost.js +32 -0
- package/dist/localHost.js.map +1 -0
- package/dist/log.d.ts +14 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +15 -0
- package/dist/log.js.map +1 -0
- package/dist/nginx.d.ts +4 -0
- package/dist/nginx.d.ts.map +1 -0
- package/dist/nginx.js +53 -0
- package/dist/nginx.js.map +1 -0
- package/dist/pipeline.d.ts +103 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +142 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/presets/index.d.ts +3 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +3 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/nextApp.d.ts +15 -0
- package/dist/presets/nextApp.d.ts.map +1 -0
- package/dist/presets/nextApp.js +53 -0
- package/dist/presets/nextApp.js.map +1 -0
- package/dist/presets/nodeApp.d.ts +19 -0
- package/dist/presets/nodeApp.d.ts.map +1 -0
- package/dist/presets/nodeApp.js +29 -0
- package/dist/presets/nodeApp.js.map +1 -0
- package/dist/secrets/bitwarden.d.ts +3 -0
- package/dist/secrets/bitwarden.d.ts.map +1 -0
- package/dist/secrets/bitwarden.js +6 -0
- package/dist/secrets/bitwarden.js.map +1 -0
- package/dist/secrets/refs.d.ts +9 -0
- package/dist/secrets/refs.d.ts.map +1 -0
- package/dist/secrets/refs.js +20 -0
- package/dist/secrets/refs.js.map +1 -0
- package/dist/secrets/store.d.ts +9 -0
- package/dist/secrets/store.d.ts.map +1 -0
- package/dist/secrets/store.js +104 -0
- package/dist/secrets/store.js.map +1 -0
- package/dist/services/ensure.d.ts +18 -0
- package/dist/services/ensure.d.ts.map +1 -0
- package/dist/services/ensure.js +93 -0
- package/dist/services/ensure.js.map +1 -0
- package/dist/services/index.d.ts +19 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +27 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/planned.d.ts +20 -0
- package/dist/services/planned.d.ts.map +1 -0
- package/dist/services/planned.js +77 -0
- package/dist/services/planned.js.map +1 -0
- package/dist/shell.d.ts +11 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +65 -0
- package/dist/shell.js.map +1 -0
- package/dist/source.d.ts +16 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +108 -0
- package/dist/source.js.map +1 -0
- package/dist/sshHost.d.ts +15 -0
- package/dist/sshHost.d.ts.map +1 -0
- package/dist/sshHost.js +91 -0
- package/dist/sshHost.js.map +1 -0
- package/dist/steps.d.ts +27 -0
- package/dist/steps.d.ts.map +1 -0
- package/dist/steps.js +69 -0
- package/dist/steps.js.map +1 -0
- package/dist/topology.d.ts +40 -0
- package/dist/topology.d.ts.map +1 -0
- package/dist/topology.js +113 -0
- package/dist/topology.js.map +1 -0
- package/dist/types.d.ts +100 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +64 -0
- package/src/build.ts +236 -0
- package/src/checks.ts +65 -0
- package/src/cli/agent.ts +28 -0
- package/src/cli/config.ts +275 -0
- package/src/cli/index.ts +559 -0
- package/src/cli/log.ts +168 -0
- package/src/cli/screen.ts +409 -0
- package/src/cli/viewer.ts +192 -0
- package/src/config.ts +90 -0
- package/src/deploy.ts +409 -0
- package/src/docker.ts +433 -0
- package/src/dockerfile.ts +228 -0
- package/src/health.ts +83 -0
- package/src/host.ts +54 -0
- package/src/index.ts +25 -0
- package/src/layout.ts +41 -0
- package/src/localHost.ts +50 -0
- package/src/log.ts +38 -0
- package/src/nginx.ts +63 -0
- package/src/pipeline.ts +335 -0
- package/src/presets/index.ts +2 -0
- package/src/presets/nextApp.ts +70 -0
- package/src/presets/nodeApp.ts +46 -0
- package/src/secrets/bitwarden.ts +7 -0
- package/src/secrets/refs.ts +32 -0
- package/src/secrets/store.ts +147 -0
- package/src/services/ensure.ts +160 -0
- package/src/services/index.ts +48 -0
- package/src/services/planned.ts +119 -0
- package/src/shell.ts +95 -0
- package/src/source.ts +171 -0
- package/src/sshHost.ts +145 -0
- package/src/steps.ts +101 -0
- package/src/topology.ts +199 -0
- package/src/types.ts +243 -0
package/dist/deploy.js
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { build } from "./build.js";
|
|
2
|
+
import { assertCheckable, runChecks } from "./checks.js";
|
|
3
|
+
import { environmentOf } from "./config.js";
|
|
4
|
+
import { Docker } from "./docker.js";
|
|
5
|
+
import { healthcheck } from "./health.js";
|
|
6
|
+
import { localHost } from "./localHost.js";
|
|
7
|
+
import { silent } from "./log.js";
|
|
8
|
+
import { defineStep, merge, runPipeline, } from "./pipeline.js";
|
|
9
|
+
import { readEnv, readRef } from "./secrets/refs.js";
|
|
10
|
+
import { ensureService } from "./services/ensure.js";
|
|
11
|
+
import { plannedServices } from "./services/planned.js";
|
|
12
|
+
import { topologyFor } from "./topology.js";
|
|
13
|
+
export async function deploy(options) {
|
|
14
|
+
return await start("deploy", options);
|
|
15
|
+
}
|
|
16
|
+
// The same host, the same services and the same images, stopping where a deploy
|
|
17
|
+
// would start moving addresses. What runs instead is what each app declares
|
|
18
|
+
export async function verify(options) {
|
|
19
|
+
return await start("verify", options);
|
|
20
|
+
}
|
|
21
|
+
async function start(run, options) {
|
|
22
|
+
const log = options.log ?? silent;
|
|
23
|
+
const setting = {
|
|
24
|
+
config: options.config,
|
|
25
|
+
environment: options.environment,
|
|
26
|
+
topology: topologyFor(options.config, options.environment),
|
|
27
|
+
host: options.host,
|
|
28
|
+
docker: new Docker(options.host),
|
|
29
|
+
secrets: options.secrets,
|
|
30
|
+
log,
|
|
31
|
+
run,
|
|
32
|
+
};
|
|
33
|
+
const steps = merge(supplied(options), options.config.steps ?? []);
|
|
34
|
+
return await runPipeline(run, steps, setting, options.signal);
|
|
35
|
+
}
|
|
36
|
+
// Every step redkite supplies, in the order the phases name. A run walks the
|
|
37
|
+
// phases it has, so the ones it does not are never ordered in
|
|
38
|
+
function supplied(options) {
|
|
39
|
+
return [
|
|
40
|
+
defineStep("setup", prepare),
|
|
41
|
+
defineStep("build", (input, context) => compile(input, context, options.verbose ?? false, options.signal)),
|
|
42
|
+
defineStep("verify", runChecks, assertCheckable),
|
|
43
|
+
defineStep("swap", (input, context) => release(input, context, options.health ?? { sleep: wait }), assertPublishable),
|
|
44
|
+
defineStep("cleanup", finish),
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
48
|
+
// A deploy publishes the proxy on a port, and an environment written for verify
|
|
49
|
+
// alone has no reason to name one. Checked before the run so the mistake lands
|
|
50
|
+
// before a build rather than on a proxy nobody outside can reach
|
|
51
|
+
function assertPublishable(plan) {
|
|
52
|
+
if (environmentOf(plan.config, plan.environment)?.publicPort)
|
|
53
|
+
return;
|
|
54
|
+
throw new Error(`${plan.environment} names no publicPort, so a deploy has nothing to publish ` +
|
|
55
|
+
"the proxy on. Only a verify run goes without one");
|
|
56
|
+
}
|
|
57
|
+
// The network and the services, which outlive a run and are only built when
|
|
58
|
+
// they are missing. This used to overlap the builds, and now costs the round
|
|
59
|
+
// trips it takes rather than nothing, which is what buys a setup step a host
|
|
60
|
+
// it can rely on
|
|
61
|
+
async function prepare(input, context) {
|
|
62
|
+
const { docker, topology } = context;
|
|
63
|
+
await docker.network.create(topology.network, topology.cidr);
|
|
64
|
+
const services = await ensureServices(context);
|
|
65
|
+
return { ...input, network: topology.network, services };
|
|
66
|
+
}
|
|
67
|
+
// Every image is built before anything is disturbed. A build failure has to
|
|
68
|
+
// leave the running deployment exactly as it was, which is why this is a step
|
|
69
|
+
// of its own rather than the first half of the swap
|
|
70
|
+
async function compile(input, context, verbose, signal) {
|
|
71
|
+
// One checkout directory for every app, opened here so the build step owns
|
|
72
|
+
// its lifetime rather than the process
|
|
73
|
+
const here = buildsHere(context) ? await localHost({ signal }) : undefined;
|
|
74
|
+
try {
|
|
75
|
+
return { ...input, apps: (await buildAll(context, verbose, here)).map(describe) };
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
await here?.close?.();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Building here and deploying here are the same daemon, so shipping would be a
|
|
82
|
+
// save and a load of an image that never moved. An app built from a path on
|
|
83
|
+
// this machine has no say in it: the source is here, so the build is too
|
|
84
|
+
function buildsHere(context) {
|
|
85
|
+
const environment = environmentOf(context.config, context.environment);
|
|
86
|
+
if (!environment?.host?.bastion)
|
|
87
|
+
return false;
|
|
88
|
+
return environment.buildOn === "local" || context.config.apps.some((app) => app.path);
|
|
89
|
+
}
|
|
90
|
+
async function release(input, context, health) {
|
|
91
|
+
const { docker, task, topology } = context;
|
|
92
|
+
const apps = context.config.apps.map((app) => appOf(topology, app.name));
|
|
93
|
+
// Keyed by name rather than by index: appOf resolves the topology, and two
|
|
94
|
+
// lists walked in step is a bug waiting for someone to reorder one
|
|
95
|
+
const environments = new Map(context.config.apps.map((app) => [app.name, app.environment ?? {}]));
|
|
96
|
+
task.detail("retiring the running containers");
|
|
97
|
+
await Promise.all(apps.map((app) => retire(docker, topology, app)));
|
|
98
|
+
task.detail("creating the new ones");
|
|
99
|
+
await Promise.all(apps.map((app) => create(docker, topology, app, environments.get(app.name))));
|
|
100
|
+
task.detail("starting them");
|
|
101
|
+
await Promise.all(apps.map((app) => docker.container.start(app.container)));
|
|
102
|
+
// One unhealthy app reverts all of them. A half-swapped deployment is the
|
|
103
|
+
// one state nothing downstream knows how to reason about
|
|
104
|
+
if (!(await checkAll(context, health))) {
|
|
105
|
+
context.log.fail("Health checks failed, reverting");
|
|
106
|
+
await Promise.all(apps.map((app) => revert(docker, topology, app)));
|
|
107
|
+
return {
|
|
108
|
+
...input,
|
|
109
|
+
ok: false,
|
|
110
|
+
released: [],
|
|
111
|
+
reverted: apps.map((app) => app.container),
|
|
112
|
+
checked: [],
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
...input,
|
|
117
|
+
ok: true,
|
|
118
|
+
released: apps.map((app) => app.container),
|
|
119
|
+
reverted: [],
|
|
120
|
+
checked: [],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
// A build leaves its image on the host rather than sending one, so without this
|
|
124
|
+
// every run adds a runtime image and a builder to a disk nobody is watching
|
|
125
|
+
async function finish(input, context) {
|
|
126
|
+
// What would be removed is what is serving, and the images are what a retry
|
|
127
|
+
// would be built from
|
|
128
|
+
if (!input.ok)
|
|
129
|
+
return { ...input, removed: [], reclaimed: [] };
|
|
130
|
+
const { docker, topology } = context;
|
|
131
|
+
const apps = context.config.apps.map((app) => appOf(topology, app.name));
|
|
132
|
+
const removed = await Promise.all(apps.map((app) => cleanup(docker, app)));
|
|
133
|
+
const reclaimed = await Promise.all(input.apps.map((app) => reclaim(docker, app)));
|
|
134
|
+
return { ...input, removed: removed.flat(), reclaimed: reclaimed.flat() };
|
|
135
|
+
}
|
|
136
|
+
function describe({ app, result }) {
|
|
137
|
+
return {
|
|
138
|
+
name: app.name,
|
|
139
|
+
container: result.tag.split(":")[0] ?? app.name,
|
|
140
|
+
release: result.release,
|
|
141
|
+
fingerprint: result.fingerprint,
|
|
142
|
+
cached: result.cached,
|
|
143
|
+
builderTag: result.builderTag,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
async function checkAll(context, health) {
|
|
147
|
+
const { docker, log, topology } = context;
|
|
148
|
+
const results = await Promise.all(context.config.apps.map(async (app) => {
|
|
149
|
+
const target = appOf(topology, app.name);
|
|
150
|
+
const deps = {
|
|
151
|
+
...health,
|
|
152
|
+
probe: async (container, url) => {
|
|
153
|
+
const result = await docker.run(`exec ${container} curl -s ${url}`);
|
|
154
|
+
return { code: result.code, output: result.stdout };
|
|
155
|
+
},
|
|
156
|
+
log,
|
|
157
|
+
};
|
|
158
|
+
return await healthcheck(target.container, target.port, app.health, deps);
|
|
159
|
+
}));
|
|
160
|
+
return !results.includes(false);
|
|
161
|
+
}
|
|
162
|
+
// The proxy is one of these, derived rather than listed. What each should be
|
|
163
|
+
// is worked out in one place, so a plan reports drift against the same shape a
|
|
164
|
+
// deploy converges to
|
|
165
|
+
async function ensureServices(context) {
|
|
166
|
+
const planned = plannedServices(context.config, context.topology, context.run);
|
|
167
|
+
return await Promise.all(planned.map(async (item) => {
|
|
168
|
+
await ensureService(item.spec, item.service, {
|
|
169
|
+
...context,
|
|
170
|
+
files: item.files,
|
|
171
|
+
publish: item.publish,
|
|
172
|
+
});
|
|
173
|
+
return item.service.container;
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
async function buildAll(context, verbose, here) {
|
|
177
|
+
const { config, log, topology } = context;
|
|
178
|
+
const environment = environmentOf(config, context.environment);
|
|
179
|
+
if (!environment)
|
|
180
|
+
throw new Error(`Unknown environment ${context.environment}`);
|
|
181
|
+
return await Promise.all(config.apps.map(async (app) => {
|
|
182
|
+
const task = log.step(`Building ${app.name}`);
|
|
183
|
+
try {
|
|
184
|
+
const buildContext = {
|
|
185
|
+
host: here ?? context.host,
|
|
186
|
+
docker: here ? new Docker(here) : context.docker,
|
|
187
|
+
deliver: here && { host: context.host, docker: context.docker },
|
|
188
|
+
env: await readEnv(app.secrets, context.secrets),
|
|
189
|
+
files: await resolveFiles(app, context.secrets),
|
|
190
|
+
branch: environment.branch,
|
|
191
|
+
environment: context.environment,
|
|
192
|
+
detail: task.detail,
|
|
193
|
+
output: task.line,
|
|
194
|
+
};
|
|
195
|
+
const result = await build(app, appOf(topology, app.name), buildContext);
|
|
196
|
+
task.done(`${result.release.slice(0, 7)}${result.cached ? " (held)" : ""}`);
|
|
197
|
+
return { app, result };
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
task.fail(`${app.name} failed to build`);
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
async function resolveFiles(app, stores) {
|
|
206
|
+
const entries = await Promise.all(Object.entries(app.files ?? {}).map(async ([path, ref]) => [path, await readRef(ref, stores)]));
|
|
207
|
+
return Object.fromEntries(entries);
|
|
208
|
+
}
|
|
209
|
+
// Move the running container out of the way without stopping it, so it keeps
|
|
210
|
+
// answering on the retired address while the new one starts
|
|
211
|
+
async function retire(docker, topology, app) {
|
|
212
|
+
await docker.container.stop(app.retired);
|
|
213
|
+
await docker.container.remove(app.retired);
|
|
214
|
+
await docker.network.reconnect(topology.network, app.container, app.retiredAddress);
|
|
215
|
+
await docker.container.rename(app.container, app.retired);
|
|
216
|
+
}
|
|
217
|
+
async function create(docker, topology, app, environment = {}) {
|
|
218
|
+
const builder = docker.container
|
|
219
|
+
.builder()
|
|
220
|
+
.name(app.container)
|
|
221
|
+
.image(app.container)
|
|
222
|
+
.network(topology.network)
|
|
223
|
+
.ip(app.currentAddress)
|
|
224
|
+
.restart("unless-stopped");
|
|
225
|
+
for (const [host, ip] of Object.entries(topology.extraHosts)) {
|
|
226
|
+
// An app resolving its own name to the live address would loop
|
|
227
|
+
if (host === app.container || host === app.retired)
|
|
228
|
+
continue;
|
|
229
|
+
builder.extraHost(host, ip);
|
|
230
|
+
}
|
|
231
|
+
for (const volume of app.volumes)
|
|
232
|
+
builder.volume(volume.volume, volume.mountPath);
|
|
233
|
+
for (const [name, value] of Object.entries(environment))
|
|
234
|
+
builder.env(name, value);
|
|
235
|
+
await builder.create();
|
|
236
|
+
}
|
|
237
|
+
// Put the retired container back on the live address and its original name
|
|
238
|
+
async function revert(docker, topology, app) {
|
|
239
|
+
await docker.container.stop(app.container);
|
|
240
|
+
await docker.container.rename(app.container, app.failed);
|
|
241
|
+
await docker.network.reconnect(topology.network, app.retired, app.currentAddress);
|
|
242
|
+
await docker.container.rename(app.retired, app.container);
|
|
243
|
+
await docker.container.start(app.container);
|
|
244
|
+
}
|
|
245
|
+
async function cleanup(docker, app) {
|
|
246
|
+
const removed = [];
|
|
247
|
+
for (const name of [app.retired, app.failed]) {
|
|
248
|
+
await docker.container.stop(name);
|
|
249
|
+
if (await docker.container.remove(name))
|
|
250
|
+
removed.push(name);
|
|
251
|
+
}
|
|
252
|
+
return removed;
|
|
253
|
+
}
|
|
254
|
+
// Every version of this app's images except the one that was just released,
|
|
255
|
+
// including the builder a step before the swap ran in
|
|
256
|
+
async function reclaim(docker, app) {
|
|
257
|
+
const version = `${app.release}-${app.fingerprint}`;
|
|
258
|
+
const reclaimed = [];
|
|
259
|
+
for (const repository of [app.container, `${app.container}-builder`]) {
|
|
260
|
+
for (const held of await docker.image.versionsOf(repository)) {
|
|
261
|
+
if (held === `${repository}:${version}`)
|
|
262
|
+
continue;
|
|
263
|
+
await docker.image.remove(held);
|
|
264
|
+
reclaimed.push(held);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return reclaimed;
|
|
268
|
+
}
|
|
269
|
+
function appOf(topology, name) {
|
|
270
|
+
const app = topology.apps.find((item) => item.name === name);
|
|
271
|
+
if (app)
|
|
272
|
+
return app;
|
|
273
|
+
throw new Error(`No topology for app ${name}`);
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
|
package/dist/docker.d.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { Host, OnLine } from "./host.js";
|
|
2
|
+
export type BuildInvocation = {
|
|
3
|
+
context: string;
|
|
4
|
+
dockerfile: string;
|
|
5
|
+
tags: string[];
|
|
6
|
+
secrets?: Record<string, string>;
|
|
7
|
+
target?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const SPEC_LABEL = "redkite.spec";
|
|
10
|
+
type ContainerState = {
|
|
11
|
+
state: string;
|
|
12
|
+
spec?: string;
|
|
13
|
+
};
|
|
14
|
+
type HostState = {
|
|
15
|
+
containers: Map<string, ContainerState>;
|
|
16
|
+
images: Set<string>;
|
|
17
|
+
networks: Set<string>;
|
|
18
|
+
};
|
|
19
|
+
export declare class Docker {
|
|
20
|
+
private readonly host;
|
|
21
|
+
readonly network: DockerNetwork;
|
|
22
|
+
readonly image: DockerImage;
|
|
23
|
+
readonly container: DockerContainer;
|
|
24
|
+
private state?;
|
|
25
|
+
constructor(host: Host);
|
|
26
|
+
snapshot(): Promise<HostState>;
|
|
27
|
+
private read;
|
|
28
|
+
run(command: string, onLine?: OnLine): Promise<import("./host.js").Result>;
|
|
29
|
+
track(change: (state: HostState) => void): Promise<void>;
|
|
30
|
+
runOrThrow(command: string, message: string, onLine?: OnLine): Promise<import("./host.js").Result>;
|
|
31
|
+
}
|
|
32
|
+
declare class DockerNetwork {
|
|
33
|
+
private readonly docker;
|
|
34
|
+
constructor(docker: Docker);
|
|
35
|
+
exists(name: string): Promise<boolean>;
|
|
36
|
+
create(name: string, subnet?: string): Promise<boolean>;
|
|
37
|
+
remove(name: string): Promise<boolean>;
|
|
38
|
+
reconnect(network: string, container: string, ip: string): Promise<boolean>;
|
|
39
|
+
}
|
|
40
|
+
declare class DockerImage {
|
|
41
|
+
private readonly docker;
|
|
42
|
+
constructor(docker: Docker);
|
|
43
|
+
exists(name: string): Promise<boolean>;
|
|
44
|
+
versionsOf(repository: string): Promise<string[]>;
|
|
45
|
+
build(spec: BuildInvocation, onLine?: OnLine): Promise<boolean>;
|
|
46
|
+
retag(from: string, to: string): Promise<boolean>;
|
|
47
|
+
remove(name: string): Promise<boolean>;
|
|
48
|
+
}
|
|
49
|
+
declare class DockerContainer {
|
|
50
|
+
private readonly docker;
|
|
51
|
+
constructor(docker: Docker);
|
|
52
|
+
exists(name: string): Promise<boolean>;
|
|
53
|
+
status(name: string): Promise<string>;
|
|
54
|
+
specOf(name: string): Promise<string | undefined>;
|
|
55
|
+
isRunning(name: string): Promise<boolean>;
|
|
56
|
+
start(name: string): Promise<boolean>;
|
|
57
|
+
stop(name: string): Promise<boolean>;
|
|
58
|
+
rename(from: string, to: string): Promise<boolean>;
|
|
59
|
+
remove(name: string): Promise<boolean>;
|
|
60
|
+
create(builder: DockerBuilder): Promise<boolean>;
|
|
61
|
+
builder(): DockerBuilder;
|
|
62
|
+
}
|
|
63
|
+
export declare class DockerBuilder {
|
|
64
|
+
private readonly container;
|
|
65
|
+
private _name;
|
|
66
|
+
private _image;
|
|
67
|
+
private _hostname?;
|
|
68
|
+
private _ip?;
|
|
69
|
+
private _restart?;
|
|
70
|
+
private readonly _networks;
|
|
71
|
+
private readonly _volumes;
|
|
72
|
+
private readonly _hosts;
|
|
73
|
+
private readonly _ports;
|
|
74
|
+
private readonly _env;
|
|
75
|
+
private readonly _labels;
|
|
76
|
+
private _envFile?;
|
|
77
|
+
constructor(container: DockerContainer);
|
|
78
|
+
name(value: string): this;
|
|
79
|
+
image(value: string): this;
|
|
80
|
+
hostname(value: string): this;
|
|
81
|
+
network(value: string): this;
|
|
82
|
+
volume(from: string, to: string): this;
|
|
83
|
+
extraHost(name: string, ip: string): this;
|
|
84
|
+
restart(value: string): this;
|
|
85
|
+
ip(value: string): this;
|
|
86
|
+
env(name: string, value: string): this;
|
|
87
|
+
envFile(path: string): this;
|
|
88
|
+
label(name: string, value: string): this;
|
|
89
|
+
labelled(name: string): string | undefined;
|
|
90
|
+
port(from: number, to: number): this;
|
|
91
|
+
named(): string;
|
|
92
|
+
parse(): string;
|
|
93
|
+
create(): Promise<boolean>;
|
|
94
|
+
}
|
|
95
|
+
export {};
|
|
96
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"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"}
|