2020-10-25 01:25:23 +00:00
[![GitHub release ](https://img.shields.io/github/release/crazy-max/ghaction-docker-meta.svg?style=flat-square )](https://github.com/crazy-max/ghaction-docker-meta/releases/latest)
[![GitHub marketplace ](https://img.shields.io/badge/marketplace-docker--meta-blue?logo=github&style=flat-square )](https://github.com/marketplace/actions/docker-meta)
[![Test workflow ](https://img.shields.io/github/workflow/status/crazy-max/ghaction-docker-meta/test?label=test&logo=github&style=flat-square )](https://github.com/crazy-max/ghaction-docker-meta/actions?workflow=test)
[![Codecov ](https://img.shields.io/codecov/c/github/crazy-max/ghaction-docker-meta?logo=codecov&style=flat-square )](https://codecov.io/gh/crazy-max/ghaction-docker-meta)
[![Become a sponsor ](https://img.shields.io/badge/sponsor-crazy--max-181717.svg?logo=github&style=flat-square )](https://github.com/sponsors/crazy-max)
[![Paypal Donate ](https://img.shields.io/badge/donate-paypal-00457c.svg?logo=paypal&style=flat-square )](https://www.paypal.me/crazyws)
## About
GitHub Action to extract metadata (tags, labels) for Docker. This action is particularly useful if used with
[Docker Build Push ](https://github.com/docker/build-push-action ) action.
If you are interested, [check out ](https://git.io/Je09Y ) my other :octocat: GitHub Actions!
2020-10-25 02:21:46 +00:00
![Screenshot ](.github/ghaction-docker-meta.png )
2020-10-25 01:25:23 +00:00
___
* [Usage ](#usage )
2020-11-17 22:31:03 +00:00
* [Basic ](#basic )
* [Semver ](#semver )
2020-12-24 03:13:41 +00:00
* [Bake definition ](#bake-definition )
2020-10-25 01:25:23 +00:00
* [Customizing ](#customizing )
* [inputs ](#inputs )
* [outputs ](#outputs )
2020-10-25 14:13:43 +00:00
* [Notes ](#notes )
2020-10-28 17:25:31 +00:00
* [Latest tag ](#latest-tag )
2020-11-17 22:31:03 +00:00
* [Handle semver tag ](#handle-semver-tag )
2020-11-20 22:12:14 +00:00
* [`tag-match` examples ](#tag-match-examples )
2020-10-26 16:51:00 +00:00
* [Schedule tag ](#schedule-tag )
2020-10-27 13:13:48 +00:00
* [Overwrite labels ](#overwrite-labels )
2020-10-25 01:25:23 +00:00
* [Keep up-to-date with GitHub Dependabot ](#keep-up-to-date-with-github-dependabot )
2020-12-23 21:09:38 +00:00
* [Contributing ](#contributing )
2020-10-25 01:25:23 +00:00
* [License ](#license )
2020-11-17 22:31:03 +00:00
## Usage
### Basic
2020-10-25 14:17:39 +00:00
| Event | Ref | Commit SHA | Docker Tags |
2020-10-26 00:51:56 +00:00
|-----------------|-------------------------------|------------|-------------------------------------|
2020-11-17 22:31:03 +00:00
| `pull_request` | `refs/pull/2/merge` | `a123b57` | `pr-2` |
| `push` | `refs/heads/master` | `cf20257` | `master` |
| `push` | `refs/heads/my/branch` | `a5df687` | `my-branch` |
| `push tag` | `refs/tags/v1.2.3` | `ad132f5` | `v1.2.3` , `latest` |
| `push tag` | `refs/tags/v2.0.8-beta.67` | `fc89efd` | `v2.0.8-beta.67` , `latest` |
2020-10-25 01:25:23 +00:00
2020-11-17 22:31:03 +00:00
```yaml
name: ci
on:
push:
branches:
- '**'
tags:
- 'v*'
pull_request:
jobs:
docker:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Docker meta
id: docker_meta
uses: crazy-max/ghaction-docker-meta@v1
with:
images: name/app
-
name: Set up QEMU
uses: docker/setup-qemu-action@v1
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Login to DockerHub
if: github.event_name != 'pull_request'
2020-12-24 03:13:41 +00:00
uses: docker/login-action@v1
2020-11-17 22:31:03 +00:00
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64,linux/386
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.docker_meta.outputs.tags }}
labels: ${{ steps.docker_meta.outputs.labels }}
```
### Semver
| Event | Ref | Commit SHA | Docker Tags |
|-----------------|-------------------------------|------------|-------------------------------------|
| `pull_request` | `refs/pull/2/merge` | `a123b57` | `pr-2` |
| `push` | `refs/heads/master` | `cf20257` | `master` |
| `push` | `refs/heads/my/branch` | `a5df687` | `my-branch` |
| `push tag` | `refs/tags/v1.2.3` | `ad132f5` | `1.2.3` , `1.2` , `latest` |
| `push tag` | `refs/tags/v2.0.8-beta.67` | `fc89efd` | `2.0.8-beta.67` |
```yaml
name: ci
on:
push:
branches:
- '**'
tags:
- 'v*'
pull_request:
jobs:
docker:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Docker meta
id: docker_meta
uses: crazy-max/ghaction-docker-meta@v1
with:
images: name/app
tag-semver: |
{{version}}
{{major}}.{{minor}}
-
name: Set up QEMU
uses: docker/setup-qemu-action@v1
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Login to DockerHub
if: github.event_name != 'pull_request'
2020-12-24 03:13:41 +00:00
uses: docker/login-action@v1
2020-11-17 22:31:03 +00:00
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64,linux/386
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.docker_meta.outputs.tags }}
labels: ${{ steps.docker_meta.outputs.labels }}
```
2020-12-24 03:13:41 +00:00
### Bake definition
2020-11-17 22:31:03 +00:00
2020-12-24 03:13:41 +00:00
This action also handles a bake definition file that can be used with the
2021-02-09 19:54:44 +00:00
[Docker Bake action ](https://github.com/docker/bake-action ). You just have to declare an empty target named
`ghaction-docker-meta` and inherit from it.
2020-12-24 03:13:41 +00:00
```hcl
// docker-bake.hcl
target "ghaction-docker-meta" {}
target "build" {
inherits = ["ghaction-docker-meta"]
context = "./"
dockerfile = "Dockerfile"
platforms = ["linux/amd64", "linux/arm/v6", "linux/arm/v7", "linux/arm64", "linux/386", "linux/ppc64le"]
}
```
2020-10-25 01:25:23 +00:00
```yaml
name: ci
on:
push:
branches:
- '**'
tags:
2020-11-17 22:31:03 +00:00
- 'v*'
2020-10-25 01:25:23 +00:00
pull_request:
jobs:
docker:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Docker meta
id: docker_meta
uses: crazy-max/ghaction-docker-meta@v1
with:
2020-10-26 23:57:32 +00:00
images: name/app
2020-11-24 13:12:22 +00:00
tag-sha: true
2020-11-17 22:31:03 +00:00
tag-semver: |
{{version}}
{{major}}.{{minor}}
2020-10-25 01:25:23 +00:00
-
name: Set up QEMU
uses: docker/setup-qemu-action@v1
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
2020-12-24 03:13:41 +00:00
name: Build
2021-02-09 19:54:44 +00:00
uses: docker/bake-action@v1
2020-10-25 01:25:23 +00:00
with:
2020-12-24 03:13:41 +00:00
files: |
./docker-bake.hcl
${{ steps.docker_meta.outputs.bake-file }}
targets: |
build
2020-10-25 01:25:23 +00:00
```
2020-12-24 13:06:20 +00:00
Content of `${{ steps.docker_meta.outputs.bake-file }}` file will look like this:
```json
{
"target": {
"ghaction-docker-meta": {
"tags": [
"name/app:1.1.1",
"name/app:1.1",
"name/app:latest"
],
"labels": {
"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"
2020-12-24 15:45:28 +00:00
},
"args": {
"DOCKER_META_IMAGES": "name/app",
"DOCKER_META_VERSION": "1.1.1"
2020-12-24 13:06:20 +00:00
}
}
}
}
```
2020-10-25 01:25:23 +00:00
## Customizing
### inputs
Following inputs can be used as `step.with` keys
2020-12-23 21:09:38 +00:00
> `List` type is a newline-delimited string
> ```yaml
> label-custom: |
> org.opencontainers.image.title=MyCustomTitle
> org.opencontainers.image.description=Another description
> org.opencontainers.image.vendor=MyCompany
> ```
> `CSV` type is a comma-delimited string
> ```yaml
> images: name/app,ghcr.io/name/app
> ```
2020-10-25 01:25:23 +00:00
| Name | Type | Description |
|---------------------|----------|------------------------------------|
| `images` | List/CSV | List of Docker images to use as base name for tags |
2020-12-24 03:13:41 +00:00
| `tag-sha` | Bool | Add git short commit as Docker tag (default `false` ) |
2020-10-25 14:32:14 +00:00
| `tag-edge` | Bool | Enable edge branch tagging (default `false` ) |
| `tag-edge-branch` | String | Branch that will be tagged as edge (default `repo.default_branch` ) |
2020-12-01 05:29:34 +00:00
| `tag-semver` | List/CSV | Handle Git tag as semver [template ](#handle-semver-tag ) if possible |
2020-10-27 01:32:26 +00:00
| `tag-match` | String | RegExp to match against a Git tag and use first match as Docker tag |
| `tag-match-group` | Number | Group to get if `tag-match` matches (default `0` ) |
2020-12-01 05:29:34 +00:00
| `tag-latest` | Bool | Set `latest` Docker tag if `tag-semver` , `tag-match` or Git tag event occurs (default `true` ) |
2020-10-26 16:58:13 +00:00
| `tag-schedule` | String | [Template ](#schedule-tag ) to apply to schedule tag (default `nightly` ) |
2020-12-04 17:12:39 +00:00
| `tag-custom` | List/CSV | List of custom tags |
| `tag-custom-only` | Bool | Only use `tag-custom` as Docker tags |
2020-12-23 21:09:38 +00:00
| `label-custom` | List | List of custom labels |
2020-10-25 01:25:23 +00:00
| `sep-tags` | String | Separator to use for tags output (default `\n` ) |
| `sep-labels` | String | Separator to use for labels output (default `\n` ) |
2020-11-20 22:12:14 +00:00
> `tag-semver` and `tag-match` are mutually exclusive
2020-10-25 01:25:23 +00:00
### outputs
Following outputs are available
| Name | Type | Description |
|---------------|---------|---------------------------------------|
2020-12-24 03:13:41 +00:00
| `version` | String | Docker image version |
| `tags` | String | Docker tags |
| `labels` | String | Docker labels |
| `bake-file` | File | [Bake definition file ](https://github.com/docker/buildx#file-definition ) path |
2020-10-25 01:25:23 +00:00
2020-10-25 14:13:43 +00:00
## Notes
2020-10-28 17:25:31 +00:00
### Latest tag
2020-11-17 22:31:03 +00:00
Latest Docker tag will be generated by default on `push tag` event. If for example you push the `v1.2.3` Git tag,
2020-10-28 17:25:31 +00:00
you will have at the output of this action the Docker tags `v1.2.3` and `latest` . But you can allow the latest tag to be
2020-11-20 22:12:14 +00:00
generated only if `tag-semver` is a valid [semver ](https://semver.org/ ) or if Git tag matches a regular expression
2020-12-04 17:12:39 +00:00
with the [`tag-match` input ](#tag-match-examples ). Can be disabled if `tag-latest` is `false` .
2020-10-26 00:39:21 +00:00
2020-11-17 22:31:03 +00:00
### 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:
2020-11-18 00:18:53 +00:00
| 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` |
2020-11-18 16:56:34 +00:00
| `v1.2.3` | `{{major}}.{{minor}}` < br > `{{major}}.{{minor}}.{{patch}}` | :white_check_mark: | `1.2` , `1.2.3` , `latest` | `1.2` * |
2020-11-20 22:12:14 +00:00
| `v2.0.8-beta.67` | `{{raw}}` | :white_check_mark: | `2.0.8-beta.67` ** | `2.0.8-beta.67` |
2020-11-18 00:18:53 +00:00
| `v2.0.8-beta.67` | `{{version}}` | :white_check_mark: | `2.0.8-beta.67` | `2.0.8-beta.67` |
2020-11-18 16:56:34 +00:00
| `v2.0.8-beta.67` | `{{major}}.{{minor}}` | :white_check_mark: | `2.0.8-beta.67` ** | `2.0.8-beta.67` |
2020-11-18 00:18:53 +00:00
| `release1` | `{{raw}}` | :x: | `release1` | `release1` |
2020-11-17 22:31:03 +00:00
2020-11-18 16:56:34 +00:00
> *First occurrence of `tag-semver` will be taken as `output.version`
2020-11-20 22:12:14 +00:00
> **Pre-release (rc, beta, alpha) will only extend `{{version}}` as tag because they are updated frequently,
> and contain many breaking changes that are (by the author's design) not yet fit for public consumption.
### `tag-match` examples
| 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` |
2020-11-18 16:56:34 +00:00
2020-10-26 16:51:00 +00:00
### Schedule tag
2020-10-25 14:13:43 +00:00
`tag-schedule` is specially crafted input to support [Handlebars template ](https://handlebarsjs.com/guide/ ) with
the following expressions:
| Expression | Example | Description |
|-------------------------|-------------------------------------------|------------------------------------------|
2020-12-24 03:13:41 +00:00
| `{{date 'format'}}` | `{{date 'YYYYMMDD'}}` > `20200110` | Render date by its [moment format ](https://momentjs.com/docs/#/displaying/format/ )
2020-10-25 14:13:43 +00:00
You can find more examples in the [CI workflow ](.github/workflows/ci.yml ).
2020-10-27 13:13:48 +00:00
### Overwrite labels
If some of the [OCI Image Format Specification ](https://github.com/opencontainers/image-spec/blob/master/annotations.md )
labels generated are not suitable, you can overwrite them like this:
```yaml
-
2020-12-23 21:09:38 +00:00
name: Docker meta
id: docker_meta
uses: crazy-max/ghaction-docker-meta@v1
2020-10-27 13:13:48 +00:00
with:
2020-12-23 21:09:38 +00:00
images: name/app
label-custom: |
maintainer=CrazyMax
2020-10-27 13:13:48 +00:00
org.opencontainers.image.title=MyCustomTitle
org.opencontainers.image.description=Another description
org.opencontainers.image.vendor=MyCompany
```
2020-10-25 01:25:23 +00:00
## Keep up-to-date with GitHub Dependabot
Since [Dependabot ](https://docs.github.com/en/github/administering-a-repository/keeping-your-actions-up-to-date-with-github-dependabot )
has [native GitHub Actions support ](https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates#package-ecosystem ),
to enable it on your GitHub repo all you need to do is add the `.github/dependabot.yml` file:
```yaml
version: 2
updates:
# Maintain dependencies for GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
```
2020-12-24 03:13:41 +00:00
## Contributing
2020-12-23 21:09:38 +00:00
Want to contribute? Awesome! The most basic way to show your support is to star :star2: the project,
or to raise issues :speech_balloon:. If you want to open a pull request, please read the
[contributing guidelines ](.github/CONTRIBUTING.md ).
2020-10-25 01:25:23 +00:00
2020-12-23 21:09:38 +00:00
You can also support this project by [**becoming a sponsor on GitHub** ](https://github.com/sponsors/crazy-max ) or by
making a [Paypal donation ](https://www.paypal.me/crazyws ) to ensure this journey continues indefinitely!
2020-10-25 01:25:23 +00:00
Thanks again for your support, it is much appreciated! :pray:
## License
MIT. See `LICENSE` for more details.