基于云的 CI 服务器,可以处理基于外部资源的并发阻塞
Cloud based CI server that can handle concurrency blocking based on external resources
我研究基于云的 CI 系统已经有一段时间了,但似乎找不到任何可以满足我的主要需求的系统。
我正在 Salesforce 上构建 CI 开发流程,但这个问题更笼统地说是关于依赖外部资源的构建。在我们的构建中,我们将代码部署到云托管的 Salesforce 实例中,然后 运行 在该实例中进行测试。在构建过程中,外部资源被有效锁定,如果两个构建同时针对同一个外部资源,则会发生构建失败。这意味着基于云的 CI 系统的正常并发模型将开始在并发大于 1 的 Salesforce 实例(外部资源)上绊倒。
更复杂的是,我们每个项目实际上有 5 个不同的外部资源(feature、master、packaging、beta 和 release),并且需要将依赖外部资源的任何构建的并发度控制为 1 . 例如,我们所有的功能分支都是针对功能外部资源构建的。我们可以通过使用模式 feature/* 的分支名称来识别这些构建,并且需要确保一次只构建一个特性 运行s。但是,功能构建不会占用其他 4 个外部资源,因此理想情况下,任何需要这些资源的构建都应该能够同时 运行。
我目前在 Jenkins 中使用 Throttle Concurrent Builds 插件完成此操作,并为每个构建分配一个节流组,以识别它所依赖的外部资源。这已经成功地防止了并发构建被外部资源绊倒。
几点说明:
我不是在问如何在回购级别将并发性降低到 1。我知道每个云 CI 系统都可以做到这一点。我应该能够将 repo 并发设置为 N 个外部资源(在我的例子中是 5 个)。
理想情况下,我希望能够在分支名称上使用正则表达式模式作为 "group" 来阻止并发。因此,设置如下:如果分支名称匹配 'feature/.*',则将并发限制为 1。我想避免在构建系统中手动配置新功能分支,而是匹配模式。
我不得不说,几乎不可能找到一个限制性 Google 搜索词来帮助我回答这个问题。希望外面的人以前遇到过这个问题并且可以为我提供一些启示:)
我使用 Drone.io 设置来完成此操作。
本质上,我使用 grunt 插件访问外部托管的 Redis 数据库。它为您想要的任何参数提供信号量锁定。
确定该环境的锁是否可用。
如果是的话,Env 的 Key 有一个合理的超时
运行 测试
清除锁
如果持有锁,获取它的到期时间,然后休眠到那时。
使用 Jenkins Pipeline 插件,您可以将阶段并发设置为 1 - 一次只有 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'
}
您也可以将构建管道放在存储库中的 Jenkinsfile 中:https://documentation.cloudbees.com/docs/cookbook/pipeline-as-code.html(因此构建的任何分支也遵守该锁定)。
正如@Jesse Glick 在下面的评论中所指出的,也许更通用的解决方案(尚未与管道兼容)是使用 Lockable Resources Plugin - 然后它将跨任何类型的作业工作。
我不知道有任何基于云的 CI 工具可以按照您想要的方式管理外部资源,除非您将逻辑作为构建脚本的一部分,您已经说过了d 宁愿不做。如果您决定要这样做,您可以使用 Snap CI 或 Drone 或我想象的任何其他云工具来完成。
在这种情况下,我通常会推荐基于代理的系统,例如 Go.cd
我研究基于云的 CI 系统已经有一段时间了,但似乎找不到任何可以满足我的主要需求的系统。
我正在 Salesforce 上构建 CI 开发流程,但这个问题更笼统地说是关于依赖外部资源的构建。在我们的构建中,我们将代码部署到云托管的 Salesforce 实例中,然后 运行 在该实例中进行测试。在构建过程中,外部资源被有效锁定,如果两个构建同时针对同一个外部资源,则会发生构建失败。这意味着基于云的 CI 系统的正常并发模型将开始在并发大于 1 的 Salesforce 实例(外部资源)上绊倒。
更复杂的是,我们每个项目实际上有 5 个不同的外部资源(feature、master、packaging、beta 和 release),并且需要将依赖外部资源的任何构建的并发度控制为 1 . 例如,我们所有的功能分支都是针对功能外部资源构建的。我们可以通过使用模式 feature/* 的分支名称来识别这些构建,并且需要确保一次只构建一个特性 运行s。但是,功能构建不会占用其他 4 个外部资源,因此理想情况下,任何需要这些资源的构建都应该能够同时 运行。
我目前在 Jenkins 中使用 Throttle Concurrent Builds 插件完成此操作,并为每个构建分配一个节流组,以识别它所依赖的外部资源。这已经成功地防止了并发构建被外部资源绊倒。
几点说明:
我不是在问如何在回购级别将并发性降低到 1。我知道每个云 CI 系统都可以做到这一点。我应该能够将 repo 并发设置为 N 个外部资源(在我的例子中是 5 个)。
理想情况下,我希望能够在分支名称上使用正则表达式模式作为 "group" 来阻止并发。因此,设置如下:如果分支名称匹配 'feature/.*',则将并发限制为 1。我想避免在构建系统中手动配置新功能分支,而是匹配模式。
我不得不说,几乎不可能找到一个限制性 Google 搜索词来帮助我回答这个问题。希望外面的人以前遇到过这个问题并且可以为我提供一些启示:)
我使用 Drone.io 设置来完成此操作。
本质上,我使用 grunt 插件访问外部托管的 Redis 数据库。它为您想要的任何参数提供信号量锁定。
确定该环境的锁是否可用。 如果是的话,Env 的 Key 有一个合理的超时 运行 测试 清除锁
如果持有锁,获取它的到期时间,然后休眠到那时。
使用 Jenkins Pipeline 插件,您可以将阶段并发设置为 1 - 一次只有 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'
}
您也可以将构建管道放在存储库中的 Jenkinsfile 中:https://documentation.cloudbees.com/docs/cookbook/pipeline-as-code.html(因此构建的任何分支也遵守该锁定)。
正如@Jesse Glick 在下面的评论中所指出的,也许更通用的解决方案(尚未与管道兼容)是使用 Lockable Resources Plugin - 然后它将跨任何类型的作业工作。
我不知道有任何基于云的 CI 工具可以按照您想要的方式管理外部资源,除非您将逻辑作为构建脚本的一部分,您已经说过了d 宁愿不做。如果您决定要这样做,您可以使用 Snap CI 或 Drone 或我想象的任何其他云工具来完成。
在这种情况下,我通常会推荐基于代理的系统,例如 Go.cd