缓存 Cloud Native Buildpacks/Paketo.io pack CLI 在 GitHub Actions 上构建(例如使用 Spring Boot/Java/Maven buildpacks)?

jon*_*ckt 10 buildpack docker spring-boot github-actions paketo

我正在开发一个 Spring Boot 应用程序,应使用 Cloud Native Build Packs / Paketo.io 将其打包到 OCI 容器中。我使用 GitHub Actions 构建它,我的工作流程build.yml如下所示:

name: build

on: [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 apt. See https://buildpacks.io/docs/tools/pack/#pack-cli
        run: |
          sudo add-apt-repository ppa:cncf-buildpacks/pack-cli
          sudo apt-get update
          sudo apt-get install pack-cli

      - name: Build app with pack CLI
        run: pack build spring-boot-buildpack --path . --builder paketobuildpacks/builder:base

      - name: Tag & publish to Docker Hub
        run: |
          docker tag spring-boot-buildpack jonashackt/spring-boot-buildpack:latest
          docker push jonashackt/spring-boot-buildpack:latest
Run Code Online (Sandbox Code Playgroud)

现在,该步骤Build app with pack CLI需要相对较长的时间,因为它总是下载 Paketo 构建器 Docker 映像,然后进行完整的全新构建。这意味着下载 JDK 和每个 Maven 依赖项。有没有办法在 GitHub Actions 上缓存 Paketo 构建?

jon*_*ckt 10

在 GitHub Actions 上缓存 Docker 镜像可能是一种选择 - 这似乎并不那么容易。另一种选择是利用 Docker 官方docker/build-push-action Action,它能够缓存 buildx-cache。但我没有将 pack CLI 和 buildx-caching 结合起来工作(例如,请参阅此构建)。

最后,我偶然发现了有关如何在文档中进行缓存的通用云原生构建包方法

缓存映像是一种在不同主机上保留构建优化层的方法。在 CI/CD 管道等临时环境中使用 pack 时,这些映像可以提高性能。

我发现这个概念非常好,因为它使用第二个缓存映像,该映像发布在您选择的容器注册表上。此图像仅用于您附加--cache-image参数的每台计算机上的所有 Paketo pack CLI 构建 - 无论是本地桌面还是任何 CI/CD 平台(如 GitHub Actions)。

为了使用该--cache-image参数,我们还必须使用该--publish标志(因为缓存映像需要发布到您的容器注册表!)。这也意味着我们需要先登录容器注册表,然后才能运行 pack CLI 命令。使用 Docker Hub 是这样的:

echo $DOCKER_HUB_TOKEN | docker login -u YourUserNameHere --password-stdin
Run Code Online (Sandbox Code Playgroud)

此外,Paketo 构建器映像必须是可信的。正如文档所述

默认情况下,任何建议的构建器都pack builder suggest被视为可信。

由于我使用建议的构建器,因此我不必在这里执行任何操作。如果您想使用默认情况下不受信任的另一个构建器,则需要pack config trusted-builders add your/builder-to-trust:bionic在最终的 pack CLI 命令之前运行一个命令。

这是 pack CLI 命令,如果您想要构建 Spring Boot 应用程序并使用 Docker Hub 作为容器注册表,该命令会启用缓存:

      pack build index.docker.io/yourApplicationImageNameHere:latest \
          --builder paketobuildpacks/builder:base \
          --path . \
          --cache-image index.docker.io/yourCacheImageNameHere:latest \
          --publish
Run Code Online (Sandbox Code Playgroud)

最后,构建和发布示例 Spring Boot 应用程序的 GitHub Action 工作流程https://github.com/jonashackt/spring-boot-buildpack如下所示:

name: build

on: [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
Run Code Online (Sandbox Code Playgroud)

请注意,通过使用 pack CLI 的--publish标志,我们也不再需要额外的步骤Tag & publish to Docker Hub。因为这已经由 pack CLI 为我们完成了。