我想在声明性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 ...
有没有办法告诉詹金斯跳过--no-tags
参数?
因为我事先不知道如何标记提交,所以我想从git中签出标签并将其用作变量。因此,this question中的解决方案在这里不可行。
答案 0 :(得分:2)
我们可以使用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}"
}
}
}
}
}
答案 1 :(得分:0)
如注释中所述,sh
不返回任何内容。
您可以执行env.MY_GIT_TAG = sh(returnStdout: true, script: 'git tag -l --points-at HEAD').trim()
来返回标准输出。
答案 2 :(得分:0)
正如泰利(Tai Ly)所述,这里描述了两种可能的解决方案here
解决方案1)
您可以在Jenkins文件中创建将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 Web界面的分支源行为中添加“高级克隆行为”条目。也可以在GitHub / Bitbucket plugins&co的组织/团队级别进行设置。