jenkins - 詹金斯 + Kubernetes + ccache
问题描述
我们正在考虑将 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 对我们来说是一个交易破坏者,因为与静态代理相比,它会使构建周转时间变得更糟。
解决方案
有状态并没有违背 Kubernetes 的目的。有状态的应用程序是必需的,例如,如果您在集群中运行数据库。我建议您使用 glusterfs/ceph/nfs/EFS(AWS) 并将 readWriteMany 用于 ccache。
这个博客有更多细节:
https://blog.hiya.com/kubernetes-base-jenkins-stateful-agents/
推荐阅读
- unity3d - 点击按钮时手机上的图形故障
- python - 在 Visual Studio 2017 上的 C++ 文件中包含 python 时出现链接问题
- ncurses - 简单的 ncurses 应用程序对箭头键没有反应
- node.js - 无法向其他地区的 Stripe Connected Account 付款
- java - Spring WebFlux:如何从数据库中将文件作为字节数组返回
- javascript - 提交表单后删除 Formik 错误消息
- python - 关于python的w3w字典练习题的问题
- python - Pygame 没有移动我的矩形,我不知道为什么?
- grpc - grpc-java 定义没有proto文件的服务和方法
- javascript - 如何从 JS 文件调用 Odoo 控制器函数