Merge pull request #358 from crazy-max/empty-images

feat: allow images input to be empty to output bare tags
This commit is contained in:
CrazyMax 2023-11-30 02:04:19 -08:00 committed by GitHub
commit f19c3691d5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 153 additions and 12 deletions

View file

@ -427,3 +427,23 @@ jobs:
${{ steps.docker_meta.outputs.bake-file-annotations }} ${{ steps.docker_meta.outputs.bake-file-annotations }}
targets: | targets: |
release release
no-images:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v4
-
name: Docker meta
uses: ./
with:
tags: |
type=schedule
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=sha
-
name: Print envs
run: env|sort

View file

@ -383,6 +383,8 @@ images: |
* `name=<string>` image base name * `name=<string>` image base name
* `enable=<true|false>` enable this entry (default `true`) * `enable=<true|false>` enable this entry (default `true`)
If `images` is empty, tags will be generated without base name.
## `flavor` input ## `flavor` input
`flavor` defines a global behavior for [`tags`](#tags-input): `flavor` defines a global behavior for [`tags`](#tags-input):

View file

@ -733,6 +733,50 @@ describe('push', () => {
"org.opencontainers.image.url=https://github.com/octocat/Hello-World", "org.opencontainers.image.url=https://github.com/octocat/Hello-World",
"org.opencontainers.image.version=sha-860c1904a1ce19322e91ac35af1ab07466440c37" "org.opencontainers.image.version=sha-860c1904a1ce19322e91ac35af1ab07466440c37"
] ]
],
[
'push21',
'event_push_master.env',
{
images: [] as string[],
tags: [
`type=raw,value=mytag-{{branch}}`,
`type=raw,value=mytag-{{date 'YYYYMMDD'}}`,
`type=raw,value=mytag-{{date 'YYYYMMDD-HHmmss' tz='Asia/Tokyo'}}`,
`type=raw,value=mytag-tag-{{tag}}`,
`type=raw,value=mytag-baseref-{{base_ref}}`,
`type=raw,value=mytag-defbranch,enable={{is_default_branch}}`
],
} as Inputs,
{
main: 'mytag-master',
partial: [
'mytag-20200110',
'mytag-20200110-093000',
'mytag-tag-',
'mytag-baseref-',
'mytag-defbranch'
],
latest: false
} as Version,
[
'mytag-master',
'mytag-20200110',
'mytag-20200110-093000',
'mytag-tag-',
'mytag-baseref-',
'mytag-defbranch'
],
[
"org.opencontainers.image.created=2020-01-10T00:30:00.000Z",
"org.opencontainers.image.description=This your first repo!",
"org.opencontainers.image.licenses=MIT",
"org.opencontainers.image.revision=266574110acf203503badf966df2ea24b5d732d7",
"org.opencontainers.image.source=https://github.com/octocat/Hello-World",
"org.opencontainers.image.title=Hello-World",
"org.opencontainers.image.url=https://github.com/octocat/Hello-World",
"org.opencontainers.image.version=mytag-master"
]
] ]
])('given %p with %p event', tagsLabelsTest); ])('given %p with %p event', tagsLabelsTest);
}); });
@ -1780,6 +1824,43 @@ describe('tag', () => {
"org.opencontainers.image.version=v1.2.3rc2" "org.opencontainers.image.version=v1.2.3rc2"
] ]
], ],
[
'tag33',
'event_tag_v1.1.1.env',
{
images: [] as string[],
tags: [
`type=pep440,pattern={{version}}`,
`type=pep440,pattern={{major}}.{{minor}}.{{patch}}`,
`type=pep440,pattern={{major}}.{{minor}}`,
`type=pep440,pattern={{major}}`
]
} as Inputs,
{
main: '1.1.1',
partial: [
"1.1",
"1"
],
latest: true
} as Version,
[
'1.1.1',
'1.1',
'1',
'latest'
],
[
"org.opencontainers.image.created=2020-01-10T00:30:00.000Z",
"org.opencontainers.image.description=This your first repo!",
"org.opencontainers.image.licenses=MIT",
"org.opencontainers.image.revision=860c1904a1ce19322e91ac35af1ab07466440c37",
"org.opencontainers.image.source=https://github.com/octocat/Hello-World",
"org.opencontainers.image.title=Hello-World",
"org.opencontainers.image.url=https://github.com/octocat/Hello-World",
"org.opencontainers.image.version=1.1.1"
]
]
])('given %p with %p event', tagsLabelsTest); ])('given %p with %p event', tagsLabelsTest);
}); });
@ -2066,6 +2147,35 @@ describe('latest', () => {
"org.opencontainers.image.version=v1.1.1" "org.opencontainers.image.version=v1.1.1"
] ]
], ],
[
'latest10',
'event_tag_v2.0.8-beta.67.env',
{
images: [] as string[],
tags: [
`type=match,"pattern=\\d.\\d.\\d"`
]
} as Inputs,
{
main: '2.0.8',
partial: [],
latest: true
} as Version,
[
'2.0.8',
'latest',
],
[
"org.opencontainers.image.created=2020-01-10T00:30:00.000Z",
"org.opencontainers.image.description=This your first repo!",
"org.opencontainers.image.licenses=MIT",
"org.opencontainers.image.revision=860c1904a1ce19322e91ac35af1ab07466440c37",
"org.opencontainers.image.source=https://github.com/octocat/Hello-World",
"org.opencontainers.image.title=Hello-World",
"org.opencontainers.image.url=https://github.com/octocat/Hello-World",
"org.opencontainers.image.version=2.0.8"
]
]
])('given %p with %p event', tagsLabelsTest); ])('given %p with %p event', tagsLabelsTest);
}); });

