19

在一个普通的自由式项目中,我将 SCM 插件配置为指向我想要发布的 Git 存储库,并启用“Poll 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 轮询的任何想法?

4

1 回答 1

33

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

多个 SCM 支持轮询(一个或多个的更改将触发新的构建),并且再次根据工作流的最后构建中使用的 SCM 完成。”

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

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

另一个棘手的元素是 Stash web hook 插件默认情况下在 Jenkins 使用的 RESTful URL 中包含提交的 SHA1 哈希码。不幸的是,当 Jenkins 尝试提取您可能定义的多个 SCM 中的任何一个时,它使用相同的提交代码是错误的。哈希码当然只与一个 SCM 相关,因此它会中断。您可以通过在 Stash web hook 插件中设置“省略 SHA1 哈希码”来解决此问题。然后 Jenkins 将只使用您在每个 SCM 中构建的任何分支上的最新提交。

于 2015-06-30T20:45:09.647 回答