如何防止某些Jenkins作业同时运行?

我有一些使用共享资源(数据库)的作业,有时可能会导致构build失败,这是因为偶然事件触发了(罕见)事件。

例如,给定作业A到E,是否有任何方法可以指定A和C 不应该同时运行

除了上述资源之外,构build是彼此独立的(不在上游/下游关系中)。

一种“蛮力”的方式将执行者的数量限制为一个,但是如果大多数工作可以同时执行并且在构build服务器上不缺less计算资源,那显然是不太理想的。

目前有两种方法:

  • 使用油门并发构build插件。
  • 将这些作业设置成只有一个执行器的从站运行。

锁和锁存插件在这里应该有所帮助。

这个问题可能是一个骗局, 我怎样才能确保在Hudson中只有一个类别的工作同时运行?

看一下2012年11月首次发布的外部资源调度器 Jenkins插件。这个(相对)新的插件似乎正好覆盖了这个用例。

这是一个古老的问题,但是这个话题仍然是相关的,特别是在Jenkins上运行应用程序testing时。

可locking资源插件允许您定义可由构build使用的可locking资源。 如果您的构build需要资源,则需要locking。 如果第二个构build需要相同的资源(这个资源已经被locking),它将排队等待资源释放。

尽pipe文档使用计算机或打印机作为可locking资源的示例,但上面的数据库示例也应该可以正常工作。

在2012年的答案中提到的Locks和Latches插件相反,这个包似乎目前维持(目前〜2016年)。

注意,您不需要从站/节点的物理或虚拟硬件,您可以设置在主服务器上运行的“从站”。

pipe理Jenkins>pipe理节点>新节点

并build立一个“哑巴奴隶”,每个都有自己的根目录。

创build几个从服务器,在服务器启动时执行它们,然后基本上创build了执行程序池。

你可能会说…

db – 你的情况只有一个执行者。 编译 – 根据硬件或CPU数量限制。 脚本 – jenkins擅长的所有这些小工作都有许多执行者。

老问题,这是否将适用于您的应用程序我不能确定,因为你没有提到你的应用程序的细节。 但是,我想添加我在Rails应用程序testing套件中处理的方式。

我们的应用程序的数据库configuration( database.yml )不在源代码库中。 相反,它位于运行我们的Jenkins实例的VM上的/var/lib/configs/uniquing_database.yml

我们构build过程的其中一个步骤是将此configuration文件复制到项目工作区中:

 cp /var/lib/jenkins/configs/myapp_unique_database.yml config/database.yml 

并且该configuration需要将Jenkins的工作空间和构build号码信息暴露给环境,以便为该作业创build唯一命名的数据库,并且具体执行:

 test: adapter: postgresql encoding: unicode host: 127.0.0.1 port: 5432 database: myapp_test<%= ENV['JOB_NAME'].split('/').last %><%= ENV['BUILD_NUMBER'] %> 

我们其余的构build没有任何知识或关心,它运行在一个独特的数据库中。 最后,在我们构build的最后,我们确保放弃这个数据库,所以我们没有大量的testing数据库污染文件系统:

 RAILS_ENV=test bundle exec rake db:drop