Кэширование зависимостей 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 и ускорить конвейер в зависимости от количества зависимостей:
Наш простой пример работает более чем в два раза быстрее.