Groovy中是否有直接或通过集成Jenkins插件来完成下游作业的方法,只有在最近的X个小时内尚未运行下游作业时才可以完成? ,开始创建图像的工作。我想在两者之间放置一个中间步骤,以检查图像创建作业的最后一次迭代何时运行,如果还不到3个小时,则不要运行图像创建作业。

我无法看到使用cron进行这项工作的方法,因为每当提交提交时,上游作业便会随机运行,从而混淆了任何时序控制。我不能仅仅安排图像创建的时间,因为有时我们在一小时内会收到10次以上的提交,而有时一天几乎没有。当一天中的某一天变成绿色时,我宁愿立即创建一个供下游使用的图像,而不是安排时间最多等待3个小时。

我不希望制作它以1:1的比例提交图像,仅是因为大量存储它们很棘手,并且在图像的下游,您再也不需要像上述每小时10个那样频繁使用它们。

#1 楼

要综合Alex和Steve Johnson的答案,您可以将其放在下游工作的顶部:

lastBuild = currentBuild.getPreviousBuild()
delay = 2

if Date(lastBuild.timestamp) >= new Date().minusHours(delay) {
    currentBuild.result = 'SUCCESS'
    echo "Less than ${delay} hours since the last build. Job will not run."
    return
}


评论


有效,但仅当您不想手动启动下游作业时。公平地说,尽管我没有提到这是一个要求,所以在这种情况下您的答案是正确的!

– Alex
17年5月4日在15:57

绝对,我认为您的解决方案是最好的方法。我只是想过用部分解决方案改进Steve的方法。我只是要评论他,但是代码格式不起作用。

– Lawnmowerlatte
17年5月4日16:00

#2 楼

花费了一段时间,由于我不是Groovy专家,所以有点偏僻,但是我可以用它来解决这个问题; >

在Jenkins REST API上运行curl命令以获取有关上一次成功构建的信息,并将其存储在临时文件中。现在是大纪元这被存储到文件中。
文件被归档到作业中,然后读入变量。将此时间戳与当前时间进行比较(在作业的顶部获得),如果它们之间的间隔少于八个小时,则作业将“失败”,并显示成功和错误消息。时间超过八个小时,该作业将继续构建下游作业。


#3 楼

这可能有效。我使用了两个小时之前的示例X。

lastBuild = currentBuild.getPreviousBuild()

if Date(lastBuild.timestamp) < new Date().minusHours(2) {
  <do your thing here>
}


您可能必须将Date()列入白名单。 br />

评论


这听起来像根据当前正在运行的作业起作用;我需要它来检查下游作业的上次构建时间(即,一个单独的作业)并基于该响应

– Alex
17年4月26日在12:40

克鲁德,我想不出一种干净的方法。您可能不得不依靠Jenkins的REST API和curl(在管道的Groovy部分中不鼓励使用HTTP请求之类的同步内容)。

–史蒂夫·约翰逊(Steve Johnson)
17年4月26日在20:00

您也许可以在下游作业中使用它。

– Lawnmowerlatte
17年5月4日15:50