基于云的CI服务器,可以根据外部资源处理并发阻塞

时间:2016-01-29 16:03:55

标签: continuous-integration

我一直在研究基于云的CI系统,但似乎找不到任何可以解决我的主要需求的系统。

我正在为Salesforce上的开发构建CI流程,但这个问题更普遍地讲述了依赖于外部资源的构建。在我们的构建中,我们将代码部署到云托管的Salesforce实例中,然后在该实例中运行测试。在构建期间,如果两个构建同时针对相同的外部资源,则外部资源将被有效锁定并且将发生构建失败。这意味着基于云的CI系统的正常并发模型将开始跳过具有大于1的并发性的Salesforce实例(外部资源)。

为了使事情复杂化,我们实际上为每个项目(功能,主,包装,测试和发布)提供了5种不同的外部资源,并且需要控制依赖外部资源的任何构建的并发性为1。例如,我们所有的功能分支都是针对功能外部资源构建的。我们可以通过使用模式功能/ *的分支名称来识别这些构建,并且需要确保一次只运行一个功能构建。但是,功能构建不会占用其他4个外部资源,因此理想情况下,任何需要这些资源的构建仍然可以同时运行。

我目前在Jenkins中使用Throttle Concurrent Builds插件完成此操作,并为每个构建分配一个限制组,以识别它所依赖的外部资源。这已经成功地阻止了并发构建对外部资源的绊倒。

一些澄清:

  1. 我没有问如何在repo级别将并发性降低到1。我知道每个云CI系统都可以做到这一点。我应该能够将repo并发设置为N个外部资源(在我的例子中,5)。

  2. 理想情况下,我希望能够在分支名称上使用正则表达式模式作为"组"用以阻止同意。因此,设置如下:如果分支名称匹配'功能/.*'然后将并发限制为1.我希望避免在构建系统中手动配置新的功能分支,而是匹配模式。

  3. 我不得不说,几乎不可能找到一个限制性的谷歌搜索术语来帮助我回答这个问题。希望有人在那之前遇到过这个问题,并且可以为我提供一些启示:)

3 个答案:

答案 0 :(得分:3)

使用Jenkins Pipeline插件,您可以将阶段并发设置为1 - 并且一次只能传递一个事物。舞台的设计能够代表这样的事情。

https://www.cloudbees.com/blog/parallelism-and-distributed-builds-jenkins

stage "build"
node {
   sh './test-the-awesome'
}

stage name: "environment test", concurrency: 1
node {
    sh 'tests that lock the environment'
}

你也可以将构建管道放在一个repo中的Jenkins文件中:https://documentation.cloudbees.com/docs/cookbook/pipeline-as-code.html(所以任何构建的分支也遵循该锁定)。

正如@Jesse Glick在下面的评论中指出的那样,或许更通用的解决方案(尚未与管道兼容)是使用Lockable Resources Plugin - 它将适用于任何类型的作业。

答案 1 :(得分:1)

我使用Drone.io设置完成此操作。

基本上,我使用grunt插件访问外部托管的Redis数据库。它为您喜欢的任何参数提供信号量锁定。

确定该Env的锁定是否空闲。 如果是这样,Env的Key具有合理的超时时间 运行测试 清除锁

如果锁定,请到达它的到期时间,然后再睡觉。

答案 2 :(得分:-1)

我不知道任何可以按照您希望的方式管理外部资源的基于云的CI工具,除非您将逻辑作为构建脚本的一部分包含在内,您已经说过您不希望这样做。如果您决定要这样做,可以使用Snap CI或无人机或我想象的任何其他云工具来完成。

在这种情况下,我通常建议使用基于代理的系统,例如Go.cd