Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0dca12c226 | ||
|
6f270f37d4 | ||
|
2860e42b1f | ||
|
6a86fe1739 | ||
|
86dc87790d | ||
|
b3281c85e6 | ||
|
9ba75ef142 | ||
|
a017e545d7 | ||
|
8adbcfe00d | ||
|
1c9398a965 | ||
|
9fad2f37d6 |
16
.github/workflows/ci.yml
vendored
16
.github/workflows/ci.yml
vendored
@@ -80,6 +80,22 @@ jobs:
|
||||
tag-match: ${{ matrix.tag-match }}
|
||||
tag-match-group: ${{ matrix.tag-match-group }}
|
||||
|
||||
tag-semver:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Docker meta
|
||||
uses: ./
|
||||
with:
|
||||
images: |
|
||||
${{ env.DOCKER_IMAGE }}
|
||||
ghcr.io/name/app
|
||||
tag-semver: |
|
||||
{{raw}}
|
||||
{{version}}
|
||||
{{major}}.{{minor}}.{{patch}}
|
||||
|
||||
docker-push:
|
||||
runs-on: ubuntu-latest
|
||||
services:
|
||||
|
12
CHANGELOG.md
12
CHANGELOG.md
@@ -1,5 +1,17 @@
|
||||
# Changelog
|
||||
|
||||
## 1.8.3 (2020/11/20)
|
||||
|
||||
* Lowercase image name (#16)
|
||||
|
||||
## 1.8.2 (2020/11/18)
|
||||
|
||||
* Remove duplicated tags
|
||||
|
||||
## 1.8.1 (2020/11/18)
|
||||
|
||||
* Missing input in `action.yml`
|
||||
|
||||
## 1.8.0 (2020/11/17)
|
||||
|
||||
* Handle semver tags (#14)
|
||||
|
44
README.md
44
README.md
@@ -271,32 +271,36 @@ generated only if the Git tag matches a regular expression with the [`tag-match`
|
||||
|
||||
### `tag-match` examples
|
||||
|
||||
| Git tag | `tag-match` | `tag-match-group` | Match | Docker tags |
|
||||
|-------------------------|------------------------------------|-------------------|----------------------|---------------------------|
|
||||
| `v1.2.3` | `\d{1,3}.\d{1,3}.\d{1,3}` | `0` | :white_check_mark: | `1.2.3`, `latest` |
|
||||
| `v2.0.8-beta.67` | `v(.*)` | `1` | :white_check_mark: | `2.0.8-beta.67`, `latest` |
|
||||
| `v2.0.8-beta.67` | `v(\d.\d)` | `1` | :white_check_mark: | `2.0`, `latest` |
|
||||
| `release1` | `\d{1,3}.\d{1,3}` | `0` | :x: | `release1` |
|
||||
| `20200110-RC2` | `\d+` | `0` | :white_check_mark: | `20200110`, `latest` |
|
||||
| Git tag | `tag-match` | `tag-match-group` | Match | Output tags | Output version |
|
||||
|-------------------------|------------------------------------|-------------------|----------------------|---------------------------|------------------------------|
|
||||
| `v1.2.3` | `\d{1,3}.\d{1,3}.\d{1,3}` | `0` | :white_check_mark: | `1.2.3`, `latest` | `1.2.3` |
|
||||
| `v2.0.8-beta.67` | `v(.*)` | `1` | :white_check_mark: | `2.0.8-beta.67`, `latest` | `2.0.8-beta.67` |
|
||||
| `v2.0.8-beta.67` | `v(\d.\d)` | `1` | :white_check_mark: | `2.0`, `latest` | `2.0` |
|
||||
| `release1` | `\d{1,3}.\d{1,3}` | `0` | :x: | `release1` | `release1` |
|
||||
| `20200110-RC2` | `\d+` | `0` | :white_check_mark: | `20200110`, `latest` | `20200110` |
|
||||
|
||||
### Handle semver tag
|
||||
|
||||
If Git tag is a valid [semver](https://semver.org/) you can handle it to output multi Docker tags at once.
|
||||
`tag-semver` supports multi-line [Handlebars template](https://handlebarsjs.com/guide/) with the following inputs:
|
||||
|
||||
| Git tag | `tag-semver` | Valid | Docker tags |
|
||||
|--------------------|----------------------------------------------------------|--------------------|--------------------|
|
||||
| `v1.2.3` | `{{raw}}` | :white_check_mark: | `v1.2.3`, `latest` |
|
||||
| `v1.2.3` | `{{version}}` | :white_check_mark: | `1.2.3`, `latest` |
|
||||
| `v1.2.3` | `{{major}}.{{minor}}` | :white_check_mark: | `1.2`, `latest` |
|
||||
| `v1.2.3` | `v{{major}}` | :white_check_mark: | `v1`, `latest` |
|
||||
| `v1.2.3` | `{{minor}}` | :white_check_mark: | `2`, `latest` |
|
||||
| `v1.2.3` | `{{patch}}` | :white_check_mark: | `3`, `latest` |
|
||||
| `v1.2.3` | `{{major}}.{{minor}}`<br>`{{major}}.{{minor}}.{{patch}}` | :white_check_mark: | `1.2`, `1.2.3`, `latest` |
|
||||
| `v2.0.8-beta.67` | `{{raw}}` | :white_check_mark: | `v2.0.8-beta.67` |
|
||||
| `v2.0.8-beta.67` | `{{version}}` | :white_check_mark: | `2.0.8-beta.67` |
|
||||
| `v2.0.8-beta.67` | `{{major}}.{{minor}}` | :white_check_mark: | `2.0` |
|
||||
| `release1` | `{{raw}}` | :x: | `release1` |
|
||||
| Git tag | `tag-semver` | Valid | Output tags | Output version |
|
||||
|--------------------|----------------------------------------------------------|--------------------|----------------------------|------------------------------|
|
||||
| `v1.2.3` | `{{raw}}` | :white_check_mark: | `v1.2.3`, `latest` | `v1.2.3` |
|
||||
| `v1.2.3` | `{{version}}` | :white_check_mark: | `1.2.3`, `latest` | `1.2.3` |
|
||||
| `v1.2.3` | `{{major}}.{{minor}}` | :white_check_mark: | `1.2`, `latest` | `1.2` |
|
||||
| `v1.2.3` | `v{{major}}` | :white_check_mark: | `v1`, `latest` | `v1` |
|
||||
| `v1.2.3` | `{{minor}}` | :white_check_mark: | `2`, `latest` | `2` |
|
||||
| `v1.2.3` | `{{patch}}` | :white_check_mark: | `3`, `latest` | `3` |
|
||||
| `v1.2.3` | `{{major}}.{{minor}}`<br>`{{major}}.{{minor}}.{{patch}}` | :white_check_mark: | `1.2`, `1.2.3`, `latest` | `1.2`* |
|
||||
| `v2.0.8-beta.67` | `{{raw}}` | :white_check_mark: | `2.0.8-beta.67` | `2.0.8-beta.67` |
|
||||
| `v2.0.8-beta.67` | `{{version}}` | :white_check_mark: | `2.0.8-beta.67` | `2.0.8-beta.67` |
|
||||
| `v2.0.8-beta.67` | `{{major}}.{{minor}}` | :white_check_mark: | `2.0.8-beta.67`** | `2.0.8-beta.67` |
|
||||
| `release1` | `{{raw}}` | :x: | `release1` | `release1` |
|
||||
|
||||
> *First occurrence of `tag-semver` will be taken as `output.version`
|
||||
|
||||
> **Pre-release (rc, beta, alpha) will only extend `{{version}}` as tag
|
||||
|
||||
### Schedule tag
|
||||
|
||||
|
@@ -683,6 +683,34 @@ describe('push tag', () => {
|
||||
"org.opencontainers.image.licenses=MIT"
|
||||
]
|
||||
],
|
||||
[
|
||||
'event_tag_v1.1.1.env',
|
||||
{
|
||||
images: ['org/app', 'ghcr.io/user/app'],
|
||||
tagSemver: ['{{version}}', '{{major}}.{{minor}}.{{patch}}'],
|
||||
} as Inputs,
|
||||
{
|
||||
main: '1.1.1',
|
||||
partial: [],
|
||||
latest: true
|
||||
} as Version,
|
||||
[
|
||||
'org/app:1.1.1',
|
||||
'org/app:latest',
|
||||
'ghcr.io/user/app:1.1.1',
|
||||
'ghcr.io/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.1.1",
|
||||
"org.opencontainers.image.created=2020-01-10T00:30:00.000Z",
|
||||
"org.opencontainers.image.revision=90dd6032fac8bda1b6c4436a2e65de27961ed071",
|
||||
"org.opencontainers.image.licenses=MIT"
|
||||
]
|
||||
],
|
||||
[
|
||||
'event_tag_v2.0.8-beta.67.env',
|
||||
{
|
||||
@@ -900,6 +928,32 @@ describe('latest', () => {
|
||||
"org.opencontainers.image.licenses=MIT"
|
||||
]
|
||||
],
|
||||
[
|
||||
'event_tag_v1.1.1.env',
|
||||
{
|
||||
images: ['org/app', 'ghcr.io/MyUSER/MyApp'],
|
||||
tagMatchLatest: false,
|
||||
} as Inputs,
|
||||
{
|
||||
main: 'v1.1.1',
|
||||
partial: [],
|
||||
latest: false
|
||||
} as Version,
|
||||
[
|
||||
'org/app:v1.1.1',
|
||||
'ghcr.io/myuser/myapp:v1.1.1',
|
||||
],
|
||||
[
|
||||
"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",
|
||||
"org.opencontainers.image.created=2020-01-10T00:30:00.000Z",
|
||||
"org.opencontainers.image.revision=90dd6032fac8bda1b6c4436a2e65de27961ed071",
|
||||
"org.opencontainers.image.licenses=MIT"
|
||||
]
|
||||
],
|
||||
])('given %p event ', tagsLabelsTest);
|
||||
});
|
||||
|
||||
|
@@ -21,6 +21,9 @@ inputs:
|
||||
tag-edge-branch:
|
||||
description: 'Branch that will be tagged as edge (default repo.default_branch)'
|
||||
required: false
|
||||
tag-semver:
|
||||
description: 'Handle Git tag as semver template if possible'
|
||||
required: false
|
||||
tag-match:
|
||||
description: 'RegExp to match against a Git tag and use match group as Docker tag'
|
||||
required: false
|
||||
|
10
dist/index.js
generated
vendored
10
dist/index.js
generated
vendored
@@ -240,6 +240,7 @@ class Meta {
|
||||
else if (/^refs\/pull\//.test(this.context.ref)) {
|
||||
version.main = `pr-${this.context.ref.replace(/^refs\/pull\//g, '').replace(/\/merge$/g, '')}`;
|
||||
}
|
||||
version.partial = version.partial.filter((item, index) => version.partial.indexOf(item) === index);
|
||||
return version;
|
||||
}
|
||||
tags() {
|
||||
@@ -249,15 +250,16 @@ class Meta {
|
||||
}
|
||||
let tags = [];
|
||||
for (const image of this.inputs.images) {
|
||||
tags.push(`${image}:${version.main}`);
|
||||
const imageLc = image.toLowerCase();
|
||||
tags.push(`${imageLc}:${version.main}`);
|
||||
for (const partial of version.partial) {
|
||||
tags.push(`${image}:${partial}`);
|
||||
tags.push(`${imageLc}:${partial}`);
|
||||
}
|
||||
if (version.latest) {
|
||||
tags.push(`${image}:latest`);
|
||||
tags.push(`${imageLc}:latest`);
|
||||
}
|
||||
if (this.context.sha && this.inputs.tagSha) {
|
||||
tags.push(`${image}:sha-${this.context.sha.substr(0, 7)}`);
|
||||
tags.push(`${imageLc}:sha-${this.context.sha.substr(0, 7)}`);
|
||||
}
|
||||
}
|
||||
return tags;
|
||||
|
10
src/meta.ts
10
src/meta.ts
@@ -82,6 +82,7 @@ export class Meta {
|
||||
version.main = `pr-${this.context.ref.replace(/^refs\/pull\//g, '').replace(/\/merge$/g, '')}`;
|
||||
}
|
||||
|
||||
version.partial = version.partial.filter((item, index) => version.partial.indexOf(item) === index);
|
||||
return version;
|
||||
}
|
||||
|
||||
@@ -93,15 +94,16 @@ export class Meta {
|
||||
|
||||
let tags: Array<string> = [];
|
||||
for (const image of this.inputs.images) {
|
||||
tags.push(`${image}:${version.main}`);
|
||||
const imageLc = image.toLowerCase();
|
||||
tags.push(`${imageLc}:${version.main}`);
|
||||
for (const partial of version.partial) {
|
||||
tags.push(`${image}:${partial}`);
|
||||
tags.push(`${imageLc}:${partial}`);
|
||||
}
|
||||
if (version.latest) {
|
||||
tags.push(`${image}:latest`);
|
||||
tags.push(`${imageLc}:latest`);
|
||||
}
|
||||
if (this.context.sha && this.inputs.tagSha) {
|
||||
tags.push(`${image}:sha-${this.context.sha.substr(0, 7)}`);
|
||||
tags.push(`${imageLc}:sha-${this.context.sha.substr(0, 7)}`);
|
||||
}
|
||||
}
|
||||
return tags;
|
||||
|
Reference in New Issue
Block a user