Jenkins / Hudson:如何在构建另一个项目后仅定期构建?

4
我有一个项目(p1),每晚都会构建。每个星期二,我想要构建第二个项目(p2),但只有在p1成功完成后才能构建p2。由于p2依赖于p1的成功构建,因此如果当天的p1失败,则不能触发运行p2
我唯一能想到的方法是创建两个相同的p1作业p1ap1b
  • p1a除星期二外每天运行
  • p1b在星期二运行,成功完成后触发p2
然而,这有点混乱,因为它创建了多个版本的p1来维护,具有自己的构建历史等等...
有人知道更好的方法吗?

你是想在 p2 构建之前再次触发 p1,还是只是想确保 p1 在当天已经完成了? - Slav
@Slav 我希望在p2构建之前能够确保p1已经成功完成。 - Ray
顺便问一下,你用的是*nix还是Windows? - Slav
@Slav 我们的 Jenkins 运行在 Linux 服务器上。 - Ray
4个回答

3

您可以使用一个排除插件。

  • 为两个作业设置相同的"资源"字符串(请阅读插件页面了解详情)
  • p1作业应该在夜间计划中开始,比p2作业早
  • p1作业应该在每周二的计划中稍晚于p1开始

这样,在周二运行p2时,"资源"将已被p1使用。我实际上没有使用过这个插件,所以不确定它是否会导致p2等待或失败,但如果后者是真的,您可以配置p2重试失败的构建,使用此插件

或者,可以使用条件构建步骤插件。

  • p1中配置一个条件构建步骤,在构建步骤之后(所以如果构建步骤失败,它永远不会执行)。
  • 它使用运行条件插件,允许选择星期几作为条件。选择星期二
  • 然后使用参数化触发器插件添加触发/调用其他项目的构建构建步骤,将触发p2

在原帖中没有提到,但是p2依赖于当天成功运行的p1。我更新了我的原帖。锁定资源无法保护p1失败或者从未在当天运行的情况。 - Ray
你会考虑让p1在共享文件系统上创建一个文件吗?这个文件只会在p1成功执行后的周二被创建。然后,p2会查找这个文件。如果找到了,它会删除该文件,然后运行p2的其余部分。这样,如果p1没有成功,就不会有文件存在(并且任何先前一周的文件都已经被上一周的p2执行删除)。如果p2由于任何原因失败,也没关系,因为它会在启动时首先删除该文件。 - Slav
@Ray,给答案添加了另一种选择。 - Slav
看起来很有前途。将尝试按照您提到的设置这些插件。 - Ray
终于回到这个问题了...所以,在p1上设置条件构建步骤以在指定日期触发p2是不错的,只要该作业不需要运行其他任务或多次运行(理想情况下,我们希望上游作业监视下游作业,因此您可以随意运行p1,但p2仅在给定时间触发一次)。有一个插件https://wiki.jenkins-ci.org/display/JENKINS/BuildResultTrigger+Plugin似乎可以做到这一点,但并不完全符合我的需求。由于你在答案中提供的第二种解决方案符合我的OP,所以你得到了赞赏。 - Ray

1

这里有一个关于条件性构建步骤的stackoverflow问题可能会引起您的兴趣。特别是关于条件性构建插件的帖子。

也许使用该插件,并使用自定义脚本获取当前星期几并验证是否为星期二可以解决您的问题。


0

您可以将两个项目的开始时间设置为相同(p2稍晚一分钟左右)。

然后,您可以定义一个锁定(限制并发构建插件或锁定和闩门),以允许只有一个作业同时运行。

或者,您确实可以使用jobDSL插件或类似工具创建两个作业。


有趣的是,如果p1失败、无法运行等等... p2仍然会运行。我在我的原始帖子中没有提到它们是相互依赖的,但我会更新它。 - Ray
就我个人而言,我更喜欢使用JobDSL解决方案(https://github.com/jenkinsci/job-dsl-plugin),因为它可以带来更清晰的作业链,并且我已经在使用JobDSL了。但是Slav更新的解决方案更快,需要的前提条件也更少。 - blackbuild

0

我发现了一个相当新的插件,BuildResultTrigger Plugin。它允许在其他作业多次成功的条件下进行有条件的构建。它还允许进行调度,因此可以设置为轮询其他作业以获取成功的条件:https://wiki.jenkins-ci.org/display/JENKINS/BuildResultTrigger+Plugin

唯一的缺点是它不能被另一个作业“触发”,只能通过定期轮询来触发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接