From 326ec1ede4640de347ea27cc178cd37312ad9dbd Mon Sep 17 00:00:00 2001
From: CrazyMax <crazy-max@users.noreply.github.com>
Date: Wed, 1 Sep 2021 16:47:54 +0200
Subject: [PATCH] Test before pushing your image (docs)

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
---
 README.md                         |  2 +
 docs/advanced/test-before-push.md | 64 +++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+)
 create mode 100644 docs/advanced/test-before-push.md

diff --git a/README.md b/README.md
index 7670c33..f77ec79 100644
--- a/README.md
+++ b/README.md
@@ -36,6 +36,7 @@ ___
   * [Local registry](docs/advanced/local-registry.md)
   * [Export image to Docker](docs/advanced/export-docker.md)
   * [Share built image between jobs](docs/advanced/share-image-jobs.md)
+  * [Test your image before pushing it](docs/advanced/test-before-push.md)
   * [Handle tags and labels](docs/advanced/tags-labels.md)
   * [Update DockerHub repo description](docs/advanced/dockerhub-desc.md)
 * [Customizing](#customizing)
@@ -165,6 +166,7 @@ jobs:
 * [Local registry](docs/advanced/local-registry.md)
 * [Export image to Docker](docs/advanced/export-docker.md)
 * [Share built image between jobs](docs/advanced/share-image-jobs.md)
+* [Test your image before pushing it](docs/advanced/test-before-push.md)
 * [Handle tags and labels](docs/advanced/tags-labels.md)
 * [Update DockerHub repo description](docs/advanced/dockerhub-desc.md)
 
diff --git a/docs/advanced/test-before-push.md b/docs/advanced/test-before-push.md
new file mode 100644
index 0000000..6ee9ada
--- /dev/null
+++ b/docs/advanced/test-before-push.md
@@ -0,0 +1,64 @@
+# Test your image before pushing it
+
+In some cases, you might want to validate that the image works as expected
+before pushing it.
+
+The workflow below will be composed of several steps to achieve this:
+* Build and export the image to Docker
+* Test your image
+* Multi-platform build and push the image
+
+```yaml
+name: ci
+
+on:
+  push:
+    branches:
+      - 'master'
+
+env:
+  TEST_TAG: user/myapp:test
+
+jobs:
+  docker:
+    runs-on: ubuntu-latest
+    steps:
+      -
+        name: Checkout
+        uses: actions/checkout@v2
+      -
+        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
+        uses: docker/login-action@v1
+        with:
+          username: ${{ secrets.DOCKERHUB_USERNAME }}
+          password: ${{ secrets.DOCKERHUB_TOKEN }}
+      -
+        name: Build and export to Docker
+        uses: docker/build-push-action@v2
+        with:
+          context: .
+          load: true
+          tags: ${{ env.TEST_TAG }}
+      -
+        name: Test
+        run: |
+          docker run --rm ${{ env.TEST_TAG }}
+      -
+        name: Build and push
+        uses: docker/build-push-action@v2
+        with:
+          context: .
+          platforms: linux/amd64,linux/arm64
+          push: true
+          tags: user/app:latest
+```
+
+> :bulb: Build time will not be increased with this workflow because internal
+> cache for `linux/amd64` will be used from previous step on `Build and push`
+> step so only `linux/arm64` will be actually built.