当在Bitbucket中对我们的仓库进行提交时,我们让Jenkins运行单元测试。这是由Bitbucket插件(即通过Bitbucket Webhook)控制的。

当前,如果对分支A进行了提交,则将启动单元测试。如果在该作业运行期间对分支A进行了第二次提交,那么将启动第二个单元测试,因此现在在同一分支上有两个单元测试,但是代码略有不同。

我们的首选行为是,当第二个测试启动时,第一个提交的测试将被中止,因此仅运行最新的单元测试。可以实现吗?

进行澄清;我们有很多分支,因此我们不能只阻止并发构建,在下一次启动时立即取消上一个,等等。无论使用哪种方法,都必须专门检查分支是否已经在运行该作业,而不是通常是否已经在运行该作业。运行。

我已经看到了一些Git的触发控件,但没有看到Bitbucket。我还找到了一个脚本来检查作业是否已在运行,如果已运行则将其取消,但是如前所述,这不适合我们的用例。我想念什么吗?

评论

如果您使用Bitbucket分支源插件,这将变得容易得多,因为Bitbucket项目中每个回购分支和PR都有其自己的Jenkins作业,并且从那里可以轻松地检查该作业是否具有更新的版本然后中止。

您找到解决方案了吗?特别是对于位桶?

#1 楼

注意:这个答案来自我构建定制解决方案的背景,它不是仅配置的,如果有的话,显然是更可取的。但这可能是另外要考虑的事情。

您可以教执行单元测试作业的脚本保持每个分支的执行状态。

启动脚本时,它将需要从其调用参数中获取分支名称。然后它将获得分支的持久状态。

如果缺少状态或not running,则将其设置为running + job ID,执行单元测试,然后将状态设置为not running(或将其删除)。

如果状态为running + job ID,表示另一个单元测试已在运行,并且您具有相应的作业ID。然后,脚本可以(优美地?)通过其ID终止已在运行的作业,并代之以将状态更新为running + new job ID。 )并不理想-留下了不断杀死工作和发布新闻的空间,而这些消息只是被后来的工作杀死了-所有这些都没有实际完成。

我宁愿将逻辑修改为:


让作业单独进行,而是仅在持久状态下记录pending job ID(一个唯一值,该值会被覆盖以反映最近提交的待处理作业,或者所有待处理作业的列表(按提交时间排序)
,当正在进行的作业完成时,它会检查pending job ID值,如果有的话,会启动最新的(或最旧的,甚至遵循其他一些选择逻辑,如果使用列表)

这种方法避免了浪费单元测试资源,并且即使对于Mo不止一个,但资源仍然有限。