如何从Jenkins WorkflowRun获取Git RefSpec的完整信息?
解决Jenkins WorkflowRun获取完整SCM RefSpec为空的问题
问题原因
流水线运行实例(WorkflowRun)中的SCM对象通常仅存储运行时执行checkout所需的最小信息,完整的RefSpec配置实际保存在流水线任务(WorkflowJob)本身;如果是通过checkout步骤动态配置的SCM,相关信息会存在构建的SCMCheckoutAction中。
解决方案
方案1:从WorkflowJob直接获取完整SCM配置
如果流水线使用的是任务本身配置的SCM(非动态checkout),直接从Job对象提取即可拿到完整RefSpec:
String jobName = "path/to/myJobName" def workflowJob = Hudson.getInstance().getItemByFullName(jobName) // 从Job对象获取完整的SCM配置 List<hudson.scm.SCM> scms = workflowJob.getSCMs() for (hudson.scm.SCM scm in scms) { scm.getUserRemoteConfigs().each { config -> println("仓库URL: ${config.url}") println("RefSpec: ${config.refspec ?: '未配置'}") println("---") } }
方案2:从构建的SCMCheckoutAction提取动态checkout的信息
如果流水线是通过checkout scm或自定义checkout步骤动态配置的SCM,需要从构建动作中提取:
String jobName = "path/to/myJobName" def workflowJob = Hudson.getInstance().getItemByFullName(jobName) def currentRun = workflowJob.getLastBuild() // 获取构建中的SCM checkout动作集合 def checkoutActions = currentRun.getActions(hudson.scm.SCMCheckoutAction.class) checkoutActions.each { action -> action.getSCMs().each { scm -> scm.getUserRemoteConfigs().each { config -> println("仓库URL: ${config.url}") println("RefSpec: ${config.refspec ?: '未配置'}") println("---") } } }
补充方案:从构建环境变量提取
部分场景下,RefSpec会被注入到构建环境变量中,可以尝试读取相关变量:
String jobName = "path/to/myJobName" def workflowJob = Hudson.getInstance().getItemByFullName(jobName) def currentRun = workflowJob.getLastBuild() def env = currentRun.getEnvironment(null) // 打印所有包含REFSPEC的环境变量 env.each { k, v -> if (k.contains("REFSPEC")) { println("${k}: ${v}") } }
内容的提问来源于stack exchange,提问作者Em0ry42
相关产品推荐
相关产品推荐

