2015-06-29 178 views
16

在一个正常的自由式项目中,我将SCM插件配置为指向我想要发布的Git仓库,并启用“Poll SCM”选项,该选项允许我配置一个Stash webhook,告诉Jenkins每当该回购有变化时。通过这种方式,只要将更改推送到回购库,就可以触发作业。如何使SCM轮询与Jenkins Workflow插件配合使用

但是,当我使用工作流而不是自由式项目时,需要构建的代码的SCM以编程方式在groovy工作流脚本中指定,这意味着它不会侦听Stash webhook。相反,直接在工作流中配置的SCM是groovy脚本本身的SCM,它与我试图构建/发布的代码库不同,所以我不希望触发器基于此。

node('docker_builder') { 
    git url: serviceRepo 
    releaseVersion = getVersion() 
    pipelineSpec = getPipelineSpec() 
    sh "./gradlew clean build pushDockerImage" 
} 

使用工作流程插件时如何实现SCM轮询的任何想法?

回答

30

我已经用大量的研究和实验解决了这个问题。这个文档让我走上了正确的轨道:https://github.com/jenkinsci/workflow-scm-step-plugin/blob/master/README.md。它说:

轮询跨多个供应链管理系统的支持(在一个或更多的变化将触发一个新的版本),并再次根据在工作流程的最后建造中使用的供应链管理系统进行“

这意味着SCM轮询仍然支持Jenkins工作流程,但与普通自由式项目不同,您必须在开始监听SCM更改之前手动运行一次,这很有意义,因为SCM是在Groovy代码中定义的;它们直到他们运行一次才知道。

这是一个棘手的因素,你可以在您的工作流程中定义许多SCM。例如,我有三个:一个用于服务本身,一个部署脚本和Groovy工作流DSL。默认情况下,对这三个SCM中的任何一个的更改都会导致“SCM轮询”选项触发构建,这可能不合意。幸运的是,在Groovy代码的“git”步骤中设置“poll:false”选项将禁用对该回购的轮询。如果您正在从SCM读取您的Groovy DSL,则可以通过单击Jenkins UI中的“其他行为”并添加“不触发构建在提交通知上”来禁用对该回购的轮询。

另一个棘手的因素是默认情况下,Stash Web挂钩插件包含在与Jenkins匹配的RESTful URL中提交的SHA1哈希码。不幸的是,Jenkins在尝试提取可能已经定义的多个SCM时使用了相同的提交代码。哈希码当然只与一个SCM有关,所以它会中断。您可以通过在Stash Web挂钩插件中设置“省略SHA1散列代码”来解决此问题。然后,詹金斯将在每个SCM的任何分支上使用最新的提交。

+0

不熟悉Stash插件,但关于提交哈希的警告可能适用于[GitHub插件](https://issues.jenkins-ci.org/browse/JENKINS-27136)。 –

+0

对于父作业的轮询,您有任何特殊配置(您在此启用了哪些触发器)?我似乎无法得到轮询工作,当我去查看配置生成的作业(从jenkinsfile),我没有看到任何触发器启用。 – Woland

相关问题