当前位置: 代码迷 >> 综合 >> Jenkins 声明式 Declarative Pipeline
  详细解决方案

Jenkins 声明式 Declarative Pipeline

热度:113   发布时间:2023-09-30 11:16:17.0

 什么是 Jenkinsfile


Jenkinsfile 是 Jenkins 2.x 核心特性 Pipeline 的脚本,由Groovy语言实现。Jenkinsfile一般是放在项目根目录,随项目一起受源代码管理软件控制,无需像创建“自由风格"(Jenkins FreeStyle)项目一样,每次可能需要拷贝很多设置到新项目,提供了一些直接的好处:

  • Pipeline上的代码审查/迭代
  • Pipeline的审计跟踪
  • Pipeline的唯一真实来源,可以由项目的多个成员查看和编辑。

Pipeline支持:Declarative(在Pipeline 2.5中引入)和Scripted Pipeline两种格式。两者都支持建立Pipeline,两者都可以用于在Web UI中定义一个流水线Jenkinsfile,将Jenkinsfile文件创建并检查到源代码控制库中通常被认为是最佳做法。

Jenkins 声明式 Declarative Pipeline

一、语法结构


Jenkins 2.5新加入的pipeline语法

声明式pipeline 基本语法和表达式遵循 groovy语法,但是有以下例外:

  • 声明式pipeline 必须包含在固定格式的pipeline{}中
  • 每个声明语句必须独立一行, 行尾无需使用分号
  • 块(Blocks{}) 只能包含章节(Sections),指令(Directives),步骤(Steps),或者赋值语句
  • 属性引用语句被视为无参数方法调用。 如input()

一个声明式Pipeline中包含的元素

  • pipeline:声明这是一个声明式的pipeline脚本
  • agent:指定要执行该Pipeline的节点(job运行的slave或者master节点)
  • stages:阶段集合,包裹所有的阶段(例如:打包,部署等各个阶段)
  • stage:阶段,被stages包裹,一个stages可以有多个stage
  • steps:步骤,为每个阶段的最小执行单元,被stage包裹
  • post:执行构建后的操作,根据构建结果来执行对应的操作

示例:

pipeline{// 指定pipeline在哪个slave节点上允许agent { label 'jdk-maven' }// 指定pipeline运行时的一些配置option {timeout(time: 1, unit: 'HOURS')}// 自定义的参数parameters {string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')}// 自定义的环境变量environment {Gitlab_Deploy_KEY = credentials('gitlab-jenkins-depolykey')}// 定义pipeline的阶段任务stages {stage ("阶段1任务:拉代码") {steps {// 拉代码的具体命令}}stage ("阶段2任务:编译代码") {steps {// 编译代码的具体命令}}stage ("阶段3任务:扫描代码") {steps {// 拉代码的具体命令}}stage ("阶段4任务:打包代码") {steps {// 打包代码的具体命令}}stage ("阶段5任务:构建推送Docker镜像") {steps {// 构建推送Docker镜像的具体命令}}stage ("阶段6任务:部署镜像") {steps {// 部署镜像的具体命令}}}post {success {// 当pipeline构建状态为"success"时要执行的事情}always {// 无论pipeline构建状态是什么都要执行的事情}}
}

  

二、章节Sections


1、agent(必须)

指定整个Pipeline或特定阶段是在Jenkins Master节点还是Jenkins Slave节点上运行。可在顶级pipeline块和每个stage块中使用(在顶层pipeline{}中是必须定义的 ,但在阶段Stage中是可选的)

参数(以下参数值在顶层pipeline{}stage{}中都可使用):

  • any:在任何可用的节点上执行Pipeline或Stage
  • none:当在顶层pipeline{}中应用时,将不会为整个Pipeline运行分配全局代理,并且每个stage部分将需要包含其自己的agent部分
  • label
  • node
  • docker
  • dockerfile
  • kubernetes

公用参数:

  • label
  • customWorkspace
  • reuseNode
  • args

2、post

定义在Pipeline运行或阶段结束时要运行的操作。具体取决于Pipeline的状态

支持pipeline运行状态:

  • always:无论Pipeline运行的完成状态如何都要运行
  • changed:只有当前Pipeline运行的状态与先前完成的Pipeline的状态不同时,才能运行
  • fixed:整个pipeline或者stage相对于上一次失败或不稳定Pipeline的状态有改变。才能运行
  • regression:
  • aborted:只有当前Pipeline处于“中止”状态时,才会运行,通常是由于Pipeline被手动中止(通常在具有灰色指示的Web UI 中表示)
  • failure:仅当当前Pipeline处于“失败”状态时才运行(通常在Web UI中用红色指示表示)
  • success:仅当当前Pipeline在“成功”状态时才运行(通常在具有蓝色或绿色指示的Web UI中表示)
  • unstable:只有当前Pipeline在不稳定”状态,通常由测试失败,代码违例等引起,才能运行(通常在具有黄色指示的Web UI中表示)
  • unsuccessful:
  • cleanup:无论Pipeline或stage的状态如何,在跑完所有其他的post条件后运行此条件下 的post步骤。

3、stages(必须)

  • 至少包含一个用于执行任务的stage指令
  • pipeline{ }中只能有一个stages{}

4、steps(必须)

  • stage指令中至少包含一个用于执行命令的steps

三、Jenkins中的变量


变量的来源

  • Jenkins内置的环境变量

    • 构建任务相关的变量

    • 构建状态相关的变量

  • 插件提供的环境变量

  • pipeline中environment指令定义的变量

  • 脚本自定义的变量

变量的引用

  • $变量名

  • ${变量名}

  • ${env.变量名}

变量的处理

  • ${变量名[0..7]}

  • 变量名.take(8)

  • ${变量名.replace(' and counting', '')}

The issue here is caused by the way Jenkins interprets $var inside sh block:

  • if you use "double quotes"$var in sh "... $var ..." will be interpreted as Jenkins variable;

  • if you use 'single quotes'$var in sh '... $var ...' will be interpreted as shell variable.

参考

  1. https://stackoverflow.com/questions/16943665/how-to-get-git-short-hash-in-to-a-variable-in-jenkins-running-on-windows-2008

  2. https://stackoverflow.com/questions/44007034/conditional-environment-variables-in-jenkins-declarative-pipeline/53771302

  相关解决方案