我正在努力访问我的 Jenkins 管道中的 GIT 变量
我需要知道在管道的某个阶段的某些 bash 代码中检查了哪个 GIT 分支。我将使用它来创建不同的输出文件名。我的管道是声明性的,而不是脚本化的,我使用的是 Jenkins 2.150.1
我尝试了所有可以在网上找到的东西,但大多是不完整的代码或脚本管道。或者干脆我不能把这些信息放在一起。
给我花多少时间,如果有一个使用声明性管道的完整工作示例会很好。
这是我到目前为止尝试过的:
#1
运行 git inside sh
,但 Jenkins 检出提交,而不是分支,导致分离头
#2
从 shell 中查找环境变量,但没有设置与 GIT 相关的变量。这个片段
steps {
sh 'echo $GIT_BRANCH'
}
Run Code Online (Sandbox Code Playgroud)
总是返回空。然后我尝试了 Groovy:
steps {
echo "${env.GIT_BRANCH}"
}
Run Code Online (Sandbox Code Playgroud)
打印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.
Run Code Online (Sandbox Code Playgroud)
我在网上搜索了如何做到这一点,并将此代码放在一起:
pipeline {
stages {
stage('Build') {
steps {
def scmVars = checkout([...])
echo 'scm : the commit id is ' + scmVars.GIT_COMMIT
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它失败了,有一个例外
#4
使用environment
命令并尝试以某种方式获取该值
#5
在 Jenkinsfile 中寻找其他级别的变量,但显然我只能在脚本化管道上这样做
#5
试图访问构建 url 和 API 调用,但我是代理,这使 URL 变得复杂。
我的詹金斯档案
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
'''
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Col*_*RiX 15
最后我找到了一个例子,我能够理解如何做到这一点。
我需要使用脚本命令,获取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
...
}
}
Run Code Online (Sandbox Code Playgroud)
引用文档:
\n\n\nGIT_BRANCH
\n对于基于 Git 的项目,此变量包含为构建签出的 Git 分支(通常为 origin/master)
\n
特别是对于 Pipeline 插件, StackOverflow上有这个问题的答案:
\n\n\nenv.BRANCH_NAME 变量包含分支名称。
\n从 Pipeline Groovy Plugin 2.18 开始,您也可以只使用 BRANCH_NAME (env 不是必需的,但仍然可以接受。)
\n
该变量可能为空:
\n\n\n如果您的存储库托管在已知服务中,例如 GitHUB、GitLab、BitBucket 等 xe2x80xa6 那么 xe2x80x99 可能是一个 Jenkins 插件,该插件知道如何使用每一项服务并且为您提供\n环境变量,例如 GIT_BRANCH、GIT_COMMIT、BUILD_TAG 等\xe2\x80\xa6\n因此通常最好的做法是使用此类插件。
\n但是,如果您的 git 存储库托管在 Microsoft TFS 上,则 \n\n\n\n\xe2\x80\x99s 没有这样的插件(目前)可以很好地与 Jenkins 作业的管道类型配合使用。
\n在这种情况下,您可能会使用 \xe2\x80\x9cPipeline: SCM Step\xe2\x80\x9d 克隆存储库。
\n
以下应该解决这个问题:
\n\n\n\n在结账步骤中将 [$class: \'LocalBranch\', localBranch: "**"] 添加到 \xe2\x80\x9cextentions\xe2\x80\x9d 中。
\n
归档时间: |
|
查看次数: |
45751 次 |
最近记录: |