Jenkins 工作流程(管道)- 仅在 SCM 发生更改时构建作业

标签 jenkins jenkins-workflow

我正在使用工作流程插件(重命名为管道插件)创建相当复杂的工作流程。为了简单起见,我们假设我需要构建一个作业,但这个作业非常昂贵,并且不需要每次都构建。仅当 SCM 发生某些变化时。

所以我们将这个作业称为expenseJob,它是源代码管理,SCMRepositoryA

所以我基本上想说

build job: 'expensiveJob'

我想轮询 SCM 更改并根据该信息构建作业。

有办法做到这一点吗?

我当前的解决方案是我必须在管道脚本中 checkout 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 方法中,因为中间结果不可Serialized:

if (poll('downstream')) {
    build 'downstream'
}
@NonCPS boolean poll(String job) {
    Jenkins.instance.getItemByFullName(job).poll(TaskListener.NULL).hasChanges()
}

关于Jenkins 工作流程(管道)- 仅在 SCM 发生更改时构建作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35227779/

相关文章:

nginx - 带有 Nginx 反向代理和解析器的 Jenkins

Docker 构建与 Jenkins 问题

groovy - 有哪些技术可以避免使用 Jenkins 工作流 Groovy 脚本进行脚本审批?

jenkins-workflow - 如何使用 Jenkins Workflow 插件使 SCM 轮询工作

git - 如何在 Jenkins Workflow 插件中使用 SSH key

tomcat - 如何将 Jenkins 与现代日志记录框架一起使用?

jenkins - 如何在多分支管道中为特定分支设置下一个版本号

java - 如何保持当前的 Jenkins 作业执行,直到构建后操作中的依赖作业完成

jenkins - 注释/获取/映射 Testrail 测试用例 ID 到本地 Java TestNG 测试(Jenkins Test Rail 集成)

jenkins - 如何在具有一个或多个 SCM 的 Jenkins 工作流程中找到罪魁祸首或提交者