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

标签 jenkins kubernetes

我有一个 Jenkins 管道,使用 kubernetes 插件来运行 docker in docker容器和构建镜像:

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

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

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

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

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

最佳答案

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

这里有更多详细信息和讨论https://issues.jenkins.io/browse/JENKINS-42422 .

碰巧我写了两个简单的 Controller - 自动 PV 释放器(它将找到并为新的 PVC 再次提供已释放 PV)和动态 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 .

关于jenkins - 如何在 Jenkins 管道运行之间共享多个 Docker 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55458874/

相关文章:

jenkins - 读取 secret 文本文件的输出

docker - 在 Jenkinsfile 中使用带有身份验证的私有(private) docker 注册表

java - 将运行 JUnit 测试作为 Jenkins 配置的一部分

kubernetes - 容器端口 Pod 与容器端口服务

python - 从 GKE 调用 tf.io.gfile 方法时经常出现 DNS 失败 : "Couldn' t resolve host 'www.googleapis.com' "

bash - 运行 kubectl exec 时禁用 Kubernetes 上的网络日志

node.js - Lerna 使用 jenkins 管道发布

java - Jenkins 插件无法使用 java8 进行编译,因为无法识别流类

proxy - Ingress Controller (Traefik) 和 Kubernetes 上的后端服务之间的安全通信

elasticsearch - terraform 计划给出错误 : function call (function yamldecode)