Jenkinsfile获取当前标记

时间:2016-05-27 16:18:11

标签: git jenkins jenkins-2

有没有办法获取Jenkinsfile中作业的当前标记(如果没有则为null)?背景是我只想在这个提交有标签时构建一些工件(android APK)。 我试过了:

env.TAG_NAME

binding.variables.get("TAG_NAME")

两者始终为空 - 即使此(https://issues.jenkins-ci.org/browse/JENKINS-34520)表示否则

8 个答案:

答案 0 :(得分:17)

我会考虑returnStdout而不是写入文件:

sh(returnStdout: true, script: "git tag --sort version:refname | tail -1").trim()

答案 1 :(得分:10)

即使没有标记HEAD,所有其他答案在任何情况下都会产生输出。然而问题是返回当前标签和" null"如果没有那样的话。

当且仅当标记了HEAD时,

git tag --contains才会生成标记名称。

对于Jenkins Pipelines,它应该如下所示:

sh(returnStdout: true, script: "git tag --contains").trim()

答案 2 :(得分:8)

TAG_NAME现在至少应该在声明性管道中起作用。

When条件实际上是对此属性进行过滤。 BRANCH_NAME具有相同的值。

stage('release') {
   when {
     tag 'release-*'
   }
   steps {
     echo "Building $BRANCH_NAME"
     echo "Building $TAG_NAME"
   }
}

请参见https://jenkins.io/doc/book/pipeline/syntax/#when

答案 3 :(得分:1)

sh "git tag --sort version:refname | tail -1 > version.tmp"
String tag = readFile 'version.tmp'

答案 4 :(得分:1)

我相信你想要的git命令是git tag --points-at=HEAD这将列出指向当前提交或HEAD的所有标记,因为它通常在git中调用。由于HEAD也是默认参数,因此您也可以git tag --points-at

用于为每行执行和返回一个git标记的管道步骤,然后变为:

sh(returnStdout: true, script: "git tag --points-at")

答案 5 :(得分:1)

如果当前构建是标签构建,例如when { buildingTag() }为“ true”,则(未记录)环境变量BRANCH_NAME包含正在构建的标签的名称。

答案 6 :(得分:0)

从网站访问的最佳方式是:

git describe --tags --abbrev=0

当然,这是git中的当前/最新标签。独立于写作。

sh(returnStdout: true, script: "git tag describe --tags --abbrev=0").trim()

答案 7 :(得分:0)

遵循 OP 用例的声明性管道示例:“如果此特定提交附加了标签,则执行某些操作”:

def gitTag = null
pipeline {
  agent any
  stages {
    stage('Checkout') {
      steps {
        checkout(...)
        script {
          gitTag=sh(returnStdout: true, script: "git tag --contains | head -1").trim()
        }
      }
    }
    stage('If tagged') {
      when {
        expression {
          return gitTag;
        }
      }
      steps {
        // ... do something only if there's a tag on this particular commit
      }
    }
  }
}

就我而言,我有:

  • 多个项目的一个存储库
  • 每个都有自己的版本标签,例如“MYPROJECT_1.4.23”
  • 例如,我想使用标签“1.4.23”的第二部分来标记我的图像

我需要分析当前标签以检查它是否与我的管道项目有关(每个项目使用一个 PROJECT_NAME 变量):

def gitTag = null
def gitTagVersion = null
pipeline {
  agent any
  stages {
    stage('Checkout') {
      steps {
        checkout(...)
        script {
          gitTag=sh(returnStdout: true, script: "git tag --contains | head -1").trim()
          if(gitTag) {
            def parts = gitTag.split('_')
            if( parts.size()==2 && parts[0]==PROJECT_NAME ) {
              gitTagVersion=parts[1]
            }
          }
        }
      }
    }
    stage('If tagged') {
      when {
        expression {
          return gitTagVersion;
        }
      }
      steps {
        // ... do something only if there's a tag for this project on this particular commit
      }
    }
  }
}

请注意,我是 Jenkins 和 Groovy 的新手,这可能会写得更简单/干净(欢迎提出建议)。

(使用詹金斯 2.268)