Groovy获取Jenkins Pipeline SCM(Git)配置的正确仓库URL方案
为什么
getUserRemoteConfigs()返回错误值 绝大多数网上可查的获取Jenkins作业Git地址的Groovy脚本,都是针对自由风格项目编写的,这类作业的SCM配置直接挂载在作业根节点下。但选择「Pipeline script from SCM」定义方式的Pipeline作业,Git仓库配置存储在Pipeline定义的子节点中,直接调用作业根节点的SCM相关方法,拿到的是作业其他模块(比如SCM轮询触发器、历史残留配置)的参数,自然和GUI中Pipeline Definition板块展示的配置不匹配。
正确实现代码
以下脚本可直接在Jenkins Script Console中运行,会遍历所有层级文件夹下、以Git作为SCM源的Pipeline from SCM作业,输出作业名、对应仓库地址、分支规则、Jenkinsfile路径:
import jenkins.model.Jenkins import org.jenkinsci.plugins.workflow.job.WorkflowJob Jenkins.instance.getAllItems(WorkflowJob.class).each { job -> def flowDefinition = job.getDefinition() // 过滤非SCM来源的Pipeline作业 if (flowDefinition.class.simpleName != 'CpsScmFlowDefinition') { return } def scm = flowDefinition.getScm() // 过滤非Git类型的SCM配置 if (scm.class.simpleName != 'GitSCM') { return } // 读取配置值 def remoteConfigs = scm.getUserRemoteConfigs() if (remoteConfigs.isEmpty()) { return } def repoUrl = remoteConfigs[0].getUrl() def branch = scm.getBranches().isEmpty() ? "未配置分支" : scm.getBranches()[0].getName() def jenkinsfilePath = flowDefinition.getScriptPath() println "作业全路径: ${job.fullName}" println "Git仓库URL: ${repoUrl}" println "拉取分支规则: ${branch}" println "Jenkinsfile相对路径: ${jenkinsfilePath}" println "----------------------------------------" } return "所有匹配作业遍历完成"
补充说明
- 脚本会自动递归遍历Jenkins文件夹、视图下嵌套存储的所有Pipeline作业,无需额外编写路径遍历逻辑
- 若作业配置了多个Git远程仓库,可遍历
remoteConfigs列表输出所有仓库地址,无需固定取第一个配置 - 若执行后仍有作业返回值和GUI展示不一致,优先排查是否安装了配置动态修改插件、是否通过JCasC配置了值覆盖,或者作业存在未保存的配置草稿
- 执行脚本需要Jenkins管理员权限,Script Console运行的Groovy脚本拥有最高操作权限,执行前请确认脚本逻辑无风险
内容的提问来源于stack exchange,提问作者John W
相关产品推荐
相关产品推荐

