评论

收藏

[Linux] 流水线pipeline招式之声明式(后篇)

服务系统 服务系统 发布于:2021-12-17 12:39 | 阅读数:571 | 评论:0

流水线pipeline招式之声明式(前篇)
流水线pipeline招式之声明式(中篇)
大家好,今天是pipeline声明式的最后一篇。如果之前的内容还没有看,可以点击上方的的连接。那么废话不多说,开始今天的内容。
when条件判断
when 指令允许流水线根据给定的条件决定是否应该执行阶段。 when 指令必须包含至少一个条件。比如,我们想根据环境去判断执行不同的构建,那么我们可以下成如下样子
("test"){
  when {
    branch 'test'
  }
  steps{
    echo "deploy test!"
  }
}
stage("prod"){
  when {
    branch 'prod'
  }
  steps{
    echo "deploy prod!"
  }
}
那么when都支持哪些条件的判断呢,我们下面来一一介绍:
branch,当正在构建的分支与模式给定的分支匹配时,执行这个阶段,也就是上面我们说的,通过分支去判断。这只适用于多分支流水线例如:
{ branch 'master' }
environment,当指定的环境变量是给定的值时,执行这个步骤,例如:
{ environment name: 'DEPLOY_TO', value: 'production' }
expression, 当指定的Groovy表达式评估为true时,执行这个阶段, 例如:
{ expression { return params.DEBUG_BUILD } }
这里要注意,当表达式返回的是字符串时,他必须转换为布尔值或者null,否则所有的字符串都被当做true处理。
not,当嵌套条件是错误时,执行这个阶段,必须包含一个条件,例如:
{ not { branch 'master' } }
allOf,当所有的嵌套条件都正确时,执行这个阶段,必须包含至少一个条件,例如:
{ allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }
anyOf,当至少有一个嵌套条件为真时,执行这个阶段,必须包含至少一个条件,例如:
{ anyOf { branch 'master'; branch 'staging' } }
equals,如果期望值和给定的值相同,则执行
{
  equals expected: 2, actual: currentBuild.number
}
buildingTag,如果pipeline所执行的代码被打了tag,则执行。
{
  buildingTag()
}
tag,如果pipeline所执行的代码被打了tag,并且tag名符合规则,才执行。如果tag值为空,可以写成tag(),这个效果和buildingTag()一样,不论tag名称为什么,都执行。那么tag有几种匹配的方式呢?

  • EQUALS: 简单的文本比较
    {
    tag pattern: "release-3.1", comparator: "EQUALS"
    }
  • GLOB (默认值): Ant风格的路径表达式。由于是默认的使用的时候可以忽略
{
  tag pattern: "release-*"
}
或者写成完整版
{
  tag pattern: "release-*", comparator: "GLOB"
}

  • REGEXP: 正则表达式
    {
    tag pattern: "release=\\\d+", comparator: "REGEXP"
    }
下面我们来举个例子,我们添加一段参数。
parameters {
    string(name: 'TEST', defaultValue: 'ABCD', description: 'code is adbcd')
  }
设置一个when的条件
when { environment name: 'TEST', value: 'ABCD' }
      steps{
        script{
          println("获取代码")
        }
      }
    }
构建
DSC0000.png

我们可以看到构建成功
DSC0001.png

这个时候我们把参数改变,改为abcde
DSC0002.png

虽然也构建成功了,但是Checkout阶段被跳过了
parallel并行
声明式流水线的阶段可以在他们内部声明多隔嵌套阶段, 它们将并行执行。 注意,一个阶段必须只有一个 steps 或 parallel的阶段。 嵌套阶段本身不能包含 进一步的 parallel 阶段, 但是其他的阶段的行为与任何其他 stageparallel 的阶段不能包含 agent 或 tools阶段, 因为他们没有相关 steps。
("CheckOut"){
   failFast true
   parallel {
     stage("GetCode"){
       steps{
         script{
           println("获取代码")
         }
       }
     }
     stage("CheckEnv"){
       steps{
         script{
           println("检查环境")
         }
       }
     }
   }
}
failFast true 当其中一个进程失败时,强制所有的 parallel 阶段都被终止。
这里一定要注意,一般结构是steges里面套了多个步骤也就是套了多个stage,但是呢parallel模块是在stage里面所以,相当于一个stage里面套了多个stage
DSC0003.png

并发的构建,从jenkins的页面看的不是很清楚,我们可以Blue Ocean的插件去看,效果如下
DSC0004.png

script脚本标签
script步骤需要{scripted-pipline}块并在声明式流水线中执行,对于大多数用例来说,应该声明式流水线中的“脚本”步骤是不必要的,但是它可以提供一个有用的"逃生出口",非平凡的规模和/或复杂性的script块应该被转移到共享库
可以通过此标签嵌入脚本式语法。
("Build"){
  steps{
    script{
      println("运行构建")
    }
  }
}
{
  success{
    script{
      println("流水线成功后,要做的事情")
      currentBuild.description = "\n 构建成功"
    }
  }
效果如下
DSC0005.png

最后我来总结一下,今天介绍了,三个指令when、parallel和script。Jenkinsfile主要的标签已经介绍完毕。这里需要注意的是它们运行的位置,是在其他指令中,还是在pipline块中。
</div>
    
    <div id="asideoffset"></div>

关注下面的标签,发现更多相似文章