Jenkins:如何将每个scm-change的新工作放入构建队列?

时间:2012-11-08 16:57:38

标签: jenkins continuous-integration polling

我正在使用Jenkins进行连续集成。

我配置了一个作业,它会轮询scm的变化。我有一个遗嘱执行人。如果有多个scm-change,但执行程序已经在运行,那么仍然只有一个作业添加到队列中,我希望它可以排队多个作业。

我已经尝试过“参数化”作为一种解决方法,但只要轮询没有设置任何参数¹(即使不是默认值²),这也无济于事。

有没有办法让每个scm更改作业队列中的新构建?

[1] https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Build

[2]我尝试将此方案与https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+Dynamic+Parameter+Plug-in

结合起来

2 个答案:

答案 0 :(得分:1)

您可以编写一个由SVN触发的Jenkins Adaptive Plugin脚本,并创建一个新版本,无论当前正在运行什么。

另一种选择是创建两个作业,一个监视SCM,另一个运行构建。每次有SCM更改时,您都有第一个作业将第二个作业的实例添加到队列中并立即完成,以便它可以继续轮询。

答案 1 :(得分:0)

通过使用需要两个步骤的解决方法,可以在Jenkins中描述场景:

  • [JobA_trigger]通过curl或jenkins-cli.jar¹“外部”触发另一项工作的一项工作。

  • [JobA]实际工作必须是参数化工作。

在我的设置中,JobA_trigger会定期轮询SCM。如果有变化,JobA将通过curl触发,并提交当前日期时间。这种“外部”触发是向JobA提交参数所必需的。

# JobA_trigger "execute shell"
curl ${JENKINS_URL}job/JobA/buildWithParameters?SVN_REVISION=`date +"%Y-%m-%d"`%20`date +"%H:%M:%S"`
# SVN_REVISION, example (decoded): "2012-11-07 12:56:50" ("%20" is url-encoded space)

JobA本身已参数化并接受String-Param“SVN_REVISION”。此外,我不得不将SVN-URL更改为

# Outer brackets for usage of SVN revision dates³ - must be avoided if working on a revision-number.
https://svn.someaddress.com/trunk@{${SVN_REVISION}}

使用此解决方法,对于每个scm-change,新的JobA排队运行,其中相关的svn-revision / dateTime作为参数附加,并用作此作业正在测试的软件状态。

¹https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

²我决定使用dateTime-bases更新而不是基于修订版的更新,因为我有svn-externals,如果我将基于修订版,将更新为HEAD。

³http://svnbook.red-bean.com/en/1.7/svn.tour.revs.specifiers.html#svn.tour.revs.dates