Кэширование зависимостей Maven в Tekton Maven Task из Tekton Hub

Мы хотим создать проект на основе Spring Boot с использованием Maven. Мы нашли и у него уже есть работающий конвейер. В сокращенном варианте наши pipeline.yml выглядит так:

      apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: buildpacks-test-pipeline
spec:
  params:
    - name: SOURCE_URL
      type: string
      description: A git repo url where the source code resides.
    - name: SOURCE_REVISION
      description: The branch, tag or SHA to checkout.
      default: ""

  workspaces:
    - name: maven-settings
    - name: source-workspace
  tasks:
    - name: fetch-repository
      taskRef:
        name: git-clone
      workspaces:
        - name: output
          workspace: source-workspace
      params:
        - name: url
          value: "$(params.SOURCE_URL)"
        - name: revision
          value: "$(params.SOURCE_REVISION)"
        - name: subdirectory
          value: ""
        - name: deleteExisting
          value: "true"
    - name: maven
      taskRef:
        name: maven
      runAfter:
        - fetch-repository
      params:
        - name: GOALS
          value:
            - package
      workspaces:
        - name: source
          workspace: source-workspace
        - name: maven-settings
          workspace: maven-settings

А PipelineRun определяется как:

      apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  generateName: buildpacks-test-pipeline-run-
spec:
  pipelineRef:
    name: buildpacks-test-pipeline
  workspaces:
    - name: maven-settings
      emptyDir: {}
    - name: source-workspace
      subPath: source
      persistentVolumeClaim:
        claimName: source-pvc
  params:
    - name: SOURCE_URL
      value: https://gitlab.com/jonashackt/microservice-api-spring-boot
    - name: SOURCE_REVISION
      value: 3c4131f8566ef157244881bacc474543ef96755d

В source-pvc PersistentVolumeClaim определяется как:

      apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: source-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi

Наш проект строится нормально, но задача загружает все зависимости Maven проекта снова и снова, когда мы запускаем еще один PipelineRun:

Задача Maven в Tekton Hub Maven Task на Tekton Hub,https://hub.tekton.dev/tekton/task/maven , похоже, не поддерживает использование кеша. Как же все-таки кешировать?

1 ответ

Есть простой способ выполнить кэширование с помощью Tekto Hub Maven Task. Вместо того, чтобы указывать пустой каталог в рабочей области с помощью emptyDir: {}вам нужно создать новый внутри уже определенного source-pvcПерсистентволумеклайм. Также свяжите persistentVolumeClaimтак же, как вы уже связали его для source-workspace. Ваш PipelineRunсейчас как-то так выглядит:

      apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  generateName: buildpacks-test-pipeline-run-
spec:
  pipelineRef:
    name: buildpacks-test-pipeline
  workspaces:
    - name: maven-settings
      subPath: maven-repo-cache
      persistentVolumeClaim:
        claimName: source-pvc
    - name: source-workspace
      subPath: source
      persistentVolumeClaim:
        claimName: source-pvc
  params:
    - name: SOURCE_URL
      value: https://gitlab.com/jonashackt/microservice-api-spring-boot
    - name: SOURCE_REVISION
      value: 3c4131f8566ef157244881bacc474543ef96755d

Теперь новый subPathуже доступен через рабочую область внутри Tekton Hub Maven Task (которая не реализует дополнительный cacheрабочее место прямо сейчас ). Нам нужно только сказать Maven использовать путь workspaces.maven-settings.pathкак хранилище кеша.

Поэтому мы добавляем -Dmaven.repo.local=$(workspaces.maven-settings.path)как valueк GOALSпараметр mavenЗадача такая:

      apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: buildpacks-test-pipeline
spec:
  params:
    - name: SOURCE_URL
      type: string
      description: A git repo url where the source code resides.
    - name: SOURCE_REVISION
      description: The branch, tag or SHA to checkout.
      default: ""

  workspaces:
    - name: maven-settings
    - name: source-workspace
  tasks:
    - name: fetch-repository # This task fetches a repository from github, using the `git-clone` task you installed
      taskRef:
        name: git-clone
      workspaces:
        - name: output
          workspace: source-workspace
      params:
        - name: url
          value: "$(params.SOURCE_URL)"
        - name: revision
          value: "$(params.SOURCE_REVISION)"
        - name: subdirectory
          value: ""
        - name: deleteExisting
          value: "true"
    - name: maven
      taskRef:
        name: maven
      runAfter:
        - fetch-repository
      params:
        - name: GOALS
          value:
            - -Dmaven.repo.local=$(workspaces.maven-settings.path)
            - verify
      workspaces:
        - name: source
          workspace: source-workspace
        - name: maven-settings
          workspace: maven-settings

Теперь после первого выполнения конвейера каждый следующий запуск должен повторно использовать репозиторий Maven внутри maven-settingsРабочее пространство. Это также должно предотвратить загрязнение журнала операторами загрузки Maven и ускорить конвейер в зависимости от количества зависимостей:

Наш простой пример работает более чем в два раза быстрее.

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