Skip to content

Commit 384a9b2

Browse files
authored
modified docker label image code as per suggestions (#448)
* modified docker label image code as per suggestions * updated code as per review changes * modified code changes as per suggestions * added return type
1 parent a8652b7 commit 384a9b2

File tree

4 files changed

+70
-44
lines changed

4 files changed

+70
-44
lines changed

common-npm-packages/docker-common/containerimageutils.ts

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -253,60 +253,70 @@ export function getImageIdFromBuildOutput(output: string): string {
253253

254254
return "";
255255
}
256-
export function getBaseImageDigestDockerFile(dockerFileContentPath: string): string {
256+
export function getBaseImageDetialsFromDockerFIle(dockerFileContentPath: string, connection?: ContainerConnection):baseImageDetails {
257257
// This method checks if there is FROM image@sha256:digest present in Dockerfile
258258
// if matched it returns digest
259259
// if not, it returns null
260-
260+
261261
try {
262-
var dockerFileContent=fs.readFileSync(dockerFileContentPath).toString();
262+
var dockerFileContent = fs.readFileSync(dockerFileContentPath).toString();
263263
if (!dockerFileContent || dockerFileContent == "") {
264264
return null;
265-
}
265+
}
266266
var lines = dockerFileContent.split(/[\r?\n]/);
267267
var aliasToImageNameMapping: Map<string, string> = new Map<string, string>();
268268
var baseImage = "";
269-
270-
// Added regex pattern to check line starts with FROM IMAGE
271-
const matchPatternForDockerImage = new RegExp(/^FROM\s+IMAGE/);
269+
const baseImageDetails = { name: "", digest: "" };
272270

273271
for (var i = 0; i < lines.length; i++) {
274272
const currentLine = lines[i].trim();
275-
276-
if (!currentLine.toUpperCase().match(matchPatternForDockerImage)) {
273+
274+
if (!currentLine.toUpperCase().startsWith("FROM")) {
277275
continue;
278276
}
279277
var nameComponents = currentLine.substring(4).toLowerCase().split(" as ");
280278
var prospectImageName = nameComponents[0].trim();
281-
279+
282280
if (nameComponents.length > 1) {
283281
var alias = nameComponents[1].trim();
284-
282+
285283
if (aliasToImageNameMapping.has(prospectImageName)) {
286284
aliasToImageNameMapping.set(alias, aliasToImageNameMapping.get(prospectImageName));
287285
} else {
288286
aliasToImageNameMapping.set(alias, prospectImageName);
289287
}
290-
288+
291289
baseImage = aliasToImageNameMapping.get(alias);
292290
} else {
293291
baseImage = aliasToImageNameMapping.has(prospectImageName)
294292
? aliasToImageNameMapping.get(prospectImageName)
295293
: prospectImageName;
296294
}
297295
}
298-
299-
let baseImageData = baseImage.split('@');
300-
if (baseImageData.length > 1) {
301-
let digest = baseImageData[1].split(':');
302-
if (digest.length > 1){
303-
return digest[1];
296+
baseImageDetails.name = baseImage.includes("$") ? null : sanityzeBaseImage(baseImage);// In this case the base image has an argument and we don't know what its real value is
297+
298+
if (!connection) {
299+
tl.debug("Image digest couldn't be extracted because no connection was found.");
300+
return baseImageDetails;
301+
}
302+
else {
303+
let baseImageData = baseImage.split('@');
304+
if (baseImageData.length > 1) {
305+
let digest = baseImageData[1].split(':');
306+
if (digest.length > 1) {
307+
baseImageDetails.digest = digest[1];
308+
}
309+
} else {
310+
baseImageDetails.digest = null;
304311
}
305312
}
306-
307-
return null;
313+
return baseImageDetails;
308314
} catch (error) {
309-
tl.debug(`An error ocurred getting the base image digest. ${error.message}`);
315+
tl.debug(`An error ocurred getting the base image details. ${error.message}`);
310316
return null;
311317
}
318+
}
319+
export class baseImageDetails{
320+
name: string;
321+
digest: string ;
312322
}

common-npm-packages/docker-common/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common-npm-packages/docker-common/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "azure-pipelines-tasks-docker-common",
3-
"version": "2.256.0",
3+
"version": "2.256.1",
44
"description": "Common Library for Azure Rest Calls",
55
"repository": {
66
"type": "git",

common-npm-packages/docker-common/pipelineutils.ts

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -54,31 +54,47 @@ function addReleaseLabels(hostName: string, labels: string[], addPipelineData?:
5454
}
5555

5656
function addBaseImageLabels(connection: ContainerConnection, labels: string[], dockerFilePath: string): void {
57-
const baseImageName = containerUtils.getBaseImageNameFromDockerFile(dockerFilePath);
58-
if (!baseImageName) {
59-
return;
60-
}
61-
62-
addLabelWithValue("image.base.ref.name", baseImageName, labels);
6357

64-
if (!connection) {
65-
tl.debug("Image digest couldn't be extracted because no connection was found.");
66-
return;
67-
}
58+
//Added Dynamic feature flag to fix getting digest image from docker file
6859
let digestImageFromFileEnabled = tl.getPipelineFeature('UseDigestImageFromFile');
69-
var baseImageDigest = "";
60+
7061
if (digestImageFromFileEnabled) {
71-
baseImageDigest = containerUtils.getBaseImageDigestDockerFile(dockerFilePath);
72-
}
73-
//first check if there is digest passed in Dockerfile
74-
if (!baseImageDigest) {
75-
baseImageDigest = containerUtils.getImageDigest(connection, baseImageName);
62+
63+
// using getBaseImageDetialsFromDockerFIle method to fetch both image and imagedigest
64+
const baseImage = containerUtils.getBaseImageDetialsFromDockerFIle(dockerFilePath, connection);
65+
if (!baseImage.name) {
66+
return;
67+
}
68+
addLabelWithValue("image.base.ref.name", baseImage.name, labels);
69+
//first check if there is digest passed in ]Dockerfile
70+
if (!baseImage.digest) {
71+
baseImage.digest = containerUtils.getImageDigest(connection, baseImage.name);
72+
}
73+
//if there is no digest in Dockerfile, get digest using ImageName:tag
74+
if (baseImage.digest) {
75+
addLabelWithValue("image.base.digest", baseImage.digest, labels);
76+
}
77+
7678
}
79+
else {
80+
const baseImageName = containerUtils.getBaseImageNameFromDockerFile(dockerFilePath);
81+
if (!baseImageName) {
82+
return;
83+
}
84+
addLabelWithValue("image.base.ref.name", baseImageName, labels);
85+
86+
if (!connection) {
87+
tl.debug("Image digest couldn't be extracted because no connection was found.");
88+
return;
89+
}
90+
91+
const baseImageDigest = containerUtils.getImageDigest(connection, baseImageName);
7792

78-
//if there is no digest in Dockerfile, get digest using ImageName:tag
79-
if (baseImageDigest) {
80-
addLabelWithValue("image.base.digest", baseImageDigest, labels);
81-
}
93+
//if there is no digest in Dockerfile, get digest using ImageName:tag
94+
if (baseImageDigest) {
95+
addLabelWithValue("image.base.digest", baseImageDigest, labels);
96+
}
97+
}
8298
}
8399

84100
function getReverseDNSName(): string {

0 commit comments

Comments
 (0)