Jenkinsfile 获取当前标签
Jenkinsfile get current tag
有没有办法获取 Jenkinsfile 中作业的当前标签(如果有 none 则为 null )?背景是当此提交具有标签时,我只想构建一些工件(android APKs)。
我试过了:
env.TAG_NAME
和
binding.variables.get("TAG_NAME")
两者始终为空 - 即使此 (https://issues.jenkins-ci.org/browse/JENKINS-34520) 另有指示
sh "git tag --sort version:refname | tail -1 > version.tmp"
String tag = readFile 'version.tmp'
我会考虑 returnStdout
而不是写入文件:
sh(returnStdout: true, script: "git tag --sort version:refname | tail -1").trim()
即使未标记 HEAD,所有其他答案在任何情况下都会产生输出。然而,问题是 return current 标签和 "null" 如果没有那样的话。
git tag --contains
当且仅当 HEAD 被标记时产生标签名称 name。
对于 Jenkins 管道,它应该如下所示:
sh(returnStdout: true, script: "git tag --contains").trim()
我相信 git 命令可以执行您想要的操作 git tag --points-at=HEAD
这将列出所有指向当前提交或 HEAD 的标记,因为它通常在 git 中调用。由于 HEAD 也是默认参数,因此您也可以只执行 git tag --points-at
.
每行一个执行和返回git标签的流水线步骤,则变为:
sh(returnStdout: true, script: "git tag --points-at")
如果当前构建是标签构建——如 when { buildingTag() }
是 "true"——那么(未记录的)环境变量 BRANCH_NAME
包含标签的名称构建。
我网站的最佳方式是:
git tag --sort=-creatordate | head -n 1
与:
latestTag = sh(returnStdout: true, script: "git tag --sort=-creatordate | head -n 1").trim()
你可以用简单的正则表达式来处理,因为 prefix/suffix/version_number 标签的作用。
其他解法:
git describe --tags --abbrev=0
当然这是git中的current/latest标签。独立于写作。
sh(returnStdout: true, script: "git describe --tags --abbrev=0").trim()
TAG_NAME
现在至少可以在声明性管道中工作。
When
条件实际上在此 属性 上过滤。 BRANCH_NAME
具有相同的值。
stage('release') {
when {
tag 'release-*'
}
steps {
echo "Building $BRANCH_NAME"
echo "Building $TAG_NAME"
}
}
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 的新手,这可能会写得更多 simply/cleanly(欢迎提出建议)。
(使用 Jenkins 2.268)
有没有办法获取 Jenkinsfile 中作业的当前标签(如果有 none 则为 null )?背景是当此提交具有标签时,我只想构建一些工件(android APKs)。 我试过了:
env.TAG_NAME
和
binding.variables.get("TAG_NAME")
两者始终为空 - 即使此 (https://issues.jenkins-ci.org/browse/JENKINS-34520) 另有指示
sh "git tag --sort version:refname | tail -1 > version.tmp"
String tag = readFile 'version.tmp'
我会考虑 returnStdout
而不是写入文件:
sh(returnStdout: true, script: "git tag --sort version:refname | tail -1").trim()
即使未标记 HEAD,所有其他答案在任何情况下都会产生输出。然而,问题是 return current 标签和 "null" 如果没有那样的话。
git tag --contains
当且仅当 HEAD 被标记时产生标签名称 name。
对于 Jenkins 管道,它应该如下所示:
sh(returnStdout: true, script: "git tag --contains").trim()
我相信 git 命令可以执行您想要的操作 git tag --points-at=HEAD
这将列出所有指向当前提交或 HEAD 的标记,因为它通常在 git 中调用。由于 HEAD 也是默认参数,因此您也可以只执行 git tag --points-at
.
每行一个执行和返回git标签的流水线步骤,则变为:
sh(returnStdout: true, script: "git tag --points-at")
如果当前构建是标签构建——如 when { buildingTag() }
是 "true"——那么(未记录的)环境变量 BRANCH_NAME
包含标签的名称构建。
我网站的最佳方式是:
git tag --sort=-creatordate | head -n 1
与:
latestTag = sh(returnStdout: true, script: "git tag --sort=-creatordate | head -n 1").trim()
你可以用简单的正则表达式来处理,因为 prefix/suffix/version_number 标签的作用。
其他解法:
git describe --tags --abbrev=0
当然这是git中的current/latest标签。独立于写作。
sh(returnStdout: true, script: "git describe --tags --abbrev=0").trim()
TAG_NAME
现在至少可以在声明性管道中工作。
When
条件实际上在此 属性 上过滤。 BRANCH_NAME
具有相同的值。
stage('release') {
when {
tag 'release-*'
}
steps {
echo "Building $BRANCH_NAME"
echo "Building $TAG_NAME"
}
}
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 的新手,这可能会写得更多 simply/cleanly(欢迎提出建议)。
(使用 Jenkins 2.268)