1

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

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

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

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

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

4

1 回答 1

0

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

这个博客有更多细节:

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

于 2021-05-14T21:16:10.970 回答