1

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

我配置了一个作业,它轮询 scm 的更改。我有一个执行人。当有多个 scm-change,但 executor 已经在工作时,仍然只有一个作业添加到队列中,我希望它排队多个作业。

我已经尝试将我的工作“参数化”作为一种解决方法,但只要轮询未设置任何参数¹(甚至不是默认参数²),这也无济于事。

有没有办法为每个 scm-change 在作业队列中获取一个新版本?

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

[2] 我尝试将此场景与https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+Dynamic+Parameter+Plug-in结合使用

4

2 回答 2

1

您可以使用Jenkins Adaptive Plugin编写脚本以由 SVN 触发并创建一个新构建,而不管当前正在运行什么。

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

于 2012-11-08T19:18:13.440 回答
0

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

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

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

在我的设置中,JobA_trigger 会定期轮询 SCM。如果有变化,则通过 curl 触发 JobA 并提交当前日期时间²。这种“外部”触发是向 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 本身是参数化的,并接受一个字符串参数“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

于 2012-11-12T16:05:22.160 回答