如何将当前分支中的 GIT 标记读入变量?
How can I read a GIT tag from the current branch into a variable?
我想在我的声明性 Jenkins 管道中使用 git 标签。我的 Jenkinsfile 看起来像这样
pipeline {
agent any
stages {
stage('Setup') {
steps {
script {
env.MY_GIT_TAG = sh(returnStdout: true, script: 'git tag -l --points-at HEAD')
// ...
}
}
}
stage('Build'){
// build my code etc ....
}
stage('Publish') {
// push code somewhere depending on tag
sh "curl -X POST --upload-file ./MyDeployable https://someserver/uri/MyDeployable-${env.MY_GIT_TAG}"
}
}
}
但是环境变量MY_GIT_TAG
一直是空的。经过一番调查后,我在我的 Jenkins 日志中注意到了这一点:
git fetch --no-tags --progress ...
有没有办法告诉 Jenkins 跳过 --no-tags
参数?
因为我事先不知道提交是如何标记的,所以我想从 git 中检出标记并将其用作变量。所以this question中的解决方案在这里不可行。
如评论中所述,sh
return 没什么。
您可以对标准输出执行 env.MY_GIT_TAG = sh(returnStdout: true, script: 'git tag -l --points-at HEAD').trim()
到 return。
正如 Tai Ly 所提到的,描述了两种可能的解决方案 here
解决方案 1)
您可以在 Jenkinsfile 中创建自定义结帐,将 noTags
设置为 false。
checkout([
$class: 'GitSCM',
branches: scm.branches,
doGenerateSubmoduleConfigurations: scm.doGenerateSubmoduleConfigurations,
extensions: [[$class: 'CloneOption', noTags: false, shallow: false, depth: 0, reference: '']],
userRemoteConfigs: scm.userRemoteConfigs,
])
解决方案 2)
在 Jenkins 网络界面的分支源行为中添加一个 "Advanced Clone Behaviours" 条目。它也可以在 Organization/Team-level for GitHub/Bitbucket plugins & co.
我们可以用,sh(returnStdout: true, script: "git tag --sort=-creatordate | head -n 1").trim()
把这个放到一个变量里用。
pipeline {
agent any
stages {
stage('get git tag') {
steps {
script {
latestTag = sh(returnStdout: true, script: "git tag --sort=-creatordate | head -n 1").trim()
env.BUILD_VERSION = latestTag
echo "env-BUILD_VERSION"
echo "${env.BUILD_VERSION}"
}
}
}
}
}
我想在我的声明性 Jenkins 管道中使用 git 标签。我的 Jenkinsfile 看起来像这样
pipeline {
agent any
stages {
stage('Setup') {
steps {
script {
env.MY_GIT_TAG = sh(returnStdout: true, script: 'git tag -l --points-at HEAD')
// ...
}
}
}
stage('Build'){
// build my code etc ....
}
stage('Publish') {
// push code somewhere depending on tag
sh "curl -X POST --upload-file ./MyDeployable https://someserver/uri/MyDeployable-${env.MY_GIT_TAG}"
}
}
}
但是环境变量MY_GIT_TAG
一直是空的。经过一番调查后,我在我的 Jenkins 日志中注意到了这一点:
git fetch --no-tags --progress ...
有没有办法告诉 Jenkins 跳过 --no-tags
参数?
因为我事先不知道提交是如何标记的,所以我想从 git 中检出标记并将其用作变量。所以this question中的解决方案在这里不可行。
如评论中所述,sh
return 没什么。
您可以对标准输出执行 env.MY_GIT_TAG = sh(returnStdout: true, script: 'git tag -l --points-at HEAD').trim()
到 return。
正如 Tai Ly 所提到的,描述了两种可能的解决方案 here
解决方案 1)
您可以在 Jenkinsfile 中创建自定义结帐,将 noTags
设置为 false。
checkout([
$class: 'GitSCM',
branches: scm.branches,
doGenerateSubmoduleConfigurations: scm.doGenerateSubmoduleConfigurations,
extensions: [[$class: 'CloneOption', noTags: false, shallow: false, depth: 0, reference: '']],
userRemoteConfigs: scm.userRemoteConfigs,
])
解决方案 2)
在 Jenkins 网络界面的分支源行为中添加一个 "Advanced Clone Behaviours" 条目。它也可以在 Organization/Team-level for GitHub/Bitbucket plugins & co.
我们可以用,sh(returnStdout: true, script: "git tag --sort=-creatordate | head -n 1").trim()
把这个放到一个变量里用。
pipeline {
agent any
stages {
stage('get git tag') {
steps {
script {
latestTag = sh(returnStdout: true, script: "git tag --sort=-creatordate | head -n 1").trim()
env.BUILD_VERSION = latestTag
echo "env-BUILD_VERSION"
echo "${env.BUILD_VERSION}"
}
}
}
}
}