如何使用Jenkins工作流插件使SCM轮询正常工作

19
在普通的自由风格项目中,我会配置SCM插件指向我想要发布的Git代码库,并启用“轮询SCM”选项,这样我就可以配置一个Stash webhook,告诉Jenkins每当该代码库发生更改时。通过这种方式,作业可以在每次将更改推送到代码库时触发。
但是当我使用工作流而不是自由风格项目时,需要构建的代码的SCM是通过Groovy工作流脚本以编程方式指定的,这意味着它不会监听Stash webhook。相反,在工作流程中直接配置的SCM是Groovy脚本本身的SCM,它与我试图构建/发布的代码库不同,因此我不希望触发器基于它。
node('docker_builder') {
    git url: serviceRepo
    releaseVersion = getVersion()
    pipelineSpec = getPipelineSpec()
    sh "./gradlew clean build pushDockerImage"
}

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

1个回答

33
我通过大量的研究和实验解决了这个问题。这份文档把我引导到了正确的轨迹上:https://github.com/jenkinsci/workflow-scm-step-plugin/blob/master/README.md。它说:
“支持跨多个SCM进行轮询(一个或多个SCM的更改将触发新的构建),并且再一次是根据工作流程的最后一个构建中使用的SCM执行。”
这意味着SCM轮询仍然支持Jenkins工作流,但与普通自由样式项目不同,您必须手动运行它一次才能开始侦听SCM更改。这很有道理,因为SCM在Groovy代码中定义;只有在运行一次之后才会被识别。
其中一个棘手的元素是,您可以在工作流程中定义许多SCM。例如,我有三个:一个用于服务本身,一个部署脚本和Groovy工作流DSL。默认情况下,对这三个SCM的任何更改都会导致“SCM poll”选项触发一个构建,这可能是不希望发生的。幸运的是,在Groovy代码中的“git”步骤上设置“poll:false”选项将禁用该回购的轮询。如果您正在从SCM读取Groovy DSL,则可以通过在Jenkins UI中单击“附加行为”并添加“不要在提交通知时触发构建”来禁用该回购的轮询。
另一个棘手的元素是,Stash Web Hook插件默认情况下将提交的SHA1哈希代码包括在它向Jenkins发送的RESTful URL中。不幸的是,Jenkins犯了同样的错误,当它尝试拉取您可能定义的多个SCM之一时,使用相同的提交代码。哈希代码仅与一个SCM相关,因此会导致出错。您可以通过在Stash Web Hook插件中设置“省略SHA1哈希代码”来解决这个问题。然后,Jenkins将只使用从每个SCM中构建的任何分支上的最新提交。

不熟悉Stash插件,但是关于提交哈希值的同样警告可能适用于GitHub插件。 - Jesse Glick
你在父任务的轮询方面有任何特殊配置吗(你启用了哪些触发器)?我似乎无法使轮询工作,并且当我转到从Jenkinsfile生成的任务的viewconfiguration时,我没有看到任何启用的触发器。 - Woland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接