詹金斯 + Kubernetes + ccache

时间:2021-05-14 19:47:16

标签: jenkins kubernetes ccache jenkins-kubernetes

我们正在考虑将 Jenkins 迁移到 Kubernetes (GKE) 并使用 Jenkins Kubernetes 插件在 Pod 中运行作业。但是,我们的构建基础架构使用 ccache 来优化构建速度,并且我们将 ccache 文件保存在 jenkins 代理上(每次构建都会读取和写入每个代理上的本地 ccache 文件夹)。

根据我的理解,k8s 中的 Jenkins 代理 pod 是短暂的,这意味着它们仅供一次性使用。我正在努力理解 ccache 是如何设置的。这是我的想法:

  • 使用 pod 模板中的 hostpath 卷让代理 pod 在节点上安装路径。恐怕这是行不通的,因为基于 GKE 文档主机路径不允许 ReadWriteMany,这意味着多个 pod 将无法同时写入 ccache 挂载。
  • 使用基于 NFS 的卷 - 我知道这样一个事实不会很好地工作,因为它会很慢并且会出现锁定问题。
  • 以某种方式使用 'podRetention' 和 'idleMinutes' 选项配置 Pod 模板,以便重新使用 Pod。我认为这是可行的,但 IMO 这违背了使用 Kubernetes 的目的。
  • 使用 StateFull Jenkins 代理 - 我再次认为这是可行的,但违背了使用 Kubernetes 的目的。

我找到了可能相关的 https://issues.jenkins.io/browse/JENKINS-42422,但我认为没有解决方案。

关于如何实现这一点的任何其他想法?无法使用 ccache 对我们来说是一个交易破坏者,因为与静态代理相比,它会使构建周转时间更糟。

1 个答案:

答案 0 :(得分:0)

有状态并没有违背 Kubernetes 的目的。例如,如果您在集群中运行数据库,则需要有状态应用程序。 我建议您使用 glusterfs/ceph/nfs/EFS(AWS) 并使用 readWriteMany for ccache。

此博客有更多详细信息:

https://blog.hiya.com/kubernetes-base-jenkins-stateful-agents/