Cache Cloud Native Buildpacks/Paketo.io pack CLI builds on GitHub Actions (e.g. with Spring Boot/Java/Maven buildpacks)? Cache Cloud Native Buildpacks/Paketo.io pack CLI builds on GitHub Actions (e.g. with Spring Boot/Java/Maven buildpacks)? docker docker

Cache Cloud Native Buildpacks/Paketo.io pack CLI builds on GitHub Actions (e.g. with Spring Boot/Java/Maven buildpacks)?


Caching the Docker images on GitHub Actions might be an option - which doesn't seem to be that easy. Another option would be to leverage the Docker official docker/build-push-action Action, which is able to cache the buildx-cache. But I didn't get the combination of pack CLI and buildx-caching to work (see this build for example).

Finally I stumbled upon the general Cloud Native Buildpacks approach on how to cache in the docs:

Cache Images are a way to preserve build optimizing layers acrossdifferent host machines. These images can improve performance whenusing pack in ephemeral environments such as CI/CD pipelines.

I found this concept quite nice, since it uses a second cache image, which gets published on a container registry of your choice. And this image is simply used for all Paketo pack CLI builds on every machine you append the --cache-image parameter - be it your local desktop or any CI/CD platform (like GitHub Actions).

In order to use the --cache-image parameter, we also have to use the --publish flag (since the cache image needs to get published to your container registry!). This also means we need to log into the container registry before we're able to run our pack CLI command. Using Docker Hub this is something like:

echo $DOCKER_HUB_TOKEN | docker login -u YourUserNameHere --password-stdin

Also the Paketo builder image must be a trusted one. As the docs state:

By default, any builder suggested by pack builder suggest isconsidered trusted.

Since I use a suggested builder, I don't have to do anything here. If you want to use another builder that isn't trusted by default, you need to run a pack config trusted-builders add your/builder-to-trust:bionic command before the final pack CLI command.

Here's the pack CLI command, which is cache enabled in case you want to build a Spring Boot app and using Docker Hub as the container registry:

      pack build index.docker.io/yourApplicationImageNameHere:latest \          --builder paketobuildpacks/builder:base \          --path . \          --cache-image index.docker.io/yourCacheImageNameHere:latest \          --publish

Finally the GitHub Action workflow to build and publish the example Spring Boot app https://github.com/jonashackt/spring-boot-buildpack looks like this:

name: buildon: [push]jobs:  build-with-paketo-push-2-dockerhub:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v2      - name: Login to DockerHub Container Registry        run: echo $DOCKER_HUB_TOKEN | docker login -u jonashackt --password-stdin        env:          DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN }}      - name: Install pack CLI via the official buildpack Action https://github.com/buildpacks/github-actions#setup-pack-cli-action        uses: buildpacks/github-actions/setup-pack@v4.1.0      - name: Build app with pack CLI using Buildpack Cache image (see https://buildpacks.io/docs/app-developer-guide/using-cache-image/) & publish to Docker Hub        run: |          pack build index.docker.io/jonashackt/spring-boot-buildpack:latest \              --builder paketobuildpacks/builder:base \              --path . \              --cache-image index.docker.io/jonashackt/spring-boot-buildpack-paketo-cache-image:latest \              --publish

Note that with using the pack CLI's --publish flag, we also don't need an extra step Tag & publish to Docker Hub anymore. Since this is done by pack CLI for us already.