From 118d1c0705e301203f1522cbf5057f303cd32aa3 Mon Sep 17 00:00:00 2001 From: David Karlsson <35727626+dvdksn@users.noreply.github.com> Date: Thu, 3 Aug 2023 10:19:16 +0200 Subject: [PATCH] build: add example of gha cache mounts workaround Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com> --- build/ci/github-actions/cache.md | 77 ++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/build/ci/github-actions/cache.md b/build/ci/github-actions/cache.md index 04f1944dce..dcf17903bc 100644 --- a/build/ci/github-actions/cache.md +++ b/build/ci/github-actions/cache.md @@ -151,6 +151,83 @@ jobs: ``` {% endraw %} +### Cache mounts + +BuildKit doesn't preserve cache mounts in the GitHub Actions cache by default. +If you wish to put your cache mounts into GitHub Actions cache and reuse it +between builds, you can use a workaround provided by two third-party actions: + +- `overmindtech/buildkit-cache-dance/extract` +- `overmindtech/buildkit-cache-dance/inject` + +These GitHub Actions creates temporary containers to extract and inject the +cache mount data with your Docker build steps. + +The following example shows how to use this workaround with a Go project. + +{% raw %} +```yaml +name: ci +on: push + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v4 + with: + images: YOUR_IMAGE + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + + - name: Go Build Cache for Docker + uses: actions/cache@v3 + with: + path: go-build-cache + key: ${{ runner.os }}-go-build-cache-${{ hashFiles('**/go.sum') }} + + - name: inject go-build-cache into docker + uses: overmindtech/buildkit-cache-dance/inject@main + with: + cache-source: go-build-cache + + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: . + cache-from: type=gha + cache-to: type=gha,mode=max + file: build/package/Dockerfile + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + platforms: linux/amd64,linux/arm64 + + - name: extract go-build-cache from docker + uses: overmindtech/buildkit-cache-dance/extract@main + with: + cache-source: go-build-cache +``` +{% endraw %} + +For more information about this workaround, refer to the +[GitHub repository](https://github.com/overmindtech/buildkit-cache-dance). + ### Local cache > **Warning**