我有一些构建逻辑,比如发布,在Jenkins构建Git标签时才希望执行。如何使用Jenkins Declarative Pipeline实现这一目标?
换句话说,我想要构建与Travis CI的标签部署功能相当的功能:
deploy:
[...]
on:
tags: true
有一个内置条件用于检查分支,但我没有看到一个指示标签的条件。
我有一些构建逻辑,比如发布,在Jenkins构建Git标签时才希望执行。如何使用Jenkins Declarative Pipeline实现这一目标?
换句话说,我想要构建与Travis CI的标签部署功能相当的功能:
deploy:
[...]
on:
tags: true
有一个内置条件用于检查分支,但我没有看到一个指示标签的条件。
更新: 从Pipeline Model Definition Plugin的1.2.8版本开始,你现在可以使用buldingTag()
函数:
stage('Deploy') {
when {
buildingTag()
}
steps {
echo 'Replace this with your actual deployment steps'
}
}
TAG_NAME
环境变量一起使用expression
条件。不幸的是,在Groovy级别上无法直接检查环境变量是否已定义(API限制),因此必须在shell中进行测试:stage('Deploy') {
when { expression { sh([returnStdout: true, script: 'echo $TAG_NAME | tr -d \'\n\'']) } }
steps {
echo 'Replace this with your actual deployment steps'
}
}
以上代码利用Groovy中非空字符串为真值的特性。
未来版本可能会引入更简单的方法。请参见jenkinsci/pipeline-model-definition-plugin#240。
TAG_NAME
环境变量,去掉换行符,并返回结果,将其评估为空字符串(false
)或非空字符串(true
),因此如果TAG_NAME具有非空值,则返回true
。 - CodeShane对于整个阶段,@vossad01已经提供了使用when
中的buildingTag()
的答案。
stage('Deploy') {
when {
buildingTag()
beforeAgent true
}
steps {
echo 'deploy something when triggered by tag
}
}
beforeAgent true
是可选的,它确保在代理执行之前检查条件。
如果只是关于阶段内应该有一个基于标签的条件步骤,您可以在script
块中使用Groovy语法(如脚本管道中使用的语法)如下所示。
stage('myStage') {
steps {
echo 'some steps here that should always be executed'
script {
if (env.TAG_NAME) {
echo "triggered by the TAG:"
echo env.TAG_NAME
} else {
echo "triggered by branch, PR or ..."
}
}
}
}
您可能还对基本分支构建策略插件感兴趣,该插件使得在推送标签时触发构建成为可能(默认情况下未启用)。请参见这里以了解如何使用它。您可以通过管理Jenkins
-> 管理插件
-> 可用选项卡
进行安装,然后使用搜索栏。
refs/tags/v101.0.0-beta8468
,因此您需要提取/解析它以检查是否为标签,否则它只是分支名称,例如:pipeline
。if(env.gitlabBranch.contains("tags"))
{
isTag = true
echo "----------------true----------------"
branch = env.gitlabBranch.split("/")[2]
imageTag = branch
}
else
{
branch = "origin/$env.gitlabBranch"
}
branches: [[name: "${branch}"]
如果您想从同一项目中进行结帐。 根据isTag变量,您可以选择运行特定的阶段。 例如:
if(isTag) {
stage('Deploy') {
// your logic here
}
将isTag初始化为false :)