Pipeline语法
声明式pipeline的结构
pipeline的定义有一个明确的、必须遵循的结构,它由一些directive(指令)和section(配置段)组成,每一个section又可包含其它的section、directive和step(执行步骤),以及一些condition(执行条件)的定义;
◼ Section:用于将那些在某个时间点需要一同运行的条目(item)组织在一起
◆ agent section:指定负责运行代码的节点
◆ stages section:组织一到多个stage
◆ steps section:组织一至多个DSL格式的步骤;
◆ post section:在stage或整个pipeline的尾部封装一些需要被执行的步骤或者检验条件
◼ Directive(指令):负责完成特定功能的语句或代码块,如environment(环境变量)、tools(引用全局工具)、triggers(触发器)、input(与人交互的参数)和when(定义执行条件)等;
◼ Steps:steps本身就是一个标识特定section的名称,其内部可以使用任何合法的
DSL语句,例如git、sh、bat和echo等;
下图中的实线部分,为必选的配置参数
pipeline {
agent any
stages {
stage(‘’) {
steps { … }
}
}
}
Pipeline支持的指令
Jenkins Pipeline支持指令主要有如下这些
◼ environment:设定环境变量,可用于stage或pipeline代码块中;支持credentials()函数,用于通过标识符访问预定义的凭证;
◼ tools:指定需要在agent上下载并配置的工具,例如git、maven、jdk等,这些工具可经由PATH环境变量指定的位置访问到;可用于stage或pipeline中;
◼ parameters:用户在触发pipeline时应该提供的参数列表;仅可用于pipeline级别;
◼ options:仅可用在pipeline级别来配置pipeline自身的选项,支持的参数可由pipeline自身提供,也可由其它插件(例如timestamps)提供;
◆ 例如“retry(2)”允许在pipeline失败时重试两次;
◼ triggers:用于指定负责自动启动pipeline的触发器,对于集成了Github或Gitlab等自带触发机制的系统场景来说,triggers并非必须的指令;仅可用于pipeline级别;
◼ libraries:当前pipeline可以导入的共享库,该共享库内部的代码则可被该pipeline调用;
◼ stage:负责在stages配置段中封装steps配置段,以及其它可用于stage中的指令;
◼ input:stage中的专用指令,用于暂停pipeline并提示用户输入内容后继续;
◼ when:stage中的专用指令,用于设定该stage的运行条件;
Section: agent(在整个流水下的最前或stage的最前定义)
agent用于指明使用哪一个节点去执行pipeline或stage中的代码;
◼ 在pipeline代码块的顶部,必须要有一个agent来指定“默认”的执行节点
◼ 而一个stage的顶部也可以有一个agent的定义,用来指定负责运行该stage中的代码的节点
agent可接受多种形式的参数
◼ any:任何可用节点
◼ none:用于pipeline顶端时表示不定义默认的agent,这就需要为每个stage单独指定
◼ label { label "
Section: post(在每一个的stage之后或整个流水线的最后定义)
post section在stage或pipeline的尾部定义一些step,并根据其所在stage或pipeline的完成情况来判定是否
运行这些step;
post section支持的condition如下
◼ always:总是运行
◼ changed:其所处的stage或pipeline同前一次运行具有不同状态时,才运行该post
◼ fixed:stage或pipeline本次运行成功,但前一次为failed或unstable时,才运行该post
◼ regression:stage或pipeline前一次运行成功,但本次为failure、unstable或aborted时,才运行该post
◼ aborted:stage或pipeline的运行状态为aborted时,才运行该post;在Web UI中灰色显示
◼ failure: stage或pipeline的运行状态为failed时,才运行该post
◼ success:stage或pipeline的运行状态为success时,才运行该post
◼ unstable:因测试失败或代码冲突导致stage或pipeline的运行状态为unstable时,才运行该post;在Web UI中以黄色显示
◼ unsuccessful:stage或pipeline的运行不成功时,才运行该post
◼ cleanup:在其它所有的post的条件均被评估后(无论stage或pipeline的状态为何)才运行该post
Section: stages和steps
stages
stages:封装了用于定义pipeline主体和逻辑的所有stage的定义,它包含一个或多个stage指令,
◼ stages负责描述pipeline中绝大部分的实际工作(work)
◼ 事实上,stages中至少需要包含一个stage指令来定义CD过程的每个离散部分,例如构建、测试和部署等
steps:负责在stage中定义一到多个DSL语句,这些语句负责完成该stage中特定的功能;但能够同其它
的语句分隔开,如environment等
pipeline {
agent any
stages {
stage('Example’) {
// stage中必须要包含steps;
steps { // step中至少应该有一个DSL语句;
echo 'Hello World'
}
}
}
}
steps(在流水线中真正执行具体任务的关键内容)
Pipeline的基本结构决定了pipeline的整体流程,但真正“做事”的还是其内部一个个具体的step,因而
steps是pipeline中最核心的组成部分;
◼ 除了script,几乎所有的step在pipeline中都是不可拆分的原子操作;
◼ pipeline内置了大量的step,具体请参考https://www.jenkins.io/doc/pipeline/steps;
◼ 除此之外,有相当一部分插件可直接当作step来用;
script{}步骤负责将脚本引入到steps{}配置段中,但它非为必要的步骤,且复杂的脚本应该单独组织为
Shared Libraries,并由Pipeline导入后使用
pipeline内置的常用step
文件/目录相关
◼ deleteDir:删除当前目录;
◼ dir("/path/to/dir"):切换到指定目录;
◼ fileExists ("/path/to/dir") :判断文件是否存在;
◼ isUnix:判断是否为类Unix系统;
◼ pwd:打印当前目录;
◼ writeFile:将内容写入指定的文件中,支持如下几个参数
◆ file:文件路径,支持相对路径和绝对路径;
◆ text:要写入的内容;
◆ encoding:目标文件的编码,空值为系统默认的编码;支持base64编码格式;可选参数;
◼ readFile:读取文件的内容;支持如下几个参数;
◆ file:文件路径,支持相对路径和绝对路径;
◆ encoding:读取文件内容时使用的编码格式;可选参数;
消息或控制
◼ echo("message"):打印指定的消息;
◼ error("message"):主动报错,并中止当前pipeline;
◼ retry(count){}:重复执行count次在{}中定义的代码块;
◼ sleep:让pipeline休眠一段时间,支持如下参数;
◆ time:整数值,休眠时长;
◆ unit:时间单位,支持NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS、MINUTES、HOURS和DAYS,可选参数;
◼ timeout:代码块的超时时长,支持如下参数;
◆ time:整数值,休眠时长;
◆ unit:时间单位,支持NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS、MINUTES、HOURS
和DAYS,可选参数;
◆ activity:布尔类型,值为true时,表示在该代码块不再有日志活动时才算真正超时;可选参数;
◼ waitUntil:等待指定的条件满足时执行定义的代码块;
◆ initialRecurrencePeriod:初始的重试周期,即测试条件是否满足的重试周期,默认为250ms;可选参数;
◆ quiet:是否禁止将每次的条件测试都记入日志,默认为false,即记入日志;可选参数;
发送通知
◼ mail:向指定邮箱发送邮件;
◆ subject:邮件标题;
◆ body:邮件正文;
◆ from (optional):发件人地址列表,逗号分隔;
◆ cc (optional) :CC email地址列表,逗号分隔;
◆ bcc (optional):BCC email地址列表,逗号分隔;
◆ charset (optional):编码格式;
◆ mimeType (optional):Email正文的MIME类型,默认为text/plain;
◆ replyTo (optional):回件地址,默认为Jenkins设置的全局配置中的邮箱地址;
Pipeline的常用步骤
Node和Process相关
◼ bat:Windows的批处理脚本;
◼ powershell:运行指定的PowerShell脚本,支持Microsoft PowerShell 3+;
◼ pwsh:PowerShell Core Script
◼ node:在指定的节点上运行后续的脚本;
◼ sh:运行shell脚本,支持的参数如下
◆ script{}:脚本代码块,支持指定脚本解释器,例如“#!/usr/bin/perl,否则将使用系统默认的解释器,且使用了-xe选项”;
◆ encoding (optional):脚本执行后输出的日志信息的编码格式,未定义时使用系统默认编码格式;
◆ label (optional):显示在Web UI中的详细信息;
◆ returnStdout (optional):布尔型值,true表示任务的标准输出将作为step的返回值,而不是打印到日志中;若有错误,依然会记入日志;
◆ returnStatus (optional):正常情况了命令执行失败会返回非零状态码,设定该参数值为true时,表示将返回该step的结果,而非状态码;
◼ ws:分配工作空间;
Stages和Stage
显然,states是pipeline中最重的section,Jenkins会按照stages中
定义的顺序自下而后执行各个stage;
stage内部还能再嵌套一个stages{}或一个parallel{}代码块,而
后在这些代码块内部再嵌套stage,以指定stage的运行顺序;
◼ stage内部嵌套stages{},用于指定以顺序(串行)方式依次运行该stages{}内部的各stage;
◼ 而stage内部嵌套的parallel{},用于指定以并行方式运行该parallel{}内部的各stage;
需要注意以下几点
◼ stage内部仅能定义steps、stages、parallel或matrix四者其中之一,且多层嵌套只能用在最后一个stage中;
◼ 对于本身已经嵌套在parallel或matrix内部的stage来说,不支持在其内部再使用parallel或matrix;但仍能使用agent、tools和when等其它指令,甚至是stages{}配置段以顺序运行stage;
使用自定义工具的Maven工程
调用名为“maven-3.8.7”全局构建工具
◼ 构建工具程序默认安装在${JENKINS_HOME}/tools/目录下
◼ “
maven-3.8.7”就位于该目录下的hudson.tasks.Maven_MavenInstallation/maven-3.8.7/子目录中;
一:在jenkins上全局工具配置上安装maven和JGit
二:把以下代码粘贴到pipeline-job-01中
pipeline {
agent any
tools {
maven 'maven-3.8.7'
}
stages {
stage('Source') {
steps {
git branch: 'main', url: 'http://gitlab.mengfanchao.com/root/spring-boot-helloWorld.git'
}
}
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
}
}
立即构建
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net