如何使用 Jenkins Workflow 插件进行 SCM 轮询

How to make SCM polling work with the Jenkins Workflow plugin

在普通的自由式项目中,我将 SCM 插件配置为指向我要发布的 Git 存储库,并启用 "Poll SCM" 选项,这允许我配置一个 Stash webhook 在该 repo 发生更改时告诉 Jenkins。这样,只要有更改推送到 repo,就可以触发作业。

但是当我使用工作流而不是自由式项目时,我需要构建的代码的 SCM 是在 groovy 工作流脚本中以编程方式指定的,这意味着它没有监听 Stash网络钩子。相反,直接在工作流中配置的 SCM 是 groovy 脚本本身的 SCM,这与我尝试 build/release 的代码库不同,所以我不希望触发器以此为基础。

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

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

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

Polling is supported across multiple SCMs (changes in one or more will trigger a new build), and again is done according to the SCMs used in the last build of the workflow."

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

其中一个棘手的因素是您可以在工作流程中定义多个 SCM。例如,我有三个:一个用于服务本身、一个部署脚本和 Groovy 工作流 DSL。默认情况下,更改这三个 SCM 中的任何一个都会导致 "SCM poll" 选项触发构建,这可能是不可取的。幸运的是,在 Groovy 代码的 "git" 步骤上设置 "poll: false" 选项将禁用对该 repo 的轮询。如果您正在从 SCM 读取 Groovy DSL,那么您可以通过单击 Jenkins UI 中的 "additional behaviors" 并添加 "Don't trigger a build on commit notifications".[=12= 来禁用对该回购的轮询]

另一个棘手的因素是,Stash web hook 插件默认在 RESTful URL 中包含提交的 SHA1 哈希码,它会命中 Jenkins。不幸的是,Jenkins 在尝试提取您可能已定义的多个 SCM 中的任何一个时犯了使用相同提交代码的错误。哈希码当然只与一个 SCM 相关,因此它会中断。您可以通过在 Stash 网络挂钩插件中设置 "Omit SHA1 Hash Code" 来解决这个问题。然后 Jenkins 将只在您从每个 SCM 中构建的任何分支上使用最新的提交。