Cache Cloud Native Buildpacks/Paketo.io pack CLI строится на GitHub Actions (например, с пакетами сборки Spring Boot/Java/Maven)?

Я работаю над приложением Spring Boot, которое должно быть упаковано в контейнер OCI с использованием Cloud Native Build Packs / Paketo.io. Я создаю его с помощью 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

Теперь шаг Build app with pack CLIзанимает относительно много времени, так как он всегда загружает образ Docker сборщика Paketo, а затем выполняет полную новую сборку. Это означает загрузку JDK и всех зависимостей Maven. Есть ли способ кэшировать сборку Paketo на GitHub Actions?

1 ответ

Кэширование образов Docker в действиях GitHub может быть вариантом, что не кажется таким простым . Другой вариант - использовать официальное действие Docker docker / build-push-action , которое может кэшировать buildx-cache . Но я не смог заставить работать комбинацию pack CLI и buildx-caching (см., Например, эту сборку ).

Наконец, я наткнулся на общий подход Cloud Native Buildpacks к кешированию документации :

Кэш-образы - это способ сохранить слои оптимизации сборки на разных хост-машинах. Эти образы могут повысить производительность при использовании пакета в эфемерных средах, таких как конвейеры CI / CD.

Я нашел эту концепцию довольно хорошей, поскольку в ней используется второй образ кеша , который публикуется в выбранном вами реестре контейнеров . И этот образ просто используется для всех сборок интерфейса командной строки Paketo pack на каждой машине, на которой вы добавляете параметр - будь то локальный рабочий стол или любая платформа CI / CD (например, GitHub Actions).

Чтобы использовать --cache-imageпараметр, мы также должны использовать флаг (поскольку образ кеша должен быть опубликован в реестре вашего контейнера!). Это также означает, что нам нужно войти в реестр контейнеров, прежде чем мы сможем запустить нашу команду CLI pack. Используя Docker Hub, это примерно так:

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

Также образ конструктора Paketo должен быть доверенным . Как говорится в документации :

По умолчанию любой конструктор, предложенный pack builder suggest считается доверенным.

Поскольку я использую предложенный конструктор, мне не нужно здесь ничего делать. Если вы хотите использовать другой конструктор, которому по умолчанию не доверяют, вам нужно запустить <tcode id="21825531"></tcode>Команда перед окончательной командой CLI пакета.

Вот команда CLI pack, для которой включен кеш, если вы хотите создать приложение Spring Boot и использовать Docker Hub в качестве реестра контейнеров:

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

Наконец, рабочий процесс GitHub Action для создания и публикации примера приложения Spring Boot 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

Обратите внимание, что с использованием пакета CLI --publish флаг, лишний шаг нам тоже не нужен Tag & publish to Docker Hubбольше. Поскольку это уже сделано для нас с помощью CLI пакета.

Другие вопросы по тегам