-
Notifications
You must be signed in to change notification settings - Fork 2.6k
/
dockercomposedigests.ts
71 lines (64 loc) · 2.72 KB
/
dockercomposedigests.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"use strict";
import * as fs from "fs";
import * as tl from "azure-pipelines-task-lib/task";
import * as yaml from "js-yaml";
import DockerComposeConnection from "./dockercomposeconnection";
import * as imageUtils from "docker-common-v2/containerimageutils";
import * as dockerCommandUtils from "docker-common-v2/dockercommandutils";
function dockerPull(connection: DockerComposeConnection, imageName: string, imageDigests: any, serviceName: string) {
var command = connection.createCommand();
command.arg("pull");
var arg = tl.getInput("arguments", false);
var commandArgs = dockerCommandUtils.getCommandArguments(arg || "");
command.line(commandArgs || "");
command.arg(imageName);
var output = "";
command.on("stdout", data => {
output += data;
});
return connection.execCommand(command).then(() => {
// Parse the output to find the repository digest
var imageDigest = output.match(/^Digest: (.*)$/m)[1];
if (imageDigest) {
var baseImageName = imageUtils.imageNameWithoutTag(imageName);
imageDigests[serviceName] = baseImageName + "@" + imageDigest;
}
});
}
function writeImageDigestComposeFile(version: string, imageDigests: any, imageDigestComposeFile: string): void {
var services = {};
Object.keys(imageDigests).forEach(serviceName => {
services[serviceName] = {
image: imageDigests[serviceName]
};
});
fs.writeFileSync(imageDigestComposeFile, yaml.safeDump({
version: version,
services: services
}, { lineWidth: -1 } as any));
}
export function createImageDigestComposeFile(connection: DockerComposeConnection, imageDigestComposeFile: string) {
return connection.getImages().then(images => {
var promise: any;
var version = connection.getVersion();
var imageDigests = {};
Object.keys(images).forEach(serviceName => {
(imageName => {
if (!promise) {
promise = dockerPull(connection, imageName, imageDigests, serviceName);
} else {
promise = promise.then(() => dockerPull(connection, imageName, imageDigests, serviceName));
}
})(images[serviceName]);
});
if (!promise) {
writeImageDigestComposeFile(version, imageDigests, imageDigestComposeFile);
} else {
return promise.then(() => writeImageDigestComposeFile(version, imageDigests, imageDigestComposeFile));
}
});
}
export function run(connection: DockerComposeConnection): any {
var imageDigestComposeFile = tl.getPathInput("imageDigestComposeFile", true);
return createImageDigestComposeFile(connection, imageDigestComposeFile);
}