我有一个 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/