Как я могу совместно использовать несколько кэшей Docker между запусками конвейера Jenkins?

#jenkins #kubernetes

#дженкинс #kubernetes

Вопрос:

У меня есть конвейер Jenkins, использующий плагин kubernetes для запуска docker в контейнере docker и сборки образов:

 pipeline {
  agent {
    kubernetes {
      label 'kind'
      defaultContainer 'jnlp'
      yaml """
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: dind
... 
  

У меня также есть пул постоянных томов в пространстве имен jenkins, каждый из которых помечен app=dind . Я хочу, чтобы один из этих томов выбирался для каждого запуска конвейера и использовался как /var/lib/docker в моем контейнере dind, чтобы кэшировать любые извлечения изображений при каждом запуске. Я хочу иметь пул и кэши, а не только один, поскольку я хочу, чтобы несколько запусков конвейера могли выполняться одновременно. Как я могу это настроить?

Это может быть достигнуто изначально в kubernetes путем создания постоянного требования к объему следующим образом:

 apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dind
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      app: dind
  

и монтировать его в модуль, но я не уверен, как настроить конвейер для создания и очистки такого постоянного требования к объему.

Комментарии:

1. Вы проверили docs.docker.com/develop/develop-images/multistage-build ?

2. @AmritBera Я знаком с ними, да, но не слишком уверен, как они помогут здесь?

Ответ №1:

Прежде всего, я думаю, что способ, которым, по вашему мнению, это может быть достигнуто изначально в kubernetes, не сработает. Вам либо придется повторно использовать тот же PVC, что сделает модули сборки доступными для одновременного доступа к одному и тому же PV, либо, если вы хотите иметь PV для каждой сборки, ваши PV будут заблокированы в Released статусе и не будут автоматически доступны для новых PVC’ов.

Более подробная информация и обсуждение доступны здесь https://issues.jenkins.io/browse/JENKINS-42422.

Так получилось, что я написал два простых контроллера — automatic PV releaser (который снова найдет и создаст Released PVS Available для новых PVCs) и dynamic PVC provisioner (специально для плагина Jenkins Kubernetes — чтобы вы могли определить PVC как аннотацию в Pod). Проверьте это здесь https://github.com/plumber-cd/kubernetes-dynamic-reclaimable-pvc-controllers. Здесь есть полный Jenkinsfile пример https://github.com/plumber-cd/kubernetes-dynamic-reclaimable-pvc-controllers/tree/main/examples/jenkins-kubernetes-plugin-with-build-cache .