我有几个使用共享资源(数据库)的作业,这有时会导致构建在(罕见)事件中失败,即同时触发作业。
例如,给定作业A到E,是否有任何方法可以指定A和C 不应该同时运行?
除上述资源外,构建版本彼此独立(例如,不在上游/下游关系中)。
“暴力”方式会将执行程序的数量限制为一个,但如果大多数作业可以同时执行并且构建服务器上不缺乏计算资源,那么这显然不太理想。
答案 0 :(得分:38)
目前有两种方法可以做到这一点:
答案 1 :(得分:14)
Locks and Latches插件here应该有所帮助。
这个问题可能是How do I ensure that only one of a certain category of job runs at once in Hudson?
的欺骗答案 2 :(得分:3)
这是一个老问题,但主题仍然相关,尤其是在Jenkins上运行应用程序测试时。
Lockable Resources Plugin允许您定义构建可以使用的可锁定资源。如果您的构建需要资源,则需要锁定。如果第二个构建需要相同的资源(然后已经锁定),它将排队等待资源免费。
虽然文档使用计算机或打印机作为可锁定资源的示例,但上面的数据库示例也可以正常工作。
与2012年答案中提到的Locks and Latches Plugin相反,此套餐目前似乎已维持(目前为〜2016年)。
答案 3 :(得分:2)
查看2012年11月首次发布的External Resource Dispatcher Jenkins插件。这个(相对)新插件似乎完全覆盖了这个用例。
答案 4 :(得分:0)
N.B。如果从站/节点不需要物理或虚拟硬件,则可以设置在主服务器上运行的“从站”。
管理Jenkins>管理节点>新节点
并使用自己的根目录创建一个“哑从”。
创建一些从属服务器,在服务器启动时执行它们,然后基本上创建了执行程序池。
你可能有,说......
db - 在您的情况下只有一个执行程序。 compile - 根据硬件或CPU数限制。 脚本 - 为詹金斯擅长的所有小工作都有许多执行者。
答案 5 :(得分:0)
旧问题,以及这是否适用于您的应用程序我无法确定您没有提及您的应用程序的详细信息。但是,我想在Rails应用程序测试套件中添加我处理它的方式。
我们的应用程序的数据库配置(database.yml
)不在源存储库中。相反,它位于运行我们的Jenkins实例的VM上的/var/lib/configs/uniquing_database.yml
。
我们的构建过程的一个步骤涉及将此配置文件复制到项目工作区:
cp /var/lib/jenkins/configs/myapp_unique_database.yml config/database.yml
并且该配置将Jenkins暴露给环境的工作空间和内部版本号信息考虑在内,以便为该作业创建一个唯一命名的数据库并且具体执行:
test:
adapter: postgresql
encoding: unicode
host: 127.0.0.1
port: 5432
database: myapp_test<%= ENV['JOB_NAME'].split('/').last %><%= ENV['BUILD_NUMBER'] %>
我们构建的其余部分在没有任何知识或关心的情况下继续在不同的数据库中运行。最后,在构建结束时,我们确保删除该数据库,以便我们没有一堆测试数据库污染文件系统:
RAILS_ENV=test bundle exec rake db:drop
答案 6 :(得分:0)
在声明性Jenkins管道中,有一个专门为此目的设计的特殊选项disableConcurrentBuilds()
(请参见docs):
pipeline {
options {
disableConcurrentBuilds()
}
}