如何在Jenkins管道运行之间共享多个Docker缓存?

时间:2019-04-01 15:39:22

标签: jenkins kubernetes

我有一个使用kubernetes插件的Jenkins管道来运行docker in docker容器并构建图像:

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

在jenkins命名空间中,我还拥有一个永久卷池,每个卷都标记为app=dind。我希望为每个管道运行选择这些卷之一,并在我的容器中用作/var/lib/docker,以便在每次运行时缓存任何图像提取。我希望有一个池和缓存,而不仅仅是一个池,因为我希望能够同时发生多个管道运行。我该如何配置?

这可以通过创建如下的持久卷声明在kubernetes中本地实现:

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

并将其安装到Pod中,但是我不确定如何配置管道来创建和清除这种持久的卷声明。

1 个答案:

答案 0 :(得分:0)

首先,我认为你认为它可以在 kubernetes 中本地实现的方式 - 行不通。您要么必须重新使用相同的 PVC,这将使构建 pod 同时访问相同的 PV,或者如果您希望每个构建都有一个 PV - 您的 PV 将停留在 Released 状态并且不能自动用于新的 PVC .

此处提供更多详细信息和讨论https://issues.jenkins.io/browse/JENKINS-42422

碰巧我写了两个简单的控制器 - 自动 PV 释放器(它会为新的 PVC 再次找到并制作 Released PV Available)和动态 PVC 供应器(专门用于 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