我无法在 Jenkins 管道中访问 GIT 变量
我需要知道在管道的某个阶段中,某个 bash 代码中签出了哪个 GIT 分支。我将使用它来创建不同的输出文件名。我的管道是声明式的,而不是脚本式的,我使用的是 Jenkins 2.150.1
我尝试了网上能找到的所有方法,但大多数都是不完整的代码或脚本管道。或者根本无法将信息整合在一起。
考虑到我在这上面花了多少时间,如果有一个使用声明性管道的完整工作示例就好了。
这是我迄今为止尝试过的:
#1
在里面运行 git sh
,但 Jenkins 签出的是提交,而不是分支,导致头部分离
#2
从 shell 中查找环境变量,但没有设置与 GIT 相关的变量。此代码片段
steps {
sh 'echo $GIT_BRANCH'
}
总是返回空。然后我在 Groovy 上尝试:
steps {
echo "${env.GIT_BRANCH}"
}
印刷null
。
#3
在“全局变量参考”中有这样一段话:
SCM-specific variables such as GIT_COMMIT are not automatically defined as environment variables; rather you can use the return value of the checkout step.
我在网上搜索了如何做到这一点,并整理了以下代码:
pipeline {
stages {
stage('Build') {
steps {
def scmVars = checkout([...])
echo 'scm : the commit id is ' + scmVars.GIT_COMMIT
}
}
}
}
但它失败了,出现了异常
#4
使用environment
命令并尝试以某种方式获取该值
#5
在 Jenkinsfile 中寻找其他级别的变量,但显然我只能在脚本管道上执行此操作
#5
尝试访问构建 URL 和 API 调用,但我使用了代理,这使 URL 变得复杂。
我的 Jenkinsfile
pipeline {
stages {
stage('Build') {
steps {
checkout([
$class: 'GitSCM',
doGenerateSubmoduleConfigurations: false,
userRemoteConfigs: [[
url: '...',
credentialsId: '...'
]],
branches: [ [name: '*/master'] ]
])
sh '''
#!/bin/bash -x
echo $MY_GIT_BRANCH_THAT_I_CANT_FIND
'''
}
}
}
}
答案1
最后我找到了一个例子并且能够理解如何做到这一点。
我需要使用脚本命令,获取Map
返回的checkout
并将其保存Map
为环境变量:
stage('Checkout code') {
steps {
script {
// Checkout the repository and save the resulting metadata
def scmVars = checkout([
$class: 'GitSCM',
...
])
// Display the variable using scmVars
echo "scmVars.GIT_COMMIT"
echo "${scmVars.GIT_COMMIT}"
// Displaying the variables saving it as environment variable
env.GIT_COMMIT = scmVars.GIT_COMMIT
echo "env.GIT_COMMIT"
echo "${env.GIT_COMMIT}"
}
// Here the metadata is available as environment variable
...
}
}
答案2
引用文档:
GIT_BRANCH
对于基于 Git 的项目,此变量包含为构建而签出的 Git 分支(通常是 origin/master)
对于 Pipeline 插件,这个问题的答案在堆栈溢出:
env.BRANCH_NAME 变量包含分支名称。
从 Pipeline Groovy Plugin 2.18 开始,您也可以只使用 BRANCH_NAME(env 不是必需的但仍然可以接受。)
该变量可能为空:
如果您的存储库托管在已知服务中,例如 GitHUB、GitLab、BitBucket 等...那么可能有一个 Jenkins 插件知道如何与每个服务协同工作并为您提供环境变量,例如 GIT_BRANCH、GIT_COMMIT、BUILD_TAG 等...因此使用这样的插件通常是最佳做法。
但是如果你的 git 存储库托管在 Microsoft TFS 上,那么目前没有这样的插件可以与管道类型的 Jenkins 作业很好地配合使用。
在这种情况下,您可能会使用“管道:SCM 步骤”来克隆存储库。
下面的方法可以修复这个问题:
在结帐步骤中的“extentions”中添加 [$class: 'LocalBranch', localBranch: "**"]。
答案3
使用 step 时,Git 环境变量不会自动设置checkout
。相反,它们会作为 Map 返回,我们必须自己设置它们。
pipeline {
options {
skipDefaultCheckout true
}
stages {
stage('Checkout source code') {
steps {
script {
Map scmVars = checkout([/* Some checkout paramaters */])
// Setting up GIT_* env variables manually
scmVars.each { k, v ->
env[k] = v
}
}
}
}
stage('Print GIT env variables'){
steps {
sh 'env | grep GIT_'
}
}
}
}
答案4
我发现这很有效。定义一个可以在后续阶段使用的环境变量。
environment {
GIT_COMMIT_REV=''
}
stages {
stage('Configure') {
steps {
script {
GIT_COMMIT_REV = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim()
}
}
}
}