我正在开发一个基于Kubernetes的CI系统,在这个系统中,每个构建都是作为一个工作来启动的。我运行这些就像无人机CI一样,在构建的每一步都是一个单独的容器。在我的k8s CI案例中,我将每个步骤作为一个容器运行在一个Job中。我想要的行为如下:
我目前正在使用一个带有emptyDir卷的单一作业荚作为共享构建空间。我这样做是为了不需要在节点/Pods之间移动卷时等待。这似乎也是确保在构建出口自动清理东西的好方法。
问题是,如果使用上述所有步骤启动多容器作业,它们将同时执行。这意味着“运行测试”步骤可以在“git”步骤之前启动。
我曾想过要在每个容器中找到某种逻辑,让它们睡觉,直到解锁/“我完蛋了!”文件出现在共享卷中,表示已完成依赖步骤,但这似乎足够复杂,以便在继续之前询问其他选项。
我可以看到屈服和使用多个工作与协调的工作,但然后我被困在卷索赔领域(这比emptyDir要复杂得多)。
总结一下这个问题:
我目前的方法值得追求吗?如果是的话,如何排列作业的容器?我希望能想出一些能在AWS/GCE和裸金属部署上工作的东西。
我不太愿意接触PVCs,因为管理和清理并不是我想让我的系统负责的事情。我也不想要求网络存储时,emptyDir可以工作这么好。
编辑:请不要建议使用另一个现有的CI系统,因为这是没有帮助的。我这样做是为了我自己的满足感和实验。除了我的玩具,这个修补程序的CI系统不太可能成为任何东西。
发布于 2016-10-19 19:05:15
如果您希望在容器中运行所有构建步骤,那么GitLab CI或汇合CI可能更适合您。我没有使用fabric8.io的经验,但是Frank.Germain建议它也能工作。
一旦您开始变得足够复杂,需要在容器之间发送信令来命令构建步骤,那么使用预滚的东西就会更有效率。
作为一种选择,您可以使用静态卷(即宿主路径作为工件缓存),并按顺序从当前容器触发下一个容器,在两个阶段之间挂载相同的卷。然后,您可以在构建的开始或结束添加一个步骤,以便在管道运行后进行“清理”。
需要明确:我不认为滚动您自己的CI是处理此问题的最有效方法,因为已经有一些系统可以完成您正在寻找的任务。
https://stackoverflow.com/questions/40102308
复制相似问题