如何从当前分支读取GIT标签到变量?

时间:2018-12-17 12:39:53

标签: git jenkins jenkins-pipeline jenkins-groovy jenkins-declarative-pipeline

我想在声明性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中的解决方案在这里不可行。

3 个答案:

答案 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的组织/团队级别进行设置。