Git Jenkins文件获取当前标记

Git Jenkins文件获取当前标记,git,jenkins,jenkins-2,Git,Jenkins,Jenkins 2,是否有方法获取文件中作业的当前标记(如果没有,则为null)?背景是,当这个提交有一个标记时,我只想构建一些工件(android apk)。 我试过: env.TAG_NAME 及 两者都始终为空-即使此()表示其他情况sh“git标记--排序版本:refname | tail-1>version.tmp” String tag=readFile'version.tmp' > p>我会考虑 RealStutdOut/而不是写入文件: sh(returnStdout:true,脚本:“git

是否有方法获取文件中作业的当前标记(如果没有,则为null)?背景是,当这个提交有一个标记时,我只想构建一些工件(android apk)。 我试过:

env.TAG_NAME

两者都始终为空-即使此()表示其他情况

sh“git标记--排序版本:refname | tail-1>version.tmp”
String tag=readFile'version.tmp'

> p>我会考虑<代码> RealStutdOut/<代码>而不是写入文件:


sh(returnStdout:true,脚本:“git tag--sort version:refname | tail-1”).trim()

所有其他答案在任何情况下都会产生输出,即使HEAD没有标记。然而,问题是返回当前标记,如果没有类似的标记,则返回“null”

git-tag--contains
当且仅当HEAD被标记时才产生标记名

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


sh(returnStdout:true,脚本:“git-tag--contains”).trim()

我相信执行您所需操作的git命令是
git-tag--points at=HEAD
这将列出所有指向当前提交或HEAD的标记,正如它在git中通常所调用的那样。因为HEAD也是默认参数,所以您也可以只做
git标记——指向

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


sh(returnStdout:true,script:“git tag--points”)

如果当前构建是一个标记构建--比如,
当{buildingTag()}
为“true”时,那么(未记录的)环境变量
BRANCH_NAME
包含正在构建的标记的名称。

git tag --sort=-creatordate | head -n 1
与:

对于前缀/后缀/版本号,您可以使用简单的正则表达式来处理标记

其他解决方案:

git describe --tags --abbrev=0
当然,这是git中当前/最新的标记。独立于写作

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

至少在声明性管道中,
TAG\u NAME
现在应该可以工作了

条件实际筛选此属性时<代码>分支机构名称
具有相同的值

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

请参见OP用例后面的声明性管道的示例:“如果此特定提交附加了标记,请执行某些操作”:

就我而言,我有:

  • 用于多个项目的一个存储库
  • 每个都有自己的版本标签,如“MYPROJECT_1.4.23”
  • 例如,我想使用标记“1.4.23”的第二部分来标记我的图像
我需要分析当前标记以检查它是否与我的管道项目有关(每个项目使用project\u NAME变量):

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


(使用Jenkins 2.268)

如何设置一个等于该结果的变量?另外,一个更简单的脚本是通过设置一个变量,即
def foo=sh(returnStdout:true,脚本:“git tag--sort version:refname | tail-1”)。trim()
此命令不会返回当前分支中的当前标记,但通常返回最新标记。这不应是可接受的答案。它不符合OP的要求。相反,弗洛里安的答案是肯定的
git-tag--contains
sh(returnStdout:true,脚本:“git-tag--contains”)。trim()
如果头部有多个标记,输出是什么?然后git命令生成多行输出。要考虑头部的多个标记,您可以执行类似于
git-tag--contains | HEAD-1
的操作。
sh(returnStdout: true, script: "git describe --tags --abbrev=0").trim()
stage('release') {
   when {
     tag 'release-*'
   }
   steps {
     echo "Building $BRANCH_NAME"
     echo "Building $TAG_NAME"
   }
}
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
      }
    }
  }
}
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
      }
    }
  }
}