Skip to content

Commit cc1fa94

Browse files
authored
Print an error message and exit if docker build failed (#102)
1 parent e9d8da1 commit cc1fa94

File tree

4 files changed

+880
-142
lines changed

4 files changed

+880
-142
lines changed

deploy/lib/buildAndPushContainers.js

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,44 @@ const tar = require('tar-fs');
55

66
const docker = new Docker();
77

8-
const promisifyStream = (stream, verbose) => new Promise((resolve, reject) => {
9-
stream.on('data', (data) => {
10-
if (verbose) {
11-
console.log(data.toString().replace('\n', ''));
12-
}
8+
function extractStreamContents(stream, verbose) {
9+
return new Promise((resolve, reject) => {
10+
const streamContent = [];
11+
12+
stream.on('data', (data) => {
13+
const streamData = data.toString().replace('\n', '')
14+
streamContent.push(streamData);
15+
16+
if (verbose) {
17+
console.log(streamData);
18+
}
19+
});
20+
21+
stream.on('end', () => {
22+
resolve(streamContent);
23+
});
24+
stream.on('error', reject);
1325
});
14-
stream.on('end', resolve);
15-
stream.on('error', reject);
16-
});
26+
}
27+
28+
function findErrorInBuildOutput(buildOutput) {
29+
for (const buildStepLog of buildOutput) {
30+
if (buildStepLog.startsWith('{"errorDetail":{')) {
31+
let errorDetail;
32+
try {
33+
errorDetail = JSON.parse(buildStepLog)['errorDetail'];
34+
} catch (err) {
35+
return "";
36+
}
37+
38+
if (errorDetail !== undefined && errorDetail['message'] !== undefined) {
39+
return errorDetail['message'];
40+
}
41+
42+
return JSON.stringify(errorDetail);
43+
}
44+
}
45+
}
1746

1847
module.exports = {
1948
buildAndPushContainers() {
@@ -32,12 +61,18 @@ module.exports = {
3261

3362
return new Promise(async (resolve, reject) => {
3463
const buildStream = await docker.buildImage(tarStream, { t: imageName })
35-
await promisifyStream(buildStream, this.provider.options.verbose);
64+
const buildStreamEvents = await extractStreamContents(buildStream, this.provider.options.verbose);
65+
66+
const buildError = findErrorInBuildOutput(buildStreamEvents);
67+
if (buildError !== undefined) {
68+
reject(`Build did not succeed, error: ${buildError}`);
69+
return
70+
}
3671

3772
const image = docker.getImage(imageName)
3873

3974
const inspectedImage = await image.inspect()
40-
.catch(() => reject("Error during build of the image "+imageName+": run --verbose to see the error"));
75+
.catch(() => reject(`Image ${imageName} does not exist: run --verbose to see errors`));
4176

4277
if (inspectedImage === undefined) {
4378
return
@@ -55,7 +90,7 @@ module.exports = {
5590
}
5691

5792
const pushStream = await image.push(auth);
58-
await promisifyStream(pushStream, this.provider.options.verbose);
93+
await extractStreamContents(pushStream, this.provider.options.verbose);
5994

6095
resolve();
6196
});

0 commit comments

Comments
 (0)