diff --git a/README.md b/README.md index e922a73..2bc0897 100644 --- a/README.md +++ b/README.md @@ -314,6 +314,7 @@ The following outputs are available: |-------------------------|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------| | `version` | String | Docker image version | | `tags` | String | Docker tags | +| `tag-names` | String | Docker tag names without image base name | | `labels` | String | Docker labels | | `annotations` | String | [Annotations](https://github.com/moby/buildkit/blob/master/docs/annotations.md) | | `json` | String | JSON output of tags and labels | diff --git a/__tests__/meta.test.ts b/__tests__/meta.test.ts index 8132728..f93fc63 100644 --- a/__tests__/meta.test.ts +++ b/__tests__/meta.test.ts @@ -3936,6 +3936,12 @@ describe('json', () => { "user/app:custom", "user/app:tags" ], + "tag-names": [ + "dev", + "my", + "custom", + "tags" + ], "labels": { "foo": "", "org.opencontainers.image.created": "2020-01-10T00:30:00.000Z", @@ -3974,6 +3980,10 @@ describe('json', () => { "user/app:dev", "user/app:my", ], + "tag-names": [ + "dev", + "my", + ], "labels": { "org.opencontainers.image.created": "2020-01-10T00:30:00.000Z", "org.opencontainers.image.description": "This your first repo!", @@ -4017,6 +4027,13 @@ describe('json', () => { "user/app:tags", "user/app:latest" ], + "tag-names": [ + "release1", + "my", + "custom", + "tags", + "latest" + ], "labels": { "org.opencontainers.image.created": "2020-01-10T00:30:00.000Z", "org.opencontainers.image.description": "This your first repo!", @@ -4061,6 +4078,12 @@ describe('json', () => { "user/app:custom", "user/app:tags" ], + "tag-names": [ + "20200110", + "my", + "custom", + "tags" + ], "labels": { "org.opencontainers.image.created": "2020-01-10T00:30:00.000Z", "org.opencontainers.image.description": "This your first repo!", @@ -4114,6 +4137,15 @@ describe('json', () => { "ghcr.io/user/app:tags", "ghcr.io/user/app:latest" ], + "tag-names": [ + "1.1.1", + "1.1", + "1", + "my", + "custom", + "tags", + "latest", + ], "labels": { "org.opencontainers.image.created": "2020-01-10T00:30:00.000Z", "org.opencontainers.image.description": "This your first repo!", @@ -4156,6 +4188,11 @@ describe('json', () => { "ghcr.io/user/app:custom", "ghcr.io/user/app:tags" ], + "tag-names": [ + "my", + "custom", + "tags", + ], "labels": { "org.opencontainers.image.created": "2020-01-10T00:30:00.000Z", "org.opencontainers.image.description": "This your first repo!", @@ -4196,6 +4233,10 @@ describe('json', () => { "org/app:v1.1.1", "org/app:latest" ], + "tag-names": [ + "v1.1.1", + "latest" + ], "labels": { "maintainer": "CrazyMax", "org.opencontainers.image.created": "2020-01-10T00:30:00.000Z", diff --git a/action.yml b/action.yml index d969e14..25168d3 100644 --- a/action.yml +++ b/action.yml @@ -48,6 +48,8 @@ outputs: description: 'Generated Docker image version' tags: description: 'Generated Docker tags' + tag-names: + description: 'Generated Docker tag names without image base name' labels: description: 'Generated Docker labels' annotations: diff --git a/src/main.ts b/src/main.ts index 568e95c..00ddfd9 100644 --- a/src/main.ts +++ b/src/main.ts @@ -47,7 +47,7 @@ actionsToolkit.run( setOutput('version', version.main || ''); // Docker tags - const tags: Array = meta.getTags(); + const tags = meta.getTags(); if (tags.length == 0) { core.warning('No Docker tag has been generated. Check tags input.'); } else { @@ -58,6 +58,7 @@ actionsToolkit.run( }); } setOutput('tags', tags.join(inputs.sepTags)); + setOutput('tag-names', meta.getTags(true).join(inputs.sepTags)); // Docker labels const labels: Array = meta.getLabels(); diff --git a/src/meta.ts b/src/meta.ts index 0a0664a..8a24a0f 100644 --- a/src/meta.ts +++ b/src/meta.ts @@ -494,33 +494,37 @@ export class Meta { return images; } - public getTags(): Array { + public getTags(namesOnly?: boolean): Array { if (!this.version.main) { return []; } - - const generateTags = (imageName: string, version: string): Array => { - const tags: Array = []; - const prefix = imageName !== '' ? `${imageName}:` : ''; - tags.push(`${prefix}${version}`); - for (const partial of this.version.partial) { - tags.push(`${prefix}${partial}`); - } - if (this.version.latest) { - const latestTag = `${this.flavor.prefixLatest ? this.flavor.prefix : ''}latest${this.flavor.suffixLatest ? this.flavor.suffix : ''}`; - tags.push(`${prefix}${Meta.sanitizeTag(latestTag)}`); - } - return tags; - }; + if (namesOnly) { + return this.generateTags(this.version.main); + } const tags: Array = []; const images = this.getImageNames(); if (images.length > 0) { for (const imageName of images) { - tags.push(...generateTags(imageName, this.version.main)); + tags.push(...this.generateTags(this.version.main, imageName)); } } else { - tags.push(...generateTags('', this.version.main)); + tags.push(...this.generateTags(this.version.main)); + } + + return tags; + } + + private generateTags(version: string, imageName?: string): Array { + const tags: Array = []; + const prefix = imageName ? `${imageName}:` : ''; + tags.push(`${prefix}${version}`); + for (const partial of this.version.partial) { + tags.push(`${prefix}${partial}`); + } + if (this.version.latest) { + const latestTag = `${this.flavor.prefixLatest ? this.flavor.prefix : ''}latest${this.flavor.suffixLatest ? this.flavor.suffix : ''}`; + tags.push(`${prefix}${Meta.sanitizeTag(latestTag)}`); } return tags; } @@ -568,6 +572,7 @@ export class Meta { } return { tags: this.getTags(), + 'tag-names': this.getTags(true), labels: this.getLabels().reduce((res, label) => { const matches = label.match(/([^=]*)=(.*)/); if (!matches) {