Skip to content

Commit

Permalink
feat: add --tag-git-sha to generate tags like :sha-<git-sha> (#227)
Browse files Browse the repository at this point in the history
  • Loading branch information
felipecrs committed Sep 20, 2023
1 parent 4603870 commit 587ed09
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 44 deletions.
24 changes: 6 additions & 18 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -91,7 +91,7 @@
}
},
"volta": {
"node": "18.17.1",
"node": "18.18.0",
"npm": "9.8.1"
}
}
84 changes: 59 additions & 25 deletions src/index.ts
Expand Up @@ -35,7 +35,8 @@ interface DockerMetaConfig {
version: string;
branch: string;
latest: boolean;
"tag-version": boolean
"tag-version": boolean;
"tag-git-sha": boolean;
"tag-semver": boolean | "auto";
"change-request": boolean;
"change-number": string;
Expand All @@ -61,7 +62,7 @@ interface DockerMetaConfig {
};
groups: {
[group: string]: any;
}
};
}

class DockerMeta extends Command {
Expand Down Expand Up @@ -96,6 +97,11 @@ class DockerMeta extends Command {
description: "Use `version` to generate tags",
allowNo: true,
}),
"tag-git-sha": flags.boolean({
description:
"Generate tags like `:sha-<git-sha>` when not in change request mode",
allowNo: true,
}),
"tag-semver": flags.boolean({
description: "Use semver strategy to generate tags",
allowNo: true,
Expand Down Expand Up @@ -125,6 +131,7 @@ class DockerMeta extends Command {
branch?: string;
latest?: boolean;
"tag-version"?: boolean;
"tag-git-sha"?: boolean;
"tag-semver"?: boolean;
"build-date"?: string;
"git-sha"?: string;
Expand Down Expand Up @@ -153,29 +160,38 @@ class DockerMeta extends Command {
typeof flags.latest !== "undefined"
? flags.latest
: "LATEST" in process.env
? process.env.LATEST === "true"
: // eslint-disable-next-line no-negated-condition
typeof config.latest !== "undefined"
? config.latest
: false,
? process.env.LATEST === "true"
: // eslint-disable-next-line no-negated-condition
typeof config.latest !== "undefined"
? config.latest
: false,

"tag-version":
// eslint-disable-next-line no-negated-condition
typeof flags["tag-version"] !== "undefined"
? flags["tag-version"]
: // eslint-disable-next-line no-negated-condition
typeof config["tag-version"] !== "undefined"
? config["tag-version"]
: true,
? config["tag-version"]
: true,

"tag-git-sha":
// eslint-disable-next-line no-negated-condition
typeof flags["tag-git-sha"] !== "undefined"
? flags["tag-git-sha"]
: // eslint-disable-next-line no-negated-condition
typeof config["tag-git-sha"] !== "undefined"
? config["tag-git-sha"]
: false,

"tag-semver":
// eslint-disable-next-line no-negated-condition
typeof flags["tag-semver"] !== "undefined"
? flags["tag-semver"]
: // eslint-disable-next-line no-negated-condition
typeof config["tag-semver"] !== "undefined"
? config["tag-semver"]
: "auto",
? config["tag-semver"]
: "auto",

version: flags.version || process.env.VERSION || config.version,

Expand All @@ -186,7 +202,7 @@ class DockerMeta extends Command {
execa.commandSync("git branch --show-current").stdout,

"git-sha":
flags["build-date"] ||
flags["git-sha"] ||
process.env.GIT_SHA ||
process.env.GIT_COMMIT ||
config["git-sha"] ||
Expand All @@ -203,11 +219,11 @@ class DockerMeta extends Command {
typeof flags["change-request"] !== "undefined"
? flags["change-request"]
: "CHANGE_REQUEST" in process.env
? process.env.CHANGE_REQUEST === "true"
: // eslint-disable-next-line no-negated-condition
typeof config["change-request"] !== "undefined"
? config["change-request"]
: true,
? process.env.CHANGE_REQUEST === "true"
: // eslint-disable-next-line no-negated-condition
typeof config["change-request"] !== "undefined"
? config["change-request"]
: true,

"change-number":
flags["change-number"] ||
Expand Down Expand Up @@ -243,6 +259,9 @@ class DockerMeta extends Command {
this.error("git-sha unset");
}

// Shorten the git sha to 7 characters
resultConfig["git-sha"] = resultConfig["git-sha"].substring(0, 7);

if (!resultConfig["build-date"]) {
this.error("build-date unset");
}
Expand Down Expand Up @@ -279,8 +298,9 @@ class DockerMeta extends Command {
// semver.parse will normalize the version if it's a valid semver
// example: v1.0.0 -> 1.0.0
// otherwise we leave it as is
const normalizedVersion = `${semver.parse(config.version) || config.version
}`;
const normalizedVersion = `${
semver.parse(config.version) || config.version
}`;

outputTarget.labels["org.label-schema.vsc-ref"] = config["git-sha"];
outputTarget.labels["org.label-schema.build-date"] =
Expand All @@ -291,7 +311,13 @@ class DockerMeta extends Command {
outputTarget.labels["org.label-schema.schema-version"] = "1.0.0-rc1";

// extract needed fields
const { labels: inputLabels, images: inputImages, args: inputArgs, tags: inputTags, ...inputExtraKeys } = inputTarget;
const {
labels: inputLabels,
images: inputImages,
args: inputArgs,
tags: inputTags,
...inputExtraKeys
} = inputTarget;
// merge generated labels with the labels from the input
outputTarget.labels = { ...outputTarget.labels, ...inputLabels };

Expand All @@ -311,17 +337,25 @@ class DockerMeta extends Command {
);
}
} else {
if (config["tag-git-sha"] === true) {
outputTarget.tags.push(
...inputImages.map((image) => `${image}:sha-${config["git-sha"]}`)
);
}

if (config["tag-version"] === true) {
outputTarget.tags.push(
...inputImages.map(
(image) => `${image}:${normalizedVersion}`
)
...inputImages.map((image) => `${image}:${normalizedVersion}`)
);
}

if (config.latest) {
// eslint-disable-next-line max-depth
if (config["tag-version"] === true && config["tag-semver"] && semver.valid(config.version)) {
if (
config["tag-version"] === true &&
config["tag-semver"] &&
semver.valid(config.version)
) {
const versionTags: string[] = [];

const majorTag = `${semver.major(normalizedVersion)}`;
Expand Down Expand Up @@ -377,7 +411,7 @@ class DockerMeta extends Command {
}
}

if(config.groups) {
if (config.groups) {
output.group = config.groups;
}

Expand Down
44 changes: 44 additions & 0 deletions test/index.test.ts
Expand Up @@ -266,6 +266,50 @@ describe("docker-meta", () => {
}`);
});

it("tags with git-sha properly", async () => {
process.env.VERSION = "1.2.3";
process.env.LATEST = "true";
process.env.BRANCH = "develop";
process.env.CHANGE_REQUEST = "false";
process.env.GIT_COMMIT = "81a88f456";

const result = execa.commandSync(`${bin} -o dm.json --tag-git-sha`);
expect(result.stdout).toBe("");
expect(result.exitCode).toBe(0);

expect(fs.readFileSync("dm.json").toString()).toEqual(stripIndent`
{
"target": {
"docker-meta": {
"tags": [
"felipecrs/docker-meta:sha-81a88f4",
"ghcr.io/felipecrs/docker-meta:sha-81a88f4",
"felipecrs/docker-meta:1.2.3",
"ghcr.io/felipecrs/docker-meta:1.2.3",
"felipecrs/docker-meta:1",
"ghcr.io/felipecrs/docker-meta:1",
"felipecrs/docker-meta:1.2",
"ghcr.io/felipecrs/docker-meta:1.2",
"felipecrs/docker-meta:develop",
"ghcr.io/felipecrs/docker-meta:develop",
"felipecrs/docker-meta:latest",
"ghcr.io/felipecrs/docker-meta:latest"
],
"labels": {
"org.label-schema.vsc-ref": "81a88f4",
"org.label-schema.build-date": "docker-meta",
"org.label-schema.version": "1.2.3",
"org.label-schema.schema-version": "1.0.0-rc1"
},
"args": {
"VERSION": "1.2.3",
"BRANCH": "develop"
}
}
}
}`);
});

it("refuses to work if tag-semver is enabled and version is not valid", async () => {
process.env.VERSION = "invalid1.2.3";
process.env.LATEST = "true";
Expand Down

0 comments on commit 587ed09

Please sign in to comment.