mirror of
https://github.com/docker/metadata-action.git
synced 2025-04-18 06:29:31 +02:00
Allow custom value for semver and match type
This commit is contained in:
parent
b171e9c8ea
commit
e59258b94d
19
.github/workflows/ci.yml
vendored
19
.github/workflows/ci.yml
vendored
@ -129,7 +129,24 @@ jobs:
|
|||||||
flavor: |
|
flavor: |
|
||||||
latest=${{ matrix.flavor-latest }}
|
latest=${{ matrix.flavor-latest }}
|
||||||
|
|
||||||
label-custom:
|
flavor:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Docker meta
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
images: |
|
||||||
|
${{ env.DOCKER_IMAGE }}
|
||||||
|
ghcr.io/name/app
|
||||||
|
flavor: |
|
||||||
|
prefix=foo-
|
||||||
|
suffix=-bar
|
||||||
|
|
||||||
|
labels:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
|
14
README.md
14
README.md
@ -381,10 +381,13 @@ tags: |
|
|||||||
tags: |
|
tags: |
|
||||||
# minimal
|
# minimal
|
||||||
type=semver,pattern={{version}}
|
type=semver,pattern={{version}}
|
||||||
|
# use custom value instead of git tag
|
||||||
|
type=semver,pattern={{version}},value=v1.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
Will be used on a [push tag event](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#push)
|
Will be used on a [push tag event](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#push)
|
||||||
and requires a valid Git tag [semver](https://semver.org/).
|
and requires a valid Git tag [semver](https://semver.org/) but you can also use a custom value through `value`
|
||||||
|
attribute.
|
||||||
|
|
||||||
`pattern` attribute supports [Handlebars template](https://handlebarsjs.com/guide/) with the following expressions:
|
`pattern` attribute supports [Handlebars template](https://handlebarsjs.com/guide/) with the following expressions:
|
||||||
* `raw` ; the actual semver
|
* `raw` ; the actual semver
|
||||||
@ -412,7 +415,7 @@ Extended attributes and default values:
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
tags: |
|
tags: |
|
||||||
type=semver,enable=true,priority=900,prefix=,suffix=,pattern=
|
type=semver,enable=true,priority=900,prefix=,suffix=,pattern=,value=
|
||||||
```
|
```
|
||||||
|
|
||||||
### `type=match`
|
### `type=match`
|
||||||
@ -425,10 +428,13 @@ tags: |
|
|||||||
type=match,"pattern=\d{1,3}.\d{1,3}.\d{1,3}"
|
type=match,"pattern=\d{1,3}.\d{1,3}.\d{1,3}"
|
||||||
# define match group
|
# define match group
|
||||||
type=match,pattern=v(.*),group=1
|
type=match,pattern=v(.*),group=1
|
||||||
|
# use custom value instead of git tag
|
||||||
|
type=match,pattern=v(.*),group=1,value=v1.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
Can create a regular expression for matching Git tag with a pattern and capturing group. Will be used on a
|
Can create a regular expression for matching Git tag with a pattern and capturing group. Will be used on a
|
||||||
[push tag event](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#push).
|
[push tag event](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#push) but you can also use
|
||||||
|
a custom value through `value` attribute.
|
||||||
|
|
||||||
| Git tag | Pattern | Group | Output |
|
| Git tag | Pattern | Group | Output |
|
||||||
|-------------------------|-------------------------------|---------|------------------------|
|
|-------------------------|-------------------------------|---------|------------------------|
|
||||||
@ -441,7 +447,7 @@ Extended attributes and default values:
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
tags: |
|
tags: |
|
||||||
type=group,enable=true,priority=800,prefix=,suffix=,pattern=,group=0
|
type=group,enable=true,priority=800,prefix=,suffix=,pattern=,group=0,value=
|
||||||
```
|
```
|
||||||
|
|
||||||
### `type=edge`
|
### `type=edge`
|
||||||
|
@ -496,6 +496,68 @@ describe('push', () => {
|
|||||||
"org.opencontainers.image.licenses=MIT"
|
"org.opencontainers.image.licenses=MIT"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
'push14',
|
||||||
|
'event_push_defbranch.env',
|
||||||
|
{
|
||||||
|
images: ['user/app'],
|
||||||
|
tags: [
|
||||||
|
`type=semver,pattern={{version}},value=v1.2.3`,
|
||||||
|
`type=edge`
|
||||||
|
],
|
||||||
|
} as Inputs,
|
||||||
|
{
|
||||||
|
main: '1.2.3',
|
||||||
|
partial: ['edge'],
|
||||||
|
latest: true
|
||||||
|
} as Version,
|
||||||
|
[
|
||||||
|
'user/app:1.2.3',
|
||||||
|
'user/app:edge',
|
||||||
|
'user/app: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=1.2.3",
|
||||||
|
"org.opencontainers.image.created=2020-01-10T00:30:00.000Z",
|
||||||
|
"org.opencontainers.image.revision=90dd6032fac8bda1b6c4436a2e65de27961ed071",
|
||||||
|
"org.opencontainers.image.licenses=MIT"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'push15',
|
||||||
|
'event_push_defbranch.env',
|
||||||
|
{
|
||||||
|
images: ['user/app'],
|
||||||
|
tags: [
|
||||||
|
`type=match,pattern=v(.*),group=1,value=v1.2.3`,
|
||||||
|
`type=edge`
|
||||||
|
],
|
||||||
|
} as Inputs,
|
||||||
|
{
|
||||||
|
main: '1.2.3',
|
||||||
|
partial: ['edge'],
|
||||||
|
latest: true
|
||||||
|
} as Version,
|
||||||
|
[
|
||||||
|
'user/app:1.2.3',
|
||||||
|
'user/app:edge',
|
||||||
|
'user/app: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=1.2.3",
|
||||||
|
"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);
|
])('given %p with %p event', tagsLabelsTest);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -33,7 +33,8 @@ describe('transform', () => {
|
|||||||
"enable": "true",
|
"enable": "true",
|
||||||
"prefix": "",
|
"prefix": "",
|
||||||
"suffix": "",
|
"suffix": "",
|
||||||
"pattern": "{{version}}"
|
"pattern": "{{version}}",
|
||||||
|
"value": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -44,7 +45,8 @@ describe('transform', () => {
|
|||||||
"prefix": "",
|
"prefix": "",
|
||||||
"suffix": "",
|
"suffix": "",
|
||||||
"pattern": "\\d{1,3}.\\d{1,3}.\\d{1,3}",
|
"pattern": "\\d{1,3}.\\d{1,3}.\\d{1,3}",
|
||||||
"group": "0"
|
"group": "0",
|
||||||
|
"value": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -149,7 +151,8 @@ describe('parse', () => {
|
|||||||
"enable": "true",
|
"enable": "true",
|
||||||
"prefix": "",
|
"prefix": "",
|
||||||
"suffix": "",
|
"suffix": "",
|
||||||
"pattern": "{{version}}"
|
"pattern": "{{version}}",
|
||||||
|
"value": ""
|
||||||
}
|
}
|
||||||
} as Tag,
|
} as Tag,
|
||||||
false
|
false
|
||||||
@ -163,7 +166,23 @@ describe('parse', () => {
|
|||||||
"enable": "true",
|
"enable": "true",
|
||||||
"prefix": "",
|
"prefix": "",
|
||||||
"suffix": "",
|
"suffix": "",
|
||||||
"pattern": "{{version}}"
|
"pattern": "{{version}}",
|
||||||
|
"value": ""
|
||||||
|
}
|
||||||
|
} as Tag,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
[
|
||||||
|
`type=semver,priority=1,enable=true,pattern={{version}},value=v1.0.0`,
|
||||||
|
{
|
||||||
|
type: Type.Semver,
|
||||||
|
attrs: {
|
||||||
|
"priority": "1",
|
||||||
|
"enable": "true",
|
||||||
|
"prefix": "",
|
||||||
|
"suffix": "",
|
||||||
|
"pattern": "{{version}}",
|
||||||
|
"value": "v1.0.0"
|
||||||
}
|
}
|
||||||
} as Tag,
|
} as Tag,
|
||||||
false
|
false
|
||||||
@ -178,7 +197,8 @@ describe('parse', () => {
|
|||||||
"prefix": "",
|
"prefix": "",
|
||||||
"suffix": "",
|
"suffix": "",
|
||||||
"pattern": "v(.*)",
|
"pattern": "v(.*)",
|
||||||
"group": "1"
|
"group": "1",
|
||||||
|
"value": ""
|
||||||
}
|
}
|
||||||
} as Tag,
|
} as Tag,
|
||||||
false
|
false
|
||||||
@ -193,7 +213,8 @@ describe('parse', () => {
|
|||||||
"prefix": "",
|
"prefix": "",
|
||||||
"suffix": "",
|
"suffix": "",
|
||||||
"pattern": "^v(\\d{1,3}.\\d{1,3}.\\d{1,3})$",
|
"pattern": "^v(\\d{1,3}.\\d{1,3}.\\d{1,3})$",
|
||||||
"group": "1"
|
"group": "1",
|
||||||
|
"value": ""
|
||||||
}
|
}
|
||||||
} as Tag,
|
} as Tag,
|
||||||
false
|
false
|
||||||
@ -208,7 +229,24 @@ describe('parse', () => {
|
|||||||
"prefix": "",
|
"prefix": "",
|
||||||
"suffix": "",
|
"suffix": "",
|
||||||
"pattern": "v(.*)",
|
"pattern": "v(.*)",
|
||||||
"group": "1"
|
"group": "1",
|
||||||
|
"value": ""
|
||||||
|
}
|
||||||
|
} as Tag,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
[
|
||||||
|
`type=match,enable=true,pattern=v(.*),group=1,value=v1.2.3`,
|
||||||
|
{
|
||||||
|
type: Type.Match,
|
||||||
|
attrs: {
|
||||||
|
"priority": DefaultPriorities[Type.Match],
|
||||||
|
"enable": "true",
|
||||||
|
"prefix": "",
|
||||||
|
"suffix": "",
|
||||||
|
"pattern": "v(.*)",
|
||||||
|
"group": "1",
|
||||||
|
"value": "v1.2.3"
|
||||||
}
|
}
|
||||||
} as Tag,
|
} as Tag,
|
||||||
false
|
false
|
||||||
|
26
dist/index.js
generated
vendored
26
dist/index.js
generated
vendored
@ -418,10 +418,16 @@ class Meta {
|
|||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
procSemver(version, tag) {
|
procSemver(version, tag) {
|
||||||
if (!/^refs\/tags\//.test(this.context.ref)) {
|
if (!/^refs\/tags\//.test(this.context.ref) && tag.attrs['value'].length == 0) {
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
let vraw = this.context.ref.replace(/^refs\/tags\//g, '').replace(/\//g, '-');
|
let vraw;
|
||||||
|
if (tag.attrs['value'].length > 0) {
|
||||||
|
vraw = tag.attrs['value'];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vraw = this.context.ref.replace(/^refs\/tags\//g, '').replace(/\//g, '-');
|
||||||
|
}
|
||||||
if (!semver.valid(vraw)) {
|
if (!semver.valid(vraw)) {
|
||||||
core.warning(`${vraw} is not a valid semver. More info: https://semver.org/`);
|
core.warning(`${vraw} is not a valid semver. More info: https://semver.org/`);
|
||||||
return version;
|
return version;
|
||||||
@ -455,10 +461,16 @@ class Meta {
|
|||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
procMatch(version, tag) {
|
procMatch(version, tag) {
|
||||||
if (!/^refs\/tags\//.test(this.context.ref)) {
|
if (!/^refs\/tags\//.test(this.context.ref) && tag.attrs['value'].length == 0) {
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
let vraw = this.context.ref.replace(/^refs\/tags\//g, '').replace(/\//g, '-');
|
let vraw;
|
||||||
|
if (tag.attrs['value'].length > 0) {
|
||||||
|
vraw = tag.attrs['value'];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vraw = this.context.ref.replace(/^refs\/tags\//g, '').replace(/\//g, '-');
|
||||||
|
}
|
||||||
let latest = false;
|
let latest = false;
|
||||||
let tmatch;
|
let tmatch;
|
||||||
const isRegEx = tag.attrs['pattern'].match(/^\/(.+)\/(.*)$/);
|
const isRegEx = tag.attrs['pattern'].match(/^\/(.+)\/(.*)$/);
|
||||||
@ -766,6 +778,9 @@ function Parse(s) {
|
|||||||
if (!tag.attrs.hasOwnProperty('pattern')) {
|
if (!tag.attrs.hasOwnProperty('pattern')) {
|
||||||
throw new Error(`Missing pattern attribute for ${s}`);
|
throw new Error(`Missing pattern attribute for ${s}`);
|
||||||
}
|
}
|
||||||
|
if (!tag.attrs.hasOwnProperty('value')) {
|
||||||
|
tag.attrs['value'] = '';
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Type.Match: {
|
case Type.Match: {
|
||||||
@ -778,6 +793,9 @@ function Parse(s) {
|
|||||||
if (isNaN(+tag.attrs['group'])) {
|
if (isNaN(+tag.attrs['group'])) {
|
||||||
throw new Error(`Invalid match group for ${s}`);
|
throw new Error(`Invalid match group for ${s}`);
|
||||||
}
|
}
|
||||||
|
if (!tag.attrs.hasOwnProperty('value')) {
|
||||||
|
tag.attrs['value'] = '';
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Type.Edge: {
|
case Type.Edge: {
|
||||||
|
20
src/meta.ts
20
src/meta.ts
@ -115,10 +115,16 @@ export class Meta {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private procSemver(version: Version, tag: tcl.Tag): Version {
|
private procSemver(version: Version, tag: tcl.Tag): Version {
|
||||||
if (!/^refs\/tags\//.test(this.context.ref)) {
|
if (!/^refs\/tags\//.test(this.context.ref) && tag.attrs['value'].length == 0) {
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
let vraw = this.context.ref.replace(/^refs\/tags\//g, '').replace(/\//g, '-');
|
|
||||||
|
let vraw: string;
|
||||||
|
if (tag.attrs['value'].length > 0) {
|
||||||
|
vraw = tag.attrs['value'];
|
||||||
|
} else {
|
||||||
|
vraw = this.context.ref.replace(/^refs\/tags\//g, '').replace(/\//g, '-');
|
||||||
|
}
|
||||||
if (!semver.valid(vraw)) {
|
if (!semver.valid(vraw)) {
|
||||||
core.warning(`${vraw} is not a valid semver. More info: https://semver.org/`);
|
core.warning(`${vraw} is not a valid semver. More info: https://semver.org/`);
|
||||||
return version;
|
return version;
|
||||||
@ -152,10 +158,16 @@ export class Meta {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private procMatch(version: Version, tag: tcl.Tag): Version {
|
private procMatch(version: Version, tag: tcl.Tag): Version {
|
||||||
if (!/^refs\/tags\//.test(this.context.ref)) {
|
if (!/^refs\/tags\//.test(this.context.ref) && tag.attrs['value'].length == 0) {
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
let vraw = this.context.ref.replace(/^refs\/tags\//g, '').replace(/\//g, '-');
|
|
||||||
|
let vraw: string;
|
||||||
|
if (tag.attrs['value'].length > 0) {
|
||||||
|
vraw = tag.attrs['value'];
|
||||||
|
} else {
|
||||||
|
vraw = this.context.ref.replace(/^refs\/tags\//g, '').replace(/\//g, '-');
|
||||||
|
}
|
||||||
|
|
||||||
let latest: boolean = false;
|
let latest: boolean = false;
|
||||||
let tmatch;
|
let tmatch;
|
||||||
|
@ -104,6 +104,9 @@ export function Parse(s: string): Tag {
|
|||||||
if (!tag.attrs.hasOwnProperty('pattern')) {
|
if (!tag.attrs.hasOwnProperty('pattern')) {
|
||||||
throw new Error(`Missing pattern attribute for ${s}`);
|
throw new Error(`Missing pattern attribute for ${s}`);
|
||||||
}
|
}
|
||||||
|
if (!tag.attrs.hasOwnProperty('value')) {
|
||||||
|
tag.attrs['value'] = '';
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Type.Match: {
|
case Type.Match: {
|
||||||
@ -116,6 +119,9 @@ export function Parse(s: string): Tag {
|
|||||||
if (isNaN(+tag.attrs['group'])) {
|
if (isNaN(+tag.attrs['group'])) {
|
||||||
throw new Error(`Invalid match group for ${s}`);
|
throw new Error(`Invalid match group for ${s}`);
|
||||||
}
|
}
|
||||||
|
if (!tag.attrs.hasOwnProperty('value')) {
|
||||||
|
tag.attrs['value'] = '';
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Type.Edge: {
|
case Type.Edge: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user