View file

@ -13,7 +13,7 @@ inputs:
required: true required: true
images: images:
description: 'List of Docker images to use as base name for tags' description: 'List of Docker images to use as base name for tags'
required: true required: false
tags: tags:
description: 'List of tags as key-value pair attributes' description: 'List of tags as key-value pair attributes'
required: false required: false

2
dist/index.js generated vendored

File diff suppressed because one or more lines are too long

2
dist/index.js.map generated vendored

File diff suppressed because one or more lines are too long

View file

@ -15,10 +15,6 @@ actionsToolkit.run(
// main // main
async () => { async () => {
const inputs: Inputs = getInputs(); const inputs: Inputs = getInputs();
if (inputs.images.length == 0) {
throw new Error(`images input required`);
}
const toolkit = new Toolkit({githubToken: inputs.githubToken}); const toolkit = new Toolkit({githubToken: inputs.githubToken});
const context = await getContext(inputs.context); const context = await getContext(inputs.context);
const repo = await toolkit.github.repoData(); const repo = await toolkit.github.repoData();

View file

@ -440,16 +440,29 @@ export class Meta {
if (!this.version.main) { if (!this.version.main) {
return []; return [];
} }
const generateTags = (imageName: string, version: string): Array<string> => {
const tags: Array<string> = []; const tags: Array<string> = [];
for (const imageName of this.getImageNames()) { const prefix = imageName !== '' ? `${imageName}:` : '';
tags.push(`${imageName}:${this.version.main}`); tags.push(`${prefix}${version}`);
for (const partial of this.version.partial) { for (const partial of this.version.partial) {
tags.push(`${imageName}:${partial}`); tags.push(`${prefix}${partial}`);
} }
if (this.version.latest) { if (this.version.latest) {
const latestTag = `${this.flavor.prefixLatest ? this.flavor.prefix : ''}latest${this.flavor.suffixLatest ? this.flavor.suffix : ''}`; const latestTag = `${this.flavor.prefixLatest ? this.flavor.prefix : ''}latest${this.flavor.suffixLatest ? this.flavor.suffix : ''}`;
tags.push(`${imageName}:${Meta.sanitizeTag(latestTag)}`); tags.push(`${prefix}${Meta.sanitizeTag(latestTag)}`);
} }
return tags;
};
const tags: Array<string> = [];
const images = this.getImageNames();
if (images.length > 0) {
for (const imageName of images) {
tags.push(...generateTags(imageName, this.version.main));
}
} else {
tags.push(...generateTags('', this.version.main));
} }
return tags; return tags;
} }