我有一个使用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中,但是我不确定如何配置管道来创建和清除这种持久的卷声明。
答案 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。