From 83b2aeab4738d1d68986bb3ad54dee57d64358a5 Mon Sep 17 00:00:00 2001
From: CrazyMax <crazy-max@users.noreply.github.com>
Date: Thu, 10 Sep 2020 22:24:13 +0200
Subject: [PATCH] Add tags handling example

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
---
 README.md | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 78 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 89db5db..9551623 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,7 @@ ___
   * [Multi-platform image](#multi-platform-image)
   * [Local registry](#local-registry)
   * [Leverage GitHub cache](#leverage-github-cache)
+  * [Tags handling](#tags-handling)
   * [Complete workflow](#complete-workflow)
   * [Update DockerHub repo description](#update-dockerhub-repo-description)
 * [Customizing](#customizing)
@@ -297,6 +298,81 @@ jobs:
           cache-to: type=local,dest=/tmp/.buildx-cache
 ```
 
+### Tags handling
+
+If you come from [`v1`](https://github.com/docker/build-push-action/tree/releases/v1#readme) and you want an
+"automatic" tag management through Git reference, you will have to do it in a dedicated step [for now](https://github.com/docker/build-push-action/issues/116).
+
+The workflow below with the `Prepare` step will generate a
+[`tags` output](https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjobs_idoutputs):
+
+* On `pull_request` event with `refs/pull/2/merge` ref and `a123b57` sha:
+  * `user/app:pr-2`
+* On `push` event with `refs/heads/master` ref and `676cae2` sha:
+  * `user/app:sha-676cae2`
+  * `user/app:edge`
+* On `push` event with `refs/heads/dev` ref and `cf20257` sha:
+  * `user/app:sha-cf20257`
+  * `user/app:dev`
+* On `push tags` event with `refs/tags/v1.2.3` ref and `9258794` sha:
+  * `user/app:sha-9258794`
+  * `user/app:v1.2.3`
+  * `user/app:v1.2`
+  * `user/app:v1`
+  * `user/app:latest`
+
+```yaml
+name: ci
+
+on:
+  push:
+    branches: master
+    tags:
+      - 'v*.*.*'
+  pull_request:
+    branches: master
+
+jobs:
+  docker:
+    runs-on: ubuntu-latest
+    steps:
+      -
+        name: Checkout
+        uses: actions/checkout@v2
+      -
+        name: Prepare
+        id: prep
+        run: |
+          DOCKER_IMAGE=name/app
+          VERSION=edge
+          if [[ $GITHUB_REF == refs/tags/* ]]; then
+            VERSION=${GITHUB_REF#refs/tags/}
+          fi
+          if [ "${{ github.event_name }}" = "pull_request" ]; then
+            TAGS="${DOCKER_IMAGE}:pr-${{ github.event.number }}"
+          else
+            TAGS="${DOCKER_IMAGE}:${VERSION}"
+            TAGS="${DOCKER_IMAGE}:sha-${GITHUB_SHA::8}"
+          fi
+          if [[ $VERSION =~ ^v[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+            MINOR=${VERSION%.*}
+            MAJOR=${MINOR%.*}
+            TAGS="$TAGS,${DOCKER_IMAGE}:${MINOR},${DOCKER_IMAGE}:${MAJOR},${DOCKER_IMAGE}:latest"
+          fi
+          echo ::set-output name=tags::${TAGS}
+      -
+        name: Set up Docker Buildx
+        uses: docker/setup-buildx-action@v1
+      -
+        name: Build and push
+        id: docker_build
+        uses: docker/build-push-action@v2
+        with:
+          context: .
+          file: ./Dockerfile
+          tags: ${{ steps.prep.outputs.tags }}
+```
+
 ### Complete workflow
 
 * On `pull_request` event, Docker image `name/app:edge` is **built**.
@@ -331,13 +407,13 @@ jobs:
           DOCKER_IMAGE=name/app
           VERSION=edge
           if [[ $GITHUB_REF == refs/tags/* ]]; then
-            VERSION=${GITHUB_REF#refs/tags/v}
+            VERSION=${GITHUB_REF#refs/tags/}
           fi
           if [ "${{ github.event_name }}" = "schedule" ]; then
             VERSION=nightly
           fi
           TAGS="${DOCKER_IMAGE}:${VERSION}"
-          if [[ $VERSION =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+          if [[ $VERSION =~ ^v[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
             TAGS="$TAGS,${DOCKER_IMAGE}:latest"
           fi
           echo ::set-output name=tags::${TAGS}
@@ -356,7 +432,6 @@ jobs:
           password: ${{ secrets.DOCKERHUB_TOKEN }}
       -
         name: Build and push
-        id: docker_build
         uses: docker/build-push-action@v2
         with:
           context: .