Jenkins 工作流(流水线)——仅在 SCM 发生变化时构建作业
Jenkins workflow (pipeline) - build job only when there are SCM changes
我正在使用工作流插件(重命名为管道插件)创建相当复杂的工作流。为简单起见,我们假设我需要构建一个作业,但这个作业非常昂贵并且不需要每次都构建。仅当有一些 SCM 更改时。
所以我们称这个工作为 expensiveJob 它是源代码管理 SCMRepositoryA.
所以我基本上想说
build job: 'expensiveJob'
我想轮询 SCM 更改并根据该信息构建作业。
有没有办法做到这一点?
我目前的解决方案是我必须在管道脚本中检出 SCMRepositoryA 然后检查 currentBuild.rawBuild.changeSets 在我看来,我喜欢做很多不必要的工作,并且可能必须与我工作中的任何源代码管理更改保持一致..
目前没有与 build
步骤等效的步骤,它只会启动轮询,而不是无条件地安排构建。
编写这样的步骤,或将其作为 build
步骤的选项,我认为不会特别困难。同时,对于非沙盒脚本,您可以直接调用 Jenkins API:如果下游项目配置了 SCM 触发器(只需要轮询 @daily
,或者没有时间表全部),然后
Jenkins.instance.getItemByFullName('downstream').SCMTrigger.run()
可能足以立即安排轮询(未经测试)。或者,如果您想 运行 直接轮询,或者不想假设一个空白的 `SCMTrigger,那么
if (Jenkins.instance.getItemByFullName('downstream').poll(TaskListener.NULL).hasChanges()) {
build 'downstream'
}
(再次未经测试)可以工作。但是,API 调用可能需要包装在 @NonCPS
方法中,因为中间结果不是 Serializable
:
if (poll('downstream')) {
build 'downstream'
}
@NonCPS boolean poll(String job) {
Jenkins.instance.getItemByFullName(job).poll(TaskListener.NULL).hasChanges()
}
使用已接受的答案,这就是我设置声明性管道以跳过一些昂贵的阶段的方式,这些阶段取决于作业是否是最新的
stages {
stage('Need to build?') {
steps {
script {
env.changesPending = Jenkins.instance.getItemByFullName('expensive').poll(hudson.model.TaskListener.NULL).hasChanges()
echo "env.changesPending=" +env.changesPending
}
}
}
stage('Pre-requisites') {
when {
expression { env.changesPending == true }
}
steps {
build 'expensive'
}
}
...
这需要 http://your-jenkins/scriptApproval/ 中的几个脚本授权才能工作
我正在使用工作流插件(重命名为管道插件)创建相当复杂的工作流。为简单起见,我们假设我需要构建一个作业,但这个作业非常昂贵并且不需要每次都构建。仅当有一些 SCM 更改时。
所以我们称这个工作为 expensiveJob 它是源代码管理 SCMRepositoryA.
所以我基本上想说
build job: 'expensiveJob'
我想轮询 SCM 更改并根据该信息构建作业。
有没有办法做到这一点?
我目前的解决方案是我必须在管道脚本中检出 SCMRepositoryA 然后检查 currentBuild.rawBuild.changeSets 在我看来,我喜欢做很多不必要的工作,并且可能必须与我工作中的任何源代码管理更改保持一致..
目前没有与 build
步骤等效的步骤,它只会启动轮询,而不是无条件地安排构建。
编写这样的步骤,或将其作为 build
步骤的选项,我认为不会特别困难。同时,对于非沙盒脚本,您可以直接调用 Jenkins API:如果下游项目配置了 SCM 触发器(只需要轮询 @daily
,或者没有时间表全部),然后
Jenkins.instance.getItemByFullName('downstream').SCMTrigger.run()
可能足以立即安排轮询(未经测试)。或者,如果您想 运行 直接轮询,或者不想假设一个空白的 `SCMTrigger,那么
if (Jenkins.instance.getItemByFullName('downstream').poll(TaskListener.NULL).hasChanges()) {
build 'downstream'
}
(再次未经测试)可以工作。但是,API 调用可能需要包装在 @NonCPS
方法中,因为中间结果不是 Serializable
:
if (poll('downstream')) {
build 'downstream'
}
@NonCPS boolean poll(String job) {
Jenkins.instance.getItemByFullName(job).poll(TaskListener.NULL).hasChanges()
}
使用已接受的答案,这就是我设置声明性管道以跳过一些昂贵的阶段的方式,这些阶段取决于作业是否是最新的
stages {
stage('Need to build?') {
steps {
script {
env.changesPending = Jenkins.instance.getItemByFullName('expensive').poll(hudson.model.TaskListener.NULL).hasChanges()
echo "env.changesPending=" +env.changesPending
}
}
}
stage('Pre-requisites') {
when {
expression { env.changesPending == true }
}
steps {
build 'expensive'
}
}
...
这需要 http://your-jenkins/scriptApproval/ 中的几个脚本授权才能工作