我有几个使用共享资源(数据库)的工作,有时候会导致构建失败,因为这些工作可能同时运行。
例如,对于工作A到E,是否有一种方式可以指定A和C不应该同时运行?
除了上述资源之外,构建是相互独立的(没有上游/下游关系等)。
“蛮力”方法是将执行者的数量限制为一个,但如果大多数工作可以同时执行且构建服务器上没有计算资源缺乏,那显然不是理想的解决方案。
我有几个使用共享资源(数据库)的工作,有时候会导致构建失败,因为这些工作可能同时运行。
例如,对于工作A到E,是否有一种方式可以指定A和C不应该同时运行?
除了上述资源之外,构建是相互独立的(没有上游/下游关系等)。
“蛮力”方法是将执行者的数量限制为一个,但如果大多数工作可以同时执行且构建服务器上没有计算资源缺乏,那显然不是理想的解决方案。
目前有两种方法可以实现这个:
锁和插销插件here应该会有所帮助。
这个问题可能是如何确保同一类别的作业同时只运行一个的重复问题。
这是一个老问题,但该主题仍然可能相关,特别是在Jenkins上运行应用程序测试时。
Lockable Resources Plugin 允许您定义可由构建使用的可锁定资源。如果您的构建需要一个资源,它将锁定该资源。如果第二个构建需要相同的资源(已经被锁定),则它将排队等待资源得到释放。
虽然文档中使用计算机或打印机作为可锁定资源的示例,但上面的数据库示例也应该可以工作。
与2012年答案中提到的Locks and Latches Plugin相反,这个插件似乎目前正在维护(当前 ~2016)。
注意:您不需要为从节点准备物理或虚拟硬件,您可以设置在主服务器上运行的“从节点”。
管理Jenkins > 管理节点 > 新建节点
并创建一个“愚蠢的从节点”,每个从节点都有自己的根目录。
创建一些从节点,在服务器启动时执行它们,然后您基本上创建了执行器池。
例如,您可能会有...
db - 在您的情况下只有一个执行器。 编译 - 根据硬件或CPU数量限制。 脚本 - 为Jenkins擅长处理的所有小任务创建多个执行器。
这是一个旧问题,我不能确定它是否适用于您的应用程序,因为您没有提及应用程序的详细信息。但是,我想添加一下我们在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