在普通的自由式项目中,我将 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 轮询有什么想法吗?
我通过大量的研究和实验解决了这个问题。该文档让我走上了正轨:https://github.com/jenkinsci/workflow-scm-step-plugin/blob/master/README.md https://github.com/jenkinsci/workflow-scm-step-plugin/blob/master/README.md。它说:
支持跨多个 SCM 进行轮询(一个或多个 SCM 中的更改将触发新的构建),并且再次根据工作流程的最后一个构建中使用的 SCM 进行轮询。”
这意味着 Jenkins 工作流程仍然支持 SCM 轮询,但与普通的自由式项目不同,您必须在开始侦听 SCM 更改之前手动运行一次。这是有道理的,因为 SCM 是在 Groovy 代码中定义的;直到运行一次后才知道它们。
其中一个棘手的因素是您可以在工作流程中定义许多 SCM。例如,我有三个:一个用于服务本身、一个部署脚本和 Groovy 工作流 DSL。默认情况下,对这三个 SCM 中任何一个的更改都会导致“SCM 轮询”选项触发构建,这可能是不可取的。幸运的是,在 Groovy 代码中的“git”步骤上设置“poll: false”选项将禁用对该存储库的轮询。如果您正在从 SCM 读取 Groovy DSL,那么您可以通过单击 Jenkins UI 中的“其他行为”并添加“不要触发构建提交通知”来禁用对该存储库的轮询。
另一个棘手的因素是,Stash Web hook 插件默认包含在 RESTful URL 中提交的 SHA1 哈希码,该 URL 用于访问 Jenkins。不幸的是,当 Jenkins 尝试提取您可能定义的多个 SCM 中的任何一个时,它会犯下使用相同提交代码的错误。当然,哈希码仅与一个 SCM 相关,因此它会被破坏。您可以通过在 Stash Web hook 插件中设置“省略 SHA1 哈希代码”来解决此问题。然后 Jenkins 将仅使用您在每个 SCM 中构建的任何分支上的最新提交。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)