Jenkins–基础–6.2–Pipeline–语法–声明式
1、介绍
1.1、特点
- 所有有效的声明式流水线必须包含在一个pipeline块中
pipeline {
/* insert Declarative Pipeline here */
}
作用域:应用于全局最外层,表明该脚本为声明式pipeline
是否必须:必须
参数:无
-
Pipeline 的顶层必须是一个块
pipeline { }。 - 没有分号作为语句分隔符。 每个语句都必须在它自己的行上。
- 块只能由章节(Sections)、指令(Directives)、步骤(Steps)或赋值语(assignment statements)句组成。
- 属性引用语句被视为无参数方法调用。 例如,input被视为input()。
- Jenkins还提供了声明式指令片段生成器来帮助生成声明式流水线指令。
1.2、Jenkinsfile一般结构如下
pipeline {
agent {
//define agent
}
stages {
stage('阶段名称') {
steps {
//some scripts
}
}
...
}
}
2、agent(require)
-
agent声明整个pipeline脚本或某个stage脚本在jenkins中的运行环境
- 写在pipeline最外层:声明整个pipeline的运行环境
- 写在stage里:声明stage的运行环境。
- pipeline的最外层必须声明agent, 而在stage里则是可选项。
- 作用域:可用在全局与stage内
- 是否必须:是
-
参数
- any
- none
- label
- node
- docker
- dockerfile
- kubernetes
2.1、any
运行在任意的可用节点上。
pipeline {
//运行在任意的可用节点上
agent any
stages {
stage('阶段名称:拉取代码') {
steps("步骤名称:拉取代码"){
echo '打印:拉取代码'
}
}
stage('阶段名称:编译构建') {
steps {
echo '打印:编译构建'
}
}
stage('阶段名称:项目部署') {
steps {
echo '打印:项目部署'
}
}
}
post{
always{
echo "阶段完成后动作"
}
}
}
2.2、none
当在全局声明agent为none时,那么每一个stage都需声明自己的agent。
2.3、label
运行在 指定标签名称节点上
agent {
//运行在 标签名称为my-node1的节点上
label 'my-node1'
}
除此之外label还可以与逻辑符号一同使用
agent {
label 'my-node1' && 'my-node2'
}
agent {
//运行在 标签名称为 my-node1或者my-node2 的节点上
label 'my-node1' || 'my-node2'
}
2.4、node
node声明运行节点,与label功能类似,但是node可以附加选项参数, 如customWorkspace
agent {
node {
label 'my-node1'
}
}
等同于
agent {
label 'my-node1'
}
2.4.1、node附加选项参数
agent {
node {
label 'my-node1'
// 附加选项参数
customWorkspace '/some/other/path'
}
}
2.5、docker
- 用于基于docker的pipeline流水线
- 在预配置的节点上或指定label的节点上创建docker容器。
- 可以接收docker run的参数,以及docker registry等参数。
agent {
docker 'maven:3.8.1-adoptopenjdk-11'
}
agent {
docker {
image 'maven:3.8.1-adoptopenjdk-11'
label 'my-defined-label'
args '-v /tmp:/tmp'
registryUrl 'https://myregistry.com/'
registryCredentialsId 'myPredefinedCredentialsInJenkins'
}
}
2.6、dockerfile
- 从一个Dockerfile创建docker容器来运行pipeline流水线。
- 默认会从构建的根目录寻找Dockerfile
2.6.1、案例
agent {
dockerfile true
}
2.6.2、案例
agent {
// Equivalent to "docker build -f my_dockerfile --build-arg version=1.0.2 ./build_dir/
dockerfile {
filename 'my_dockerfile'
dir 'build_dir'
label 'my-defined-label'
additionalBuildArgs '--build-arg version=1.0.2'
args '-v /tmp:/tmp'
registryUrl 'https://myregistry.com/'
registryCredentialsId 'myPredefinedCredentialsInJenkins'
}
}
- 通过dir参数:声明 Dockerfile存放的子目录
- 通过filename参数:声明 Dockerfile名字
- 通过additionalBuildArgs参数:设置docker build参数
- 通过registryUrl参数:设置docker仓库
- 通过registryCredentialsId参数:从jenkins获取docker仓库的账号密码。
2.7、kubernetes
- 在kubernetes集群中的一个pod内执行pipeline流水线
- pod模版将定义在kubernetes{}模块中。
agent {
kubernetes {
label podlabel
yaml """
kind: Pod
metadata:
name: jenkins-agent
spec:
containers:
- name: nginx
image: nginx
"""
}
}
2.8、agent的选项参数
2.8.1、label
- 字符串类型。
-
此参数适用于
- node:在ndoe中是必输参数。
- docker
- dockerfile
2.8.2、customWorkspace
- 字符串类型。
- 在自定义工作空间目录中运行此pipeline流水线而不是使用默认的。
- 可以是相对路径(相对于运行节点工作空间的根目录)
- 可以是绝对路径。
-
此参数适用于
- node
- docker
- dockerfile。
####示例
agent {
node {
label 'my-node1'
customWorkspace '/some/other/path'
}
}
2.8.3、reuseNode
- 布尔值类型
-
值
- false(默认)
-
true
- 在pipeline的全局agent节点中运行容器,并且是在同一个工作空间中运行而不是在一个全新的节点中运行。
-
此参数适用于
- docker
- dockerfile
- 只在stage代理中有效。
2.8.4、args
- 字符串类型。
- 用于设置docker run参数
-
适用于
- docker
- dockerfile
####示例
agent {
// Equivalent to "docker build -f my_dockerfile --build-arg version=1.0.2 ./build_dir/
dockerfile {
filename 'my_dockerfile'
dir 'build_dir'
label 'my-defined-label'
additionalBuildArgs '--build-arg version=1.0.2'
args '-v /tmp:/tmp'
registryUrl 'https://myregistry.com/'
registryCredentialsId 'myPredefinedCredentialsInJenkins'
}
}
3、post
- 定义附加steps在整个pipeline流水线或某个stage执行完之后运行。
- post可以定义在pipeline的最外层,表示这个pipeline执行完之后运行
- post可以定义在某个stage里,表示该stage执行完后运行。
3.1、post的执行条件场景
3.1.1、always
不管pipeline或stage的执行结果状态,总会执行的steps。
3.1.2、changed
只有在pipeline或stage的执行结果状态与前一次执行相比发生改变时执行。
3.1.3、fixed
当前pipeline或stage执行成功且它的前一次执行结果是failure或unstable时执行。
3.1.4、regression
当前pipeline或stage执行结果是failure,unstable或aborted且它的前一次执行成功时执行。
3.1.5、aborted
当前pipeline或stage执行结果是aborted(人工停止pipeline)时执行。
3.1.6、failure
当前pipeline或stage执行结果是失败时执行。
3.1.7、success
当前pipeline或stage执行结果是成功时执行。
3.1.8、unstable
当前pipeline或stage执行结果是unstable时执行。
3.1.9、unsuccessful
当前pipeline或stage执行结果不是成功时执行。
3.1.10、cleanup
在其他所有的post场景脚本都处理完之后执行,不管当前pipeline或stage执行结果是什么。
3.2、案例
pipeline {
agent any
stages {
stage('阶段名称:拉取代码') {
steps("步骤名称:拉取代码"){
echo '打印:拉取代码'
}
}
stage('阶段名称:编译构建') {
steps {
echo '打印:编译构建'
}
}
stage('阶段名称:项目部署') {
steps {
echo '打印:项目部署'
}
}
}
post{
always{
echo "阶段完成后动作"
}
}
}
4、stages(require)
- 表示:阶段集合
- 包裹所有的阶段(例如:打包,部署等各个阶段)
- 一个stages可以有多个stage
- 作用域:全局或者stage阶段内,每个作用域内只能使用一次
- 是否必须:全局必须
- 参数:无
4.1、案例
pipeline{
agent any
stages{
stage("阶段1"){
stages{ //嵌套在stage里
stage("阶段1的内部阶段"){
steps{
echo "阶段1的内部阶段"
}
}
}
}
stage("阶段2"){
steps{
echo "阶段2"
}
}
}
}
看下运行结果,发现嵌套的stage也是能够展现在视图里面的
5、stage(atlest one)
- 表示:阶段
- 定义构建阶段要做的事情
- 每个pipeline流水线至少包含一个stage。
- 一个stage里有且只有一个steps,stages,parallel, 或matrix。
- 当一个stage内嵌在parallel或matrix中的时候,那么该stage就不能再包含parallel或matrix。
- 作用域:被stages包裹,作用在自己的stage包裹范围内
- 是否必须:必须
- 参数:需要一个string参数,表示此阶段的工作内容
- 备注:stage内部可以嵌套stages,内部可单独制定运行的agent
5.1、案例
pipeline{
agent any
stages{
stage("阶段1"){
stages{ //嵌套在stage里
stage("阶段1的内部阶段"){
steps{
echo "阶段1的内部阶段"
}
}
}
}
stage("阶段2"){
steps{
echo "阶段2"
}
}
}
}
看下运行结果,发现嵌套的stage也是能够展现在视图里面的
6、steps(require)
- steps包含一个或多个可执行指令。
- 表示:步骤
- 是阶段的最小执行单元
- 作用域:被stage包裹,作用在stage内部
- 是否必须:必须
- 参数:无
7、environment
- 声明一个全局变量(pipeline)或者步骤内部stage()的局部变量
- 该指令还支持通过credentials()获取预设的账号密码。
7.1、支持的credential类型
7.1.1、Secret Text
该环境变量的值将会被设置为Secret Text的内容。
7.1.2、Secret File
该环境变量的值将会被设置为临时创建的文件路径。
7.1.3、Username and password
该环境变量的值将会被设置为username:password,并且还会自动创建两个环境变量
- MYVARNAME_USR
- MYVARNAME_PSW
7.1.4、SSH with Private Key
该环境变量的值将会被设置为临时创建的ssh key文件路径,并且还会自动创建两个环境变量
- MYVARNAME_USR
- MYVARNAME_PSW。
7.2、案例
7.2.1、案例1
pipeline{
agent any
//声明一个全局变量或者步骤内部的局部变量
environment {
P1="参数1"
}
stages{
stage("阶段1"){
environment {
P2="参数2"
}
steps{
echo "打印P1变量:$P1"
echo "打印P2变量:$P2"
}
}
}
}
7.2.2、案例2
pipeline {
agent any
environment {
CC = 'clang'
}
stages {
stage('Example') {
environment {
AN_ACCESS_KEY = credentials('my-predefined-secret-text')
}
steps {
sh 'printenv'
}
}
}
}
pipeline {
agent any
stages {
stage('Example Username/Password') {
environment {
SERVICE_CREDS = credentials('my-predefined-username-password')
}
steps {
sh 'echo "Service user is $SERVICE_CREDS_USR"'
sh 'echo "Service password is $SERVICE_CREDS_PSW"'
sh 'curl -u $SERVICE_CREDS https://myservice.example.com'
}
}
stage('Example SSH Username with private key') {
environment {
SSH_CREDS = credentials('my-predefined-ssh-creds')
}
steps {
sh 'echo "SSH private key is located at $SSH_CREDS"'
sh 'echo "SSH user is $SSH_CREDS_USR"'
sh 'echo "SSH passphrase is $SSH_CREDS_PSW"'
}
}
}
}
8、options
- pipeline的选项参数,能够提供给脚本更多的选项。
- 全局options声明在最外层
-
当options作用在stage内部的时候,只在该stage有效,且只支持以下选项
- skipDefaultCheckout
- timeout
- retry
- timestamps
8.1、buildDiscarder
指定build history与console的保存数量。
//只保存最近一次构建日志
options {
buildDiscarder(logRotator(numToKeepStr: '1'))
}
8.2、checkoutToSubdirectory
将源码拉取到工作空间指定的子目录下。
options {
checkoutToSubdirectory('foo')
}
8.3、disableConcurrentBuilds
不允许同时构建。
options {
disableConcurrentBuilds()
}
8.4、disableResume
不允许控制器重新开始。
options {
disableResume()
}
8.5、newContainerPerStage
与docker或dockerfile代理一起使用,表示每个stage都将在同一个节点里启动新容器运行而不是在同一个容器中运行。
options {
newContainerPerStage()
}
8.6、overrideIndexTriggers
- 重写分支索引触发器的处理方式。
- 如果设置为true:当分支索引触发器在多分支或机构标签中禁止时,他们将为当前构建开启
- 如果设置为false:当分支索引触发器在多分支或机构标签中开启时,他们将为当前构建禁止。
options {
overrideIndexTriggers(true)
}
8.7、preserveStashes
当stage重新开始时,保存最近构建。
//保存最近一次完成的构建
options {
preserveStashes()
}
//保存最近5次完成的构建
options {
preserveStashes(buildCount: 5)
}
8.8、quietPeriod
- 延迟启动时间
- 单位:秒。
options {
quietPeriod(30)
}
8.9、retry(stageable)
失败重试次数。
options {
retry(3)
}
8.10、skipDefaultCheckout(stageable)
跳过默认代码拉取。
options {
skipDefaultCheckout()
}
8.11、skipStagesAfterUnstable
当构建状态出现unstable时跳过其他stages。
options {
skipStagesAfterUnstable()
}
8.12、timeout(stageable)
设置构建超时时间,超时后自动终止执行。
pipeline {
agent any
options {
timeout(time: 1, unit: 'HOURS')
}
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
8.13、timestamps(stageable)
设置日志输出时间戳。
options {
timestamps()
}
8.14、parallelsAlwaysFailFast
将所有并行stage的failfast设置为true。
options {
parallelsAlwaysFailFast()
}
8.15、案例
pipeline{
agent any
options {
//设置日志输出时间戳
timestamps()
//不允许同时构建
disableConcurrentBuilds()
}
stages{
stage("stage1"){
options {
//设置构建超时时间,超过1分钟后自动终止执行
timeout(time:1,unit:'MINUTES')
//设置retry作用域范围的重试次数为3次
retry(2)
}
steps{
echo "====================options测试===================="
}
}
}
}
9、parameters
- parameters声明当构建触发时用户要输入的所有参数,steps指令将通过params对象获取这些参数。
- 提供pipeline运行的参数
- 作用域:被最外层pipeline所包裹,并且只能出现一次,参数可被全局使用
9.1、参数类型包括
string
text
booleanParam
choice
password
9.2、案例
9.2.1、案例1
pipeline{
agent any
//提供pipeline运行的参数
parameters {
//定义字符串参数,名称:P1,默认值:hello world,参数说明:打个招呼
string(name: 'P1', defaultValue: 'hello world', description: '打个招呼')
booleanParam(name: 'P2', defaultValue: true, description: 'P2')
}
stages{
stage("stage1"){
steps{
echo "打印参数P1:$P1"
echo "打印参数P2:$P2"
}
}
}
}
####自动生成的构建参数
9.2.2、案例2
pipeline {
agent any
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')
}
stages {
stage('Example') {
steps {
echo "Hello ${params.PERSON}"
echo "Biography: ${params.BIOGRAPHY}"
echo "Toggle: ${params.TOGGLE}"
echo "Choice: ${params.CHOICE}"
echo "Password: ${params.PASSWORD}"
}
}
}
}
10、triggers
- 构建触发器,在符合条件下自动触发pipeline
- 不常用,一般使用webhooks居多。
- 作用域:被pipeline包裹
-
自动触发的方式有3种
- cron
- pollSCM
- upstream
10.1、cron
定时器触发。
//每隔4小时构建一次
triggers {
cron('H */4 * * 1-5')
}
10.2、pollSCM
定时检查源码变更触发。jenkins定时检查源码是否变更,如果发生变更则触发构建。
//每隔4小时检查一次
triggers {
pollSCM('H */4 * * 1-5')
}
10.3、upstream
- 上游构建触发。
- 当上游构建完成状态匹配时触发构建。
triggers {
upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS)
}
pipeline{
agent any
//说明:当上游Job,test_8或者test_7 运行成功的时候,自动触发
triggers { upstream(upstreamProjects: 'test_8,test_7', threshold: hudson.model.Result.SUCCESS) }
stages{
stage("stage1"){
steps{
echo "hello"
}
}
}
}
11、tools
- 声明需要自动安装构建所需的工具,并设置到PATH环境变量里。
- 当agent none时,tools声明将会被忽略。
-
支持自动安装的工具有
- jdk
- maven
- gradle
11.1、引用的工具需要配置过,比如我的maven
系统管理–>全局工具配置
11.2、案例
pipeline {
agent any
tools {
//引用的工具,通过名称引用
maven 'maven-3.3.9'
}
stages {
stage('阶段1') {
steps {
sh 'mvn --version'
}
}
}
}
结果
12、input (stage only)
- stage参数输入指令。
- 在进入agent模块和when条件判断之前,stage将会被暂停并弹出输入对话框,直到用户输入可用参数后stage才会继续执行。
- 所有输入的参数在余下的stage指令中都可以通过环境变量获取。
12.1、input配置选项
12.1.1、messgae(必输)
提示信息
12.1.2、id
- 唯一标识
- 默认使用该stage名称。
12.1.3、ok
按钮名称。
12.1.4、submitter
- 以”,”分割的用户或外部组的列表,定义谁可以提交这个输入项
- 默认所有人。
12.1.5、submitterParameter
设置submitter的环境变量名称。
12.1.6、parameters
配置需要输入的参数。
12.2、案例
pipeline {
agent any
stages {
stage('阶段1') {
//暂时中断pipeline执行,等待用户登录,完成打卡
input {
message "你好,请输入登录用户"
ok "确认"
submitter "alice,bob"
//提供pipeline运行的参数
parameters {
string(name: 'PERSON', defaultValue: '张三', description: '请输入公司账号')
}
}
steps {
echo "你好, ${PERSON}, 打卡成功"
}
}
}
}
效果
13、when (stage only)
- 通过设定的条件判断决定pipeline流水线的当前stage是否执行
- when命令至少包含一个条件判断。
- 如果when包含多个条件判断,那么当且仅当所有条件判断都为true时,当前stage才会被执行。
- 正常情况下when判断时在agent,input,options命令之后才执行的,但是可以通过beforeAgent,beforeInput,beforeOptions参数来设置提前执行。
- 注意:如果我们想要在进入agent之前进行判断,需要将beforeAgent设置为true
案例
pipeline {
agent none
stages {
stage('阶段1') {
steps {
echo 'Hello World'
}
}
stage('阶段2') {
agent {
//定义标签
label "la-app"
}
when {
//设置先对条件进行判断,符合预期才进入steps
beforeAgent true
branch 'prod'
}
steps {
echo '部署'
}
}
}
}
13.1、branch
- 只使用于多分支结构流水线。
- 当构建分支匹配给定的分支或正则表达式时为true,当前stage就执行下去。
13.1.1、匹配规则
- EQUALS:字符串比较。
- GLOB:ANT通配符
- REGEXP:正则表达式
13.1.2、案例
when {
branch 'master'
}
when {
branch pattern: "release-\\d+", comparator: "REGEXP"
}
13.2、buildingTag
当构建一个版本标签时为true。
when {
buildingTag()
}
13.3、changelog
当SCM的变更日志匹配给定的正则表达式时为true。
when {
changelog '.*^\\[DEPENDENCY\\] .+$'
}
13.4、changeset
当SCM变更集包含一个或以上文件匹配给定的文件路径表达式时为true。
13.4.1、匹配规则
- EQUALS:字符串比较。
- GLOB:ANT通配符
- REGEXP:正则表达式
13.4.2、案例
when {
changeset "**/*.js"
}
when {
changeset pattern: ".TEST\\.java", comparator: "REGEXP"
}
通过caseSensitive参数设置是否区分大小写。
when {
changeset pattern: "*/*TEST.java", caseSensitive: true
}
13.5、changeRequest
- 当因SCM发生变更请求(aka,GitHub and Bitbucket:Pull Request,GitLab:Merge Request, Gerrit: Change Request)而构建时为true。
-
可添加过滤属性,来筛选符合条件的变更请求
id
target
branch
fork
url
title
author
authorDisplayName
authorEmail
13.5.1、过滤属性匹配规则
- EQUALS:字符串比较。
- GLOB:ANT通配符
- REGEXP:正则表达式
13.5.2、案例
when {
changeRequest()
}
when {
changeRequest target: 'master'
}
when {
changeRequest authorEmail: "[\\w_-.]+@example.com", comparator: 'REGEXP'
}
13.6、environment
当某个环境变量值等于给定值时为true。
13.6.1、案例
hen {
environment name: 'DEPLOY_TO', value: 'production'
}
13.7、equals
当实际值等于期望值时为true。
13.7.1、案例
when {
equals expected: 2, actual: currentBuild.number
}
13.8、expression
- 当给定的groovy表达式返回值为true。
- 如果返回值是字符串,那么当返回为null时为false,其他字符串都表示为true。
13.8.1、案例
when {
expression {
return params.DEBUG_BUILD
}
}
13.9、tag
- 当TAG_NAME环境变量匹配给定正则表达式时为true。
- 如果表达式为空则只要TAG_NAME环境变量存在则为true。
13.9.1、匹配规则
- EQUALS:字符串比较。
- GLOB:ANT通配符
- REGEXP:正则表达式
13.9.2、案例
when {
tag "release-*"
}
when {
tag pattern: "release-\\d+", comparator: "REGEXP"
}
13.10、not
当条件为false时。
13.10.1、案例
when {
not {
branch 'master'
}
}
13.11、allOf
当所有条件都为true时。
13.11.1、案例
when {
allOf {
branch 'master';
environment name: 'DEPLOY_TO', value: 'production'
}
}
13.12、anyOf
判断是否有一个条件为真。
13.12.1、案例
when {
anyOf {
branch 'master'; branch 'staging'
}
}
13.13、triggeredBy
当构建由给定触发时为true。
13.1.1、案例
when { triggeredBy 'SCMTrigger' }
when { triggeredBy 'TimerTrigger' }
when { triggeredBy 'UpstreamCause' }
when { triggeredBy cause: "UserIdCause", detail: "vlinde" }
14、parallel
- 通过将阶段设置为parallel来表明该stage为并行运行。
- 通过在包含parallel的stage里设置failFast true,当其中一个并行stage执行失败时强制终止其他并行stage。
- 可以在options里做全局设置parallelsAlwaysFailFast()。
- 1个stage只能有1个steps或者parallel
- 嵌套的stages里不能使用parallel
- parallel不能包含agent或者tools
14.1、案例1
pipeline {
agent any
stages {
stage('非并行阶段') {
steps {
echo '非并行阶段'
}
}
stage('并行阶段') {
failFast true
parallel {
stage('并行阶段1') {
steps {
echo "并行阶段1"
}
}
stage('并行阶段2') {
steps {
echo "并行阶段2"
}
}
}
}
}
}
15、matrix
- 按name-value定义的命名空间矩阵,可在stage里使用定义并行任务。
- matrix必需包含一个axes和一个stages。
- failFast和parallelsAlwaysFailFast()也使用于matrix。
15.1、axes
每一个axes必需包含一个或以上axis
15.2、axis
- 每个axis包含一个name和一个values列表
- 所有axies中的values列表彼此组合产生命名空间cell。
- stages将按循序在各个cell中被执行。
- 每个命名空间的name-value键值对将自动创建对应的环境变量。
15.3、excludes
- 按命name-value名空间移除不需要执行的cell。
- 当移除的命名空间cell列表很长时可以使用notValues替代values。
15.4、每个cell中仍然可以使用以下这些命令, 在matrix最外层声明:
agent
environment
input
options
post
tools
when
15.4、案例
pipeline {
parameters {
choice(name: '操作系统', choices: ['all', 'linux', 'windows'], description: '请选择操作系统')
}
agent any
stages {
stage('构建和测试') {
matrix {
when {
anyOf {
expression { params.操作系统 == 'all' }
expression { params.操作系统 == env.PLATFORM }
}
}
axes {
axis {
name 'PLATFORM'
values 'linux', 'windows'
}
axis {
name 'BROWSER'
values '火狐浏览器', '谷歌浏览器', '苹果浏览器', '微软浏览器'
}
}
excludes {
exclude {
axis {
name 'PLATFORM'
values 'linux'
}
axis {
name 'BROWSER'
values '苹果浏览器'
}
}
exclude {
axis {
name 'PLATFORM'
notValues 'windows'
}
axis {
name 'BROWSER'
values '微软浏览器'
}
}
}
stages {
stage('构建') {
steps {
echo "Do Build for ${PLATFORM} - ${BROWSER}"
}
}
stage('测试') {
steps {
echo "Do Test for ${PLATFORM} - ${BROWSER}"
}
}
}
}
}
}
}
16、脚本
pipeline提供了一个脚本环境入口:script{},通过使用script来包裹脚本语句,即可使用脚本语法
16.1、条件判断
pipeline {
agent any
stages {
stage('阶段1') {
steps {
//使用脚本
script{
if ( "1" =="1" ) {
echo "1 ==1"
}else {
echo "1 !=1"
}
}
}
}
}
}
16.2、异常处理
pipeline {
agent any
stages {
stage('阶段1') {
steps {
script{
try {
sh 'exit 1'
}
catch (exc) {
echo '执行失败'
}
}
}
}
}
}