diff --git a/__tests__/flavor.test.ts b/__tests__/flavor.test.ts index fcd6642..1238cdc 100644 --- a/__tests__/flavor.test.ts +++ b/__tests__/flavor.test.ts @@ -32,7 +32,8 @@ describe('transform', () => { { latest: "true", prefix: "", - suffix: "" + suffix: "", + on_latest: "false" } as Flavor, false ], @@ -43,7 +44,8 @@ describe('transform', () => { { latest: "false", prefix: "", - suffix: "" + suffix: "", + on_latest: "false" } as Flavor, false ], @@ -54,7 +56,8 @@ describe('transform', () => { { latest: "auto", prefix: "", - suffix: "" + suffix: "", + on_latest: "false" } as Flavor, false ], @@ -72,7 +75,8 @@ describe('transform', () => { { latest: "auto", prefix: "sha-", - suffix: "" + suffix: "", + on_latest: "false" } as Flavor, false ], @@ -83,7 +87,8 @@ describe('transform', () => { { latest: "auto", prefix: "", - suffix: "-alpine" + suffix: "-alpine", + on_latest: "false" } as Flavor, false ], @@ -96,10 +101,36 @@ describe('transform', () => { { latest: "false", prefix: "dev-", - suffix: "-alpine" + suffix: "-alpine", + on_latest: "false" } as Flavor, false ], + [ + [ + `latest=auto`, + `prefix=`, + `suffix=-alpine`, + `on_latest=true` + ], + { + latest: "auto", + prefix: "", + suffix: "-alpine", + on_latest: "true" + } as Flavor, + false + ], + [ + [ + `latest=true`, + `prefix=`, + `suffix=-alpine`, + `on_latest=fail` + ], + {} as Flavor, + true + ] ])('given %p attributes ', async (inputs: string[], expected: Flavor, invalid: boolean) => { try { const flavor = Transform(inputs); diff --git a/__tests__/meta.test.ts b/__tests__/meta.test.ts index 2e0c3e9..0612f89 100644 --- a/__tests__/meta.test.ts +++ b/__tests__/meta.test.ts @@ -1589,6 +1589,78 @@ describe('latest', () => { "org.opencontainers.image.vendor=MyCompany" ] ], + [ + 'latest10', + 'event_tag_v1.1.1.env', + { + images: ['org/app', 'ghcr.io/user/app'], + tags: [ + `type=ref,event=tag` + ], + flavor: [ + `latest=true`, + `on_latest=true`, + `suffix=-alpine` + ], + } as Inputs, + { + main: 'v1.1.1-alpine', + partial: [], + latest: true + } as Version, + [ + 'org/app:v1.1.1-alpine', + 'org/app:latest-alpine', + 'ghcr.io/user/app:v1.1.1-alpine', + 'ghcr.io/user/app:latest-alpine' + ], + [ + "org.opencontainers.image.title=Hello-World", + "org.opencontainers.image.description=This your first repo!", + "org.opencontainers.image.url=https://github.com/octocat/Hello-World", + "org.opencontainers.image.source=https://github.com/octocat/Hello-World", + "org.opencontainers.image.version=v1.1.1-alpine", + "org.opencontainers.image.created=2020-01-10T00:30:00.000Z", + "org.opencontainers.image.revision=90dd6032fac8bda1b6c4436a2e65de27961ed071", + "org.opencontainers.image.licenses=MIT" + ] + ], + [ + 'latest12', + 'event_tag_v1.1.1.env', + { + images: ['org/app', 'ghcr.io/user/app'], + tags: [ + `type=ref,event=tag` + ], + flavor: [ + `latest=true`, + `on_latest=true`, + `prefix=dev-` + ], + } as Inputs, + { + main: 'dev-v1.1.1', + partial: [], + latest: true + } as Version, + [ + 'org/app:dev-v1.1.1', + 'org/app:dev-latest', + 'ghcr.io/user/app:dev-v1.1.1', + 'ghcr.io/user/app:dev-latest' + ], + [ + "org.opencontainers.image.title=Hello-World", + "org.opencontainers.image.description=This your first repo!", + "org.opencontainers.image.url=https://github.com/octocat/Hello-World", + "org.opencontainers.image.source=https://github.com/octocat/Hello-World", + "org.opencontainers.image.version=dev-v1.1.1", + "org.opencontainers.image.created=2020-01-10T00:30:00.000Z", + "org.opencontainers.image.revision=90dd6032fac8bda1b6c4436a2e65de27961ed071", + "org.opencontainers.image.licenses=MIT" + ] + ] ])('given %p with %p event', tagsLabelsTest); }); diff --git a/dist/index.js b/dist/index.js index 1cad421..23861aa 100644 --- a/dist/index.js +++ b/dist/index.js @@ -136,7 +136,8 @@ function Transform(inputs) { const flavor = { latest: 'auto', prefix: '', - suffix: '' + suffix: '', + on_latest: 'false' }; for (const input of inputs) { const parts = input.split('=', 2); @@ -159,6 +160,13 @@ function Transform(inputs) { flavor.suffix = parts[1]; break; } + case 'on_latest': { + flavor.on_latest = parts[1]; + if (!['true', 'false'].includes(flavor.on_latest)) { + throw new Error(`Invalid on_latest flavor entry: ${input}`); + } + break; + } default: { throw new Error(`Unknown entry: ${input}`); } @@ -168,6 +176,7 @@ function Transform(inputs) { core.info(`latest=${flavor.latest}`); core.info(`prefix=${flavor.prefix}`); core.info(`suffix=${flavor.suffix}`); + core.info(`on_latest=${flavor.on_latest}`); core.endGroup(); return flavor; } @@ -633,7 +642,12 @@ class Meta { tags.push(`${imageLc}:${partial}`); } if (this.version.latest) { - tags.push(`${imageLc}:latest`); + if (this.flavor.on_latest === "true") { + tags.push(`${imageLc}:${this.flavor.prefix}latest${this.flavor.suffix}`); + } + else { + tags.push(`${imageLc}:latest`); + } } } return tags; diff --git a/src/flavor.ts b/src/flavor.ts index 40b02d3..b240eff 100644 --- a/src/flavor.ts +++ b/src/flavor.ts @@ -4,13 +4,15 @@ export interface Flavor { latest: string; prefix: string; suffix: string; + on_latest: string; } export function Transform(inputs: string[]): Flavor { const flavor: Flavor = { latest: 'auto', prefix: '', - suffix: '' + suffix: '', + on_latest: 'false' }; for (const input of inputs) { @@ -34,6 +36,13 @@ export function Transform(inputs: string[]): Flavor { flavor.suffix = parts[1]; break; } + case 'on_latest': { + flavor.on_latest = parts[1]; + if (!['true', 'false'].includes(flavor.on_latest)) { + throw new Error(`Invalid on_latest flavor entry: ${input}`); + } + break; + } default: { throw new Error(`Unknown entry: ${input}`); } @@ -44,6 +53,8 @@ export function Transform(inputs: string[]): Flavor { core.info(`latest=${flavor.latest}`); core.info(`prefix=${flavor.prefix}`); core.info(`suffix=${flavor.suffix}`); + core.info(`on_latest=${flavor.on_latest}`); + core.endGroup(); return flavor; diff --git a/src/meta.ts b/src/meta.ts index ebcb7a6..ac2f3fd 100644 --- a/src/meta.ts +++ b/src/meta.ts @@ -304,7 +304,11 @@ export class Meta { tags.push(`${imageLc}:${partial}`); } if (this.version.latest) { - tags.push(`${imageLc}:latest`); + if (this.flavor.on_latest === 'true') { + tags.push(`${imageLc}:${this.flavor.prefix}latest${this.flavor.suffix}`); + } else { + tags.push(`${imageLc}:latest`); + } } } return tags;