QQ截图20211213144015.png 这一篇开始,我会聊一聊声明式流水线,由于声明式流水线的内容会比较多,所以会分几篇进行介绍。声明式也是Jenkins最重要的部分之一。它可以用一种简洁直白的方式,来定义我们构建的过程。

声明式Pipleine是官方推荐的语法,声明式语法更加简洁。所有的声明式Pipeline都必须包含一个 pipeline块中,比如:

pipeline {
    //run
}

在声明式Pipeline中的基本语句和表达式遵循Groovy的语法。但是有以下例外:

  • 流水线顶层必须是一个块,特别是pipeline{}。
  • 不需要分号作为分割符,是按照行分割的。
  • 语句块只能由阶段、指令、步骤、赋值语句组成。例如: input被视为input()。

那么Jenkins pipeline支持多少哪些指令呢

pipeline的指令是有作用域的,类似于我们再配置Nginx的参数,有的要放在http模块里面,有的要放在location里面,有的可以放在http和location里面,而pipeline中的也一样,有的可以放在pipeline{}中,和stage是平行的。有的是放在stage中。当然也有可以两个中任意一个,基本支持如下的指令:

  • environment 用于设置环境变量,可定义在stage或pipeline部分
  • tools 可定义在pipline或者stage部分。他会自动下载并安装我们指定的工具,并将其假如PATH变量中
  • input 定义在stage部分,会暂停pipline。提示输入内容
  • option 用于配置Jenkins pipeline本身的选项,定义在stage或者pipeline部分,如重试次数,或者超时配置。
  • parallel 并行多个step。
  • parameters 与input不同,这个指令定意思传入的参数
  • triggers 用于定义执行pipeline的触发器
  • when 满足条件才执行。

agent指令

agent指定了流水线的执行节点。

agent { node { label 'labelname' }}

aget { label ' labelname '}

参数:

  • any 在任何可用的节点上执行pipeline。none 没有指定agent的时候默认。
pipline {
    agent any
    stages {
        ...
    }
}
  • none 没有指定agent的时候默认

  • label 在指定标签上的节点上运行Pipeline。

  • node 允许额外的选项(自定义workspace)。

    agent { node { 
            label "master"
            customWorkspace "${workspace}"
        }
    }

指定了额外的customWorkspace,需要弄node包一层。

post,运行后处理

定义了一个或者多个steps,这些阶段根据流水线或者阶段的完成情况而运行(取决于流水线中post部分的位置)。post支持以下post-condition块中的其中之一,always 、changed、failure、success、unstable、aborted。这些条件块允许在post部分的步骤的执行取决于流水线或者阶段的完成状态。

当流水线完成后根据完成的状态做一些任务。例如:构建失败后邮件通知。

post { 
    always { 
        echo 'I will always say Hello again!'
    }

    failure{
        email : xxxx@dxx.com
    }
}

常用的状态:

  • always 无论流水线或者阶段的完成状态。

  • changed 只有当流水线或者阶段完成状态与之前不同时。

  • failure 只有当流水线或者阶段状态为"failure"运行。

  • success 只有当流水线或者阶段状态为"success"运行。

  • unstable 只有当流水线或者阶段状态为"unstable"运行。例如:测试失败。

  • aborted 只有当流水线或者阶段状态为"aborted "运行。例如:手动取消。

  • fixed 上次完成状态为失败或者unstable,当前完成状态为成功时执行

  • regression 上次完成状态为成功,当前完成状态为失败,不稳定或aborted时执行

  • cleaup 不论当前完成状态是什么,在其他所有条件块执行完成后都执行。

注意:post和stages是平级的代码块

stages阶段

stages是流水线的整个运行阶段,包含一个或多个 stage , 建议 stages 至少包含一个 stage

stages { 
    stage('Example') {
        steps {
            echo 'Hello World'
        }
    }
}

environment,环境变量

environment指令指定一个键值对序列,该序列将定义为所有步骤的环境变量,或者是特定于阶段的步骤,这取决于environment指令在流水线内的位置

该指令支持一个特殊的方法credentials().该方法可用于在jenkins环境中通过标识符访问预定义的凭证。对于类型为Secret Text的凭证,credentials() 将确保指定环境变量包含秘密文本内容。对于类型为SStandard username and password的凭证,指定的环境变量指定为username:password,并且两个额外的环境变量被自动定义。分别为MYVARNAME_USRMYVARNAME_PSD

定义流水线环境变量,可以定义在全局变量或者步骤中的局部变量。这取决于 environment 指令在流水线内的位置。

agent any

//全局变量
environment { 
    activeEnv = 'dev'
}
stages {
    stage('Example') {

        //局部变量
        environment { 
            AN_ACCESS_KEY = credentials('my-prefined-secret-text') 
        }
        steps {
            sh 'printenv'
        }
    }
}

options运行选项

定义流水线运行时的配置选项,流水线提供了许多选项, 比如buildDiscarder,但也可以由插件提供, 比如 timestamps。

agent any
options {
    timeout(time: 1, unit: 'HOURS') 
}
stages {
    stage('Example') {
        steps {
            echo 'Hello World'
        }
    }
}

其他部分参数:

  • buildDiscarder: 为最近的流水线运行的特定数量保存组件和控制台输出。自动清理硬盘上保存的的制品和构建日志。
options {
    buildDiscarder(logRotator(numToKeepStr: '10'))
}
  • disableConcurrentBuilds: 不允许同时执行流水线。 可被用来防止同时访问共享资源等。
options {
    disableConcurrentBuilds(
}
  • overrideIndexTriggers: 允许覆盖分支索引触发器的默认处理。
  • skipDefaultCheckout: 在agent 指令中,跳过从源代码控制中检出代码的默认情况。
  • skipStagesAfterUnstable: 一旦构建状态变得UNSTABLE,跳过该阶段。
  • checkoutToSubdirectory: 在工作空间的子目录中自动地执行源代码控制检出。也就是,可以指定检出到工作空间的子目录中。
options {
    checkoutToSubdirectory('subdir')
}
  • timeout: 设置流水线运行的超时时间, 在此之后,Jenkins将中止流水线。
options {
    timeout(time: 10, unit: 'HOURS')
} 
  • retry: 在失败时, 重新尝试整个流水线的指定次数。注意这个次数包括第一次失败。
options {
    retry(4)
}
  • timestamps 预测所有由流水线生成的控制台输出,与该流水线发出的时间一致。

最后我来总结一下,今天我们主要介绍了声明式的流水线。和agent,post,stages,environment和option几个指令。这里面一定要注意,今天的几个指令,他们都是在pipeline块中定义,下一篇我们开始介绍一些指令,他们既可以在pipeline块中定义,也可以定义在stages步骤中。期待与你共同进步。