如何无需Git拉取获取Jenkins多分支流水线的GIT_URL与GIT_BRANCH
多分支流水线中无需触发Git拉取即可获取GIT_URL和GIT_BRANCH?
我使用Jenkins多分支流水线,通过如下Jenkinsfile自行执行代码拉取操作:
pipeline { options { skipDefaultCheckout() // 禁止构建任务自动执行checkout } stages { stage('Checkout') { // 使用scm变量执行本地拉取 def vars = checkout(scm) // 从返回的scm变量中获取git地址和分支 echo "GIT_URL = ${vars.GIT_URL}" echo "GIT_BRANCH = ${vars.GIT_BRANCH}" } } }
由于我的Git仓库体积庞大,拉取操作耗时较长,因此希望在执行checkout前获取GIT_URL和GIT_BRANCH。但访问scm全局变量会触发git fetch操作,同样耗时。请问是否存在无需执行git checkout步骤或触发git fetch操作,就能获取GIT_URL和GIT_BRANCH的方法?
解决方案
有两种可靠的方法可以在不触发Git拉取的前提下获取所需信息:
方法1:直接使用Jenkins多分支流水线注入的环境变量
Jenkins多分支流水线会自动将仓库URL和分支名注入到环境变量中,你可以直接读取env.GIT_URL和env.GIT_BRANCH,完全不需要访问scm对象或执行checkout:
pipeline { options { skipDefaultCheckout() } stages { stage('获取仓库信息') { steps { echo "GIT_URL = ${env.GIT_URL}" echo "GIT_BRANCH = ${env.GIT_BRANCH}" } } stage('Checkout') { steps { def vars = checkout(scm) // 后续拉取后的操作 } } } }
方法2:直接读取scm对象的配置属性
如果环境变量无法满足需求(比如需要更复杂的仓库配置信息),可以直接读取scm对象的内置属性,这种操作不会触发Git fetch或checkout,因为只是读取流水线预先配置好的参数:
pipeline { options { skipDefaultCheckout() } stages { stage('获取仓库信息') { steps { script { def gitUrl = scm.userRemoteConfigs[0].url // 分支名可能带refs/heads/前缀,可根据需求去除 def gitBranch = scm.branches[0].name.replace('refs/heads/', '') echo "GIT_URL = ${gitUrl}" echo "GIT_BRANCH = ${gitBranch}" } } } stage('Checkout') { steps { def vars = checkout(scm) } } } }
这两种方法都不会触发任何Git拉取操作,因为都是读取Jenkins已经保存的流水线配置信息,而非执行实际的仓库同步动作。
内容的提问来源于stack exchange,提问作者John Q Citizen
相关产品推荐
相关产品推荐

