build-strap 3.0.0-dev.42 → 4.0.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/LICENSE +1 -1
- package/README.md +3 -34
- package/dist/src/ant.d.ts +19 -0
- package/dist/src/ant.js +18 -0
- package/dist/src/cert.d.ts +12 -0
- package/dist/src/cert.js +91 -0
- package/dist/src/clean.d.ts +4 -0
- package/dist/src/clean.js +11 -0
- package/dist/src/copy.d.ts +7 -0
- package/dist/src/copy.js +53 -0
- package/dist/src/cp.d.ts +17 -0
- package/dist/src/cp.js +88 -0
- package/dist/src/docker.container.d.ts +73 -0
- package/dist/src/docker.container.js +247 -0
- package/dist/src/docker.d.ts +68 -0
- package/dist/src/docker.js +188 -0
- package/dist/src/docker.network.d.ts +42 -0
- package/dist/src/docker.network.js +85 -0
- package/dist/src/docker.volume.d.ts +26 -0
- package/dist/src/docker.volume.js +62 -0
- package/dist/src/dockerCleanup.d.ts +38 -0
- package/dist/src/dockerCleanup.js +77 -0
- package/dist/src/dockerCompose.d.ts +154 -0
- package/dist/src/dockerCompose.js +439 -0
- package/dist/src/fs.d.ts +5 -0
- package/dist/src/fs.js +38 -0
- package/dist/src/git.d.ts +9 -0
- package/dist/src/git.js +24 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/index.js +20 -0
- package/dist/src/maps.d.ts +33 -0
- package/dist/src/maps.js +41 -0
- package/dist/src/npm.d.ts +35 -0
- package/dist/src/npm.js +104 -0
- package/dist/src/pkg.d.ts +33 -0
- package/dist/src/pkg.js +33 -0
- package/dist/src/publish.d.ts +27 -0
- package/dist/src/publish.js +57 -0
- package/dist/src/run.d.ts +13 -0
- package/dist/src/run.js +44 -0
- package/dist/src/tgz.d.ts +13 -0
- package/dist/src/tgz.js +67 -0
- package/dist/src/version.d.ts +34 -0
- package/dist/src/version.js +101 -0
- package/dist/src/yarn.d.ts +26 -0
- package/dist/src/yarn.js +75 -0
- package/package.json +74 -20
- package/ant.js +0 -43
- package/ant.js.flow +0 -42
- package/artifactory.js +0 -617
- package/artifactory.js.flow +0 -616
- package/cert.conf +0 -20
- package/cert.js +0 -153
- package/cert.js.flow +0 -152
- package/clean.js +0 -20
- package/clean.js.flow +0 -19
- package/copy.js +0 -80
- package/copy.js.flow +0 -79
- package/cp.js +0 -173
- package/cp.js.flow +0 -172
- package/docker.container.js +0 -390
- package/docker.container.js.flow +0 -389
- package/docker.js +0 -368
- package/docker.js.flow +0 -367
- package/docker.network.js +0 -160
- package/docker.network.js.flow +0 -159
- package/docker.volume.js +0 -136
- package/docker.volume.js.flow +0 -136
- package/dockerCleanup.js +0 -152
- package/dockerCleanup.js.flow +0 -151
- package/dockerCompose.js +0 -766
- package/dockerCompose.js.flow +0 -765
- package/flow.js +0 -21
- package/flow.js.flow +0 -20
- package/fs.js +0 -95
- package/fs.js.flow +0 -96
- package/git.js +0 -35
- package/git.js.flow +0 -34
- package/hg.js +0 -35
- package/hg.js.flow +0 -34
- package/index.js +0 -27
- package/index.js.flow +0 -26
- package/inline-resources.js +0 -158
- package/inline-resources.js.flow +0 -157
- package/maps.js +0 -112
- package/maps.js.flow +0 -111
- package/npm.js +0 -145
- package/npm.js.flow +0 -144
- package/pkg.js +0 -81
- package/pkg.js.flow +0 -80
- package/publish.js +0 -145
- package/publish.js.flow +0 -144
- package/run.js +0 -90
- package/run.js.flow +0 -89
- package/src/ant.js +0 -42
- package/src/artifactory.js +0 -616
- package/src/cert.conf +0 -20
- package/src/cert.js +0 -152
- package/src/clean.js +0 -19
- package/src/copy.js +0 -79
- package/src/cp.js +0 -172
- package/src/docker.container.js +0 -389
- package/src/docker.js +0 -367
- package/src/docker.network.js +0 -159
- package/src/docker.volume.js +0 -136
- package/src/dockerCleanup.js +0 -151
- package/src/dockerCompose.js +0 -765
- package/src/flow.js +0 -20
- package/src/fs.js +0 -96
- package/src/git.js +0 -34
- package/src/hg.js +0 -34
- package/src/index.js +0 -26
- package/src/inline-resources.js +0 -157
- package/src/maps.js +0 -111
- package/src/npm.js +0 -144
- package/src/pkg.js +0 -80
- package/src/publish.js +0 -144
- package/src/run.js +0 -89
- package/src/test.js +0 -55
- package/src/tgz.js +0 -101
- package/src/version.js +0 -141
- package/src/yarn.js +0 -123
- package/test.js +0 -56
- package/test.js.flow +0 -55
- package/tgz.js +0 -102
- package/tgz.js.flow +0 -101
- package/version.js +0 -142
- package/version.js.flow +0 -141
- package/yarn.js +0 -124
- package/yarn.js.flow +0 -123
package/src/docker.container.js
DELETED
|
@@ -1,389 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
import bytes from 'bytes';
|
|
3
|
-
import throttle from 'lodash/throttle';
|
|
4
|
-
import { buildLog } from './run';
|
|
5
|
-
import { spawn } from './cp';
|
|
6
|
-
import type { SpawnOptions } from './cp';
|
|
7
|
-
import { parseDockerDate } from './docker';
|
|
8
|
-
|
|
9
|
-
type DockerContainerInspectOutput = {
|
|
10
|
-
[string]: any,
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export type DockerContainer = {|
|
|
14
|
-
command: string,
|
|
15
|
-
created: Date,
|
|
16
|
-
id: string,
|
|
17
|
-
image: string,
|
|
18
|
-
labels: string[],
|
|
19
|
-
mounts: string[],
|
|
20
|
-
name: string,
|
|
21
|
-
names: string[],
|
|
22
|
-
networks: string[],
|
|
23
|
-
ports: Array<{ iface: string, sourcePort: number, destPort: number }>,
|
|
24
|
-
runningFor: string,
|
|
25
|
-
size: string,
|
|
26
|
-
status: string,
|
|
27
|
-
exited: boolean,
|
|
28
|
-
inspect: () => Promise<DockerContainerInspectOutput>,
|
|
29
|
-
exists: () => Promise<boolean>,
|
|
30
|
-
isRunning: () => Promise<boolean>,
|
|
31
|
-
start: () => Promise<void>,
|
|
32
|
-
stop: (ignoreError?: boolean) => Promise<void>,
|
|
33
|
-
kill: (ignoreError?: boolean) => Promise<void>,
|
|
34
|
-
restart: () => Promise<void>,
|
|
35
|
-
rm: (ignoreError?: boolean) => Promise<void>,
|
|
36
|
-
teardown: (verbose?: boolean) => Promise<void>,
|
|
37
|
-
|};
|
|
38
|
-
|
|
39
|
-
type DockerContainerLsOptions = {
|
|
40
|
-
all?: boolean,
|
|
41
|
-
filter?: (container: DockerContainer) => boolean,
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
// calling this function in rapid succession can lead to errors.
|
|
45
|
-
// prefer throttled version
|
|
46
|
-
export async function _dockerContainerLs({
|
|
47
|
-
all,
|
|
48
|
-
filter,
|
|
49
|
-
}: DockerContainerLsOptions = {}): Promise<DockerContainer[]> {
|
|
50
|
-
return (
|
|
51
|
-
await spawn(
|
|
52
|
-
'docker',
|
|
53
|
-
[
|
|
54
|
-
'container',
|
|
55
|
-
'ls',
|
|
56
|
-
...(all ? ['--all'] : []),
|
|
57
|
-
'--no-trunc',
|
|
58
|
-
'--format',
|
|
59
|
-
'{{json .}}',
|
|
60
|
-
],
|
|
61
|
-
{ captureOutput: true },
|
|
62
|
-
)
|
|
63
|
-
)
|
|
64
|
-
.split('\n')
|
|
65
|
-
.filter((line) => !!line.trim())
|
|
66
|
-
.map((line) => {
|
|
67
|
-
const {
|
|
68
|
-
Command: command,
|
|
69
|
-
CreatedAt,
|
|
70
|
-
ID: id,
|
|
71
|
-
Image: image,
|
|
72
|
-
Labels,
|
|
73
|
-
Mounts,
|
|
74
|
-
Names,
|
|
75
|
-
Networks,
|
|
76
|
-
Ports,
|
|
77
|
-
RunningFor: runningFor,
|
|
78
|
-
Size,
|
|
79
|
-
Status: status,
|
|
80
|
-
} = JSON.parse(line.trim());
|
|
81
|
-
const names = Names.split(',').map((n) => n.trim());
|
|
82
|
-
const [name] = names;
|
|
83
|
-
|
|
84
|
-
return {
|
|
85
|
-
command,
|
|
86
|
-
id,
|
|
87
|
-
image,
|
|
88
|
-
name,
|
|
89
|
-
names,
|
|
90
|
-
runningFor,
|
|
91
|
-
size: bytes.parse(Size),
|
|
92
|
-
status,
|
|
93
|
-
created: parseDockerDate(CreatedAt),
|
|
94
|
-
labels: Labels.split(',').map((l) => l.trim()),
|
|
95
|
-
mounts: Mounts.split(',').map((m) => m.trim()),
|
|
96
|
-
networks: Networks.split(',').map((n) => n.trim()),
|
|
97
|
-
ports: Ports.split(',').map((p) => {
|
|
98
|
-
const [, iface, src, dest] =
|
|
99
|
-
p.match(/^([^:]+):(\d+)-\\u003e(\d+)/i) || [];
|
|
100
|
-
return {
|
|
101
|
-
iface,
|
|
102
|
-
src: parseInt(src, 10),
|
|
103
|
-
dest: parseInt(dest, 10),
|
|
104
|
-
};
|
|
105
|
-
}),
|
|
106
|
-
exited: /^Exited/.test(status),
|
|
107
|
-
inspect: async () => (await dockerContainerInspect(id))[0],
|
|
108
|
-
async exists(): Promise<boolean> {
|
|
109
|
-
try {
|
|
110
|
-
return !!(await this.inspect());
|
|
111
|
-
} catch {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
},
|
|
115
|
-
async isRunning(): Promise<boolean> {
|
|
116
|
-
try {
|
|
117
|
-
const {
|
|
118
|
-
State: { Running: running },
|
|
119
|
-
} = await this.inspect();
|
|
120
|
-
return running;
|
|
121
|
-
} catch {
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
},
|
|
125
|
-
start: async () => dockerContainerStart(id),
|
|
126
|
-
stop: async (ignoreError?: boolean = true) =>
|
|
127
|
-
dockerContainerStop(id, ignoreError),
|
|
128
|
-
kill: async (ignoreError?: boolean = true) =>
|
|
129
|
-
dockerContainerKill(id, ignoreError),
|
|
130
|
-
restart: async () => dockerContainerRestart(id),
|
|
131
|
-
rm: async (ignoreError?: boolean = true) =>
|
|
132
|
-
dockerContainerRm(id, ignoreError),
|
|
133
|
-
async teardown(verbose?: boolean = true) {
|
|
134
|
-
const log = (msg) => verbose && buildLog(msg);
|
|
135
|
-
if (await this.isRunning()) {
|
|
136
|
-
try {
|
|
137
|
-
log(`Stopping container: <${this.name}>...`);
|
|
138
|
-
await this.stop(false);
|
|
139
|
-
log(`<${this.name}> container stopped.`);
|
|
140
|
-
} catch (e1) {
|
|
141
|
-
log(`Failed to stop <${this.name}> container: ${e1.message}`);
|
|
142
|
-
try {
|
|
143
|
-
log(`Killing container: <${this.name}>...`);
|
|
144
|
-
await this.kill(false);
|
|
145
|
-
log(`<${this.name}> container killed.`);
|
|
146
|
-
} catch (e2) {
|
|
147
|
-
log(`Failed to kill <${this.name}> container: ${e2.message}`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
} else {
|
|
151
|
-
log(`<${this.name}> container not running, skipping stop.`);
|
|
152
|
-
}
|
|
153
|
-
if (await this.exists()) {
|
|
154
|
-
await this.rm(true);
|
|
155
|
-
} else {
|
|
156
|
-
log(`<${this.name}> container does not exist, skipping rm.`);
|
|
157
|
-
}
|
|
158
|
-
},
|
|
159
|
-
};
|
|
160
|
-
})
|
|
161
|
-
.filter((c) => c.id && (typeof filter === 'function' ? filter(c) : true));
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export const dockerContainerLs: (
|
|
165
|
-
DockerContainerLsOptions | void,
|
|
166
|
-
) => Promise<DockerContainer[]> = throttle(_dockerContainerLs, 500, {
|
|
167
|
-
trailing: false,
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
export async function dockerContainerFind(
|
|
171
|
-
search: string,
|
|
172
|
-
options?: DockerContainerLsOptions,
|
|
173
|
-
): Promise<?DockerContainer> {
|
|
174
|
-
return (
|
|
175
|
-
(await dockerContainerLs(options)).find(
|
|
176
|
-
(c) =>
|
|
177
|
-
c.name === search ||
|
|
178
|
-
c.id.startsWith(search) ||
|
|
179
|
-
c.names.includes(search),
|
|
180
|
-
) || null
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
export async function dockerContainerStop(
|
|
185
|
-
id: string | string[],
|
|
186
|
-
ignoreErrors: boolean = true,
|
|
187
|
-
) {
|
|
188
|
-
const ids = Array.isArray(id) ? id : [id];
|
|
189
|
-
try {
|
|
190
|
-
await spawn('docker', ['container', 'stop', ...ids]);
|
|
191
|
-
} catch (e) {
|
|
192
|
-
if (!ignoreErrors) {
|
|
193
|
-
throw new Error(`Failed to stop container(s): ${e.message}`);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export async function dockerContainerKill(
|
|
199
|
-
id: string | string[],
|
|
200
|
-
ignoreErrors: boolean = true,
|
|
201
|
-
) {
|
|
202
|
-
const ids = Array.isArray(id) ? id : [id];
|
|
203
|
-
try {
|
|
204
|
-
await spawn('docker', ['container', 'kill', ...ids]);
|
|
205
|
-
} catch (e) {
|
|
206
|
-
if (!ignoreErrors) {
|
|
207
|
-
throw new Error(`Failed to kill container(s): ${e.message}`);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
export async function dockerTryStopContainer(id: ?string, name?: string = '') {
|
|
213
|
-
if (id) {
|
|
214
|
-
try {
|
|
215
|
-
await dockerContainerStop(id, false);
|
|
216
|
-
} catch (e) {
|
|
217
|
-
buildLog(`Failed to stop ${name} container: ${e.message}`);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
export async function dockerContainerRm(
|
|
223
|
-
id: string | string[],
|
|
224
|
-
ignoreErrors: boolean = true,
|
|
225
|
-
) {
|
|
226
|
-
const ids = Array.isArray(id) ? id : [id];
|
|
227
|
-
try {
|
|
228
|
-
await spawn('docker', ['container', 'rm', ...ids]);
|
|
229
|
-
} catch (e) {
|
|
230
|
-
if (ignoreErrors) {
|
|
231
|
-
buildLog(
|
|
232
|
-
`Warning (ignored Error): Failed to remove container(s): ${e.message}`,
|
|
233
|
-
);
|
|
234
|
-
} else {
|
|
235
|
-
throw new Error(`Failed to remove container(s): ${e.message}`);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
export async function dockerContainerRestart(id: string | string[]) {
|
|
241
|
-
const ids = Array.isArray(id) ? id : [id];
|
|
242
|
-
await spawn('docker', ['container', 'restart', ...ids]);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
export async function dockerContainerStart(id: string | string[]) {
|
|
246
|
-
const ids = Array.isArray(id) ? id : [id];
|
|
247
|
-
await spawn('docker', ['container', 'start', ...ids]);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
export async function _dockerContainerInspect(
|
|
251
|
-
id: string | string[],
|
|
252
|
-
): Promise<DockerContainerInspectOutput[]> {
|
|
253
|
-
const ids = Array.isArray(id) ? id : [id];
|
|
254
|
-
return (
|
|
255
|
-
(
|
|
256
|
-
await spawn(
|
|
257
|
-
'docker',
|
|
258
|
-
['container', 'inspect', '--format', '{{json .}}', ...ids],
|
|
259
|
-
{ captureOutput: true },
|
|
260
|
-
)
|
|
261
|
-
)
|
|
262
|
-
.split('\n')
|
|
263
|
-
.filter((line) => !!line.trim())
|
|
264
|
-
.map((line) => JSON.parse(line.trim())) || []
|
|
265
|
-
);
|
|
266
|
-
}
|
|
267
|
-
export const dockerContainerInspect: (
|
|
268
|
-
string | string[],
|
|
269
|
-
) => Promise<DockerContainerInspectOutput[]> = throttle(
|
|
270
|
-
_dockerContainerInspect,
|
|
271
|
-
500,
|
|
272
|
-
{
|
|
273
|
-
trailing: false,
|
|
274
|
-
},
|
|
275
|
-
);
|
|
276
|
-
|
|
277
|
-
type DockerContainerRunDaemonArgs = {|
|
|
278
|
-
image: string,
|
|
279
|
-
runArgs?: string[],
|
|
280
|
-
cmd?: string[],
|
|
281
|
-
waitAttempts?: number,
|
|
282
|
-
waitDuration?: number,
|
|
283
|
-
|};
|
|
284
|
-
|
|
285
|
-
type DockerContainerRunArgs = {|
|
|
286
|
-
...DockerContainerRunDaemonArgs,
|
|
287
|
-
spawnOptions?: ?SpawnOptions,
|
|
288
|
-
|};
|
|
289
|
-
|
|
290
|
-
export async function dockerContainerRun({
|
|
291
|
-
image,
|
|
292
|
-
runArgs = [],
|
|
293
|
-
cmd = [],
|
|
294
|
-
spawnOptions,
|
|
295
|
-
}: DockerContainerRunArgs): Promise<string> {
|
|
296
|
-
return spawn('docker', ['container', 'run', ...runArgs, image, ...cmd], {
|
|
297
|
-
stdio: 'inherit',
|
|
298
|
-
pipeOutput: true,
|
|
299
|
-
...spawnOptions,
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
export async function dockerContainerRunDaemon({
|
|
304
|
-
image,
|
|
305
|
-
runArgs = [],
|
|
306
|
-
cmd = [],
|
|
307
|
-
waitAttempts = 10,
|
|
308
|
-
waitDuration = 501,
|
|
309
|
-
}: DockerContainerRunDaemonArgs): Promise<DockerContainer> {
|
|
310
|
-
const id = (
|
|
311
|
-
await dockerContainerRun({
|
|
312
|
-
image,
|
|
313
|
-
cmd,
|
|
314
|
-
runArgs: ['-d', ...runArgs],
|
|
315
|
-
spawnOptions: {
|
|
316
|
-
stdio: 'pipe',
|
|
317
|
-
pipeOutput: false,
|
|
318
|
-
captureOutput: true,
|
|
319
|
-
},
|
|
320
|
-
})
|
|
321
|
-
).trim();
|
|
322
|
-
let container = await dockerContainerFind(id);
|
|
323
|
-
let attempts = 0;
|
|
324
|
-
|
|
325
|
-
// containers don't always show up in the list right away
|
|
326
|
-
/* eslint-disable no-await-in-loop */
|
|
327
|
-
while (!container && attempts < waitAttempts) {
|
|
328
|
-
await new Promise((resolve) => setTimeout(resolve, waitDuration));
|
|
329
|
-
container = await dockerContainerFind(id);
|
|
330
|
-
attempts += 1;
|
|
331
|
-
}
|
|
332
|
-
/* eslint-enable no-await-in-loop */
|
|
333
|
-
|
|
334
|
-
if (!container) {
|
|
335
|
-
throw new Error(`Failed to find newly created container: ${id}`);
|
|
336
|
-
}
|
|
337
|
-
return container;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
const indicators = ['.', ':', '*', '+', '-', '=', '%', '$', '@', '^', '&'];
|
|
341
|
-
let curIndicator = 0;
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Waits for the given container to be fully started. Checks that the container is
|
|
345
|
-
* running, and test with the provided testFn every second until it returns true.
|
|
346
|
-
* @param {DockerContainer} container The container to test
|
|
347
|
-
* @param {Function} testFn A function that validates that the container is ready (e.g. by calling an API on the container)
|
|
348
|
-
* @param {number} timeoutMs The amount of time to wait between attempts.
|
|
349
|
-
* @param {number} maxAttempts The maximum number of attempts before giving up (rejects promise)
|
|
350
|
-
*/
|
|
351
|
-
export const dockerContainerWaitForStart = async (
|
|
352
|
-
container: DockerContainer,
|
|
353
|
-
testFn: (DockerContainer) => Promise<boolean>,
|
|
354
|
-
timeoutMs?: number = 1000,
|
|
355
|
-
maxAttempts?: number = 1200,
|
|
356
|
-
) => {
|
|
357
|
-
// claim an indicator
|
|
358
|
-
const indicator = indicators[curIndicator] || '.';
|
|
359
|
-
curIndicator = (curIndicator + 1) % indicators.length;
|
|
360
|
-
|
|
361
|
-
const { name } = container;
|
|
362
|
-
buildLog(`Waiting for ${name} to fully start... ${indicator}`);
|
|
363
|
-
await new Promise((resolve, reject) => {
|
|
364
|
-
const check = (tries = 0) => {
|
|
365
|
-
process.stdout.write(indicator);
|
|
366
|
-
setTimeout(async () => {
|
|
367
|
-
try {
|
|
368
|
-
if (!(await container.isRunning())) {
|
|
369
|
-
return reject(
|
|
370
|
-
new Error(`The '${name}' container is no longer running.`),
|
|
371
|
-
);
|
|
372
|
-
}
|
|
373
|
-
if (await testFn(container)) {
|
|
374
|
-
return resolve();
|
|
375
|
-
}
|
|
376
|
-
} catch (err) {
|
|
377
|
-
// ignore
|
|
378
|
-
}
|
|
379
|
-
return tries < maxAttempts
|
|
380
|
-
? check(tries + 1)
|
|
381
|
-
: reject(
|
|
382
|
-
new Error(`Timeout waiting for '${name}' container to start.`),
|
|
383
|
-
);
|
|
384
|
-
}, timeoutMs);
|
|
385
|
-
};
|
|
386
|
-
check();
|
|
387
|
-
});
|
|
388
|
-
process.stdout.write('\n');
|
|
389
|
-
};
|