仅在构建标签时执行Jenkins Pipeline步骤

9

我有一些构建逻辑,比如发布,在Jenkins构建Git标签时才希望执行。如何使用Jenkins Declarative Pipeline实现这一目标?

换句话说,我想要构建与Travis CI的标签部署功能相当的功能:

deploy:
  [...]
  on: 
    tags: true

有一个内置条件用于检查分支,但我没有看到一个指示标签的条件。


请看 https://github.com/jenkinsci/basic-branch-build-strategies-plugin/,它适合我。https://dev59.com/1FYN5IYBdhLWcg3wopUD 也是一样的。 - hellojukay
3个回答

22

更新:Pipeline Model Definition Plugin的1.2.8版本开始,你现在可以使用buldingTag()函数:

stage('Deploy') {
  when {
    buildingTag()
  }
  steps {
    echo 'Replace this with your actual deployment steps'
  }
}

使用多分支管道配置时,您可以与底层分支API插件提供的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


有人能解释一下第二个例子中的表达式应该做什么吗?不幸的是,buildingTag() 对我不起作用 :( - user568021
@user568021或其他人 - 看起来这个表达式打开一个shell,执行一个脚本来回显TAG_NAME环境变量,去掉换行符,并返回结果,将其评估为空字符串(false)或非空字符串(true),因此如果TAG_NAME具有非空值,则返回true - CodeShane

2

声明式流水线

仅在构建标签时执行STAGE

对于整个阶段,@vossad01已经提供了使用when中的buildingTag()的答案。

stage('Deploy') {
  when {
    buildingTag()
    beforeAgent true
  }
  steps {
    echo 'deploy something when triggered by tag
  }
}

beforeAgent true是可选的,它确保在代理执行之前检查条件。

仅在构建标签时执行STEP

如果只是关于阶段内应该有一个基于标签的条件步骤,您可以在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 -> 管理插件 -> 可用选项卡进行安装,然后使用搜索栏。


1
我曾遇到类似的情况,我通过获取分支名称来处理,如果是标签,则格式为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 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接