Jenkins–基础–6.2–Pipeline–语法–声明式

  • Post author:
  • Post category:其他




Jenkins–基础–6.2–Pipeline–语法–声明式




1、介绍



1.1、特点

  1. 所有有效的声明式流水线必须包含在一个pipeline块中
pipeline {
    /* insert Declarative Pipeline here */
}
作用域:应用于全局最外层,表明该脚本为声明式pipeline
是否必须:必须
参数:无
  1. Pipeline 的顶层必须是一个块

    pipeline { }。
  2. 没有分号作为语句分隔符。 每个语句都必须在它自己的行上。
  3. 块只能由章节(Sections)、指令(Directives)、步骤(Steps)或赋值语(assignment statements)句组成。
  4. 属性引用语句被视为无参数方法调用。 例如,input被视为input()。
  5. Jenkins还提供了声明式指令片段生成器来帮助生成声明式流水线指令。



1.2、Jenkinsfile一般结构如下

pipeline {
  agent {
    //define agent
  }
  stages {
    stage('阶段名称') {
      steps {
        //some scripts
      }
    }
    ...
  }
}



2、agent(require)

  1. agent声明整个pipeline脚本或某个stage脚本在jenkins中的运行环境

    1. 写在pipeline最外层:声明整个pipeline的运行环境
    2. 写在stage里:声明stage的运行环境。
    3. pipeline的最外层必须声明agent, 而在stage里则是可选项。
  2. 作用域:可用在全局与stage内
  3. 是否必须:是
  4. 参数

    1. any
    2. none
    3. label
    4. node
    5. docker
    6. dockerfile
    7. 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

  1. 用于基于docker的pipeline流水线
  2. 在预配置的节点上或指定label的节点上创建docker容器。
  3. 可以接收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

  1. 从一个Dockerfile创建docker容器来运行pipeline流水线。
  2. 默认会从构建的根目录寻找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'
    }
}
  1. 通过dir参数:声明 Dockerfile存放的子目录
  2. 通过filename参数:声明 Dockerfile名字
  3. 通过additionalBuildArgs参数:设置docker build参数
  4. 通过registryUrl参数:设置docker仓库
  5. 通过registryCredentialsId参数:从jenkins获取docker仓库的账号密码。



2.7、kubernetes

  1. 在kubernetes集群中的一个pod内执行pipeline流水线
  2. 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

  1. 字符串类型。
  2. 此参数适用于

    1. node:在ndoe中是必输参数。
    2. docker
    3. dockerfile



2.8.2、customWorkspace

  1. 字符串类型。
  2. 在自定义工作空间目录中运行此pipeline流水线而不是使用默认的。
  3. 可以是相对路径(相对于运行节点工作空间的根目录)
  4. 可以是绝对路径。
  5. 此参数适用于

    1. node
    2. docker
    3. dockerfile。

####示例

agent {
    node {
        label 'my-node1'
        customWorkspace '/some/other/path'
    }
}



2.8.3、reuseNode

  1. 布尔值类型
    1. false(默认)
    2. true

      1. 在pipeline的全局agent节点中运行容器,并且是在同一个工作空间中运行而不是在一个全新的节点中运行。
  2. 此参数适用于

    1. docker
    2. dockerfile
  3. 只在stage代理中有效。



2.8.4、args

  1. 字符串类型。
  2. 用于设置docker run参数
  3. 适用于

    1. docker
    2. 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

  1. 定义附加steps在整个pipeline流水线或某个stage执行完之后运行。
  2. post可以定义在pipeline的最外层,表示这个pipeline执行完之后运行
  3. 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)

  1. 表示:阶段集合
  2. 包裹所有的阶段(例如:打包,部署等各个阶段)
  3. 一个stages可以有多个stage
  4. 作用域:全局或者stage阶段内,每个作用域内只能使用一次
  5. 是否必须:全局必须
  6. 参数:无



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)

  1. 表示:阶段
  2. 定义构建阶段要做的事情
  3. 每个pipeline流水线至少包含一个stage。
  4. 一个stage里有且只有一个steps,stages,parallel, 或matrix。
  5. 当一个stage内嵌在parallel或matrix中的时候,那么该stage就不能再包含parallel或matrix。
  6. 作用域:被stages包裹,作用在自己的stage包裹范围内
  7. 是否必须:必须
  8. 参数:需要一个string参数,表示此阶段的工作内容
  9. 备注: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)

  1. steps包含一个或多个可执行指令。
  2. 表示:步骤
  3. 是阶段的最小执行单元
  4. 作用域:被stage包裹,作用在stage内部
  5. 是否必须:必须
  6. 参数:无



7、environment

  1. 声明一个全局变量(pipeline)或者步骤内部stage()的局部变量
  2. 该指令还支持通过credentials()获取预设的账号密码。



7.1、支持的credential类型



7.1.1、Secret Text

该环境变量的值将会被设置为Secret Text的内容。



7.1.2、Secret File

该环境变量的值将会被设置为临时创建的文件路径。



7.1.3、Username and password

该环境变量的值将会被设置为username:password,并且还会自动创建两个环境变量

  1. MYVARNAME_USR
  2. MYVARNAME_PSW



7.1.4、SSH with Private Key

该环境变量的值将会被设置为临时创建的ssh key文件路径,并且还会自动创建两个环境变量

  1. MYVARNAME_USR
  2. 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

  1. pipeline的选项参数,能够提供给脚本更多的选项。
  2. 全局options声明在最外层
  3. 当options作用在stage内部的时候,只在该stage有效,且只支持以下选项

    1. skipDefaultCheckout
    2. timeout
    3. retry
    4. 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

  1. 重写分支索引触发器的处理方式。
  2. 如果设置为true:当分支索引触发器在多分支或机构标签中禁止时,他们将为当前构建开启
  3. 如果设置为false:当分支索引触发器在多分支或机构标签中开启时,他们将为当前构建禁止。
options { 
  overrideIndexTriggers(true) 
} 



8.7、preserveStashes

当stage重新开始时,保存最近构建。

//保存最近一次完成的构建
options { 
  preserveStashes() 
}
//保存最近5次完成的构建
options { 
  preserveStashes(buildCount: 5) 
}



8.8、quietPeriod

  1. 延迟启动时间
  2. 单位:秒。

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

  1. parameters声明当构建触发时用户要输入的所有参数,steps指令将通过params对象获取这些参数。
  2. 提供pipeline运行的参数
  3. 作用域:被最外层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

  1. 构建触发器,在符合条件下自动触发pipeline
  2. 不常用,一般使用webhooks居多。
  3. 作用域:被pipeline包裹
  4. 自动触发的方式有3种

    1. cron
    2. pollSCM
    3. 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

  1. 上游构建触发。
  2. 当上游构建完成状态匹配时触发构建。

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

  1. 声明需要自动安装构建所需的工具,并设置到PATH环境变量里。
  2. 当agent none时,tools声明将会被忽略。
  3. 支持自动安装的工具有

    1. jdk
    2. maven
    3. 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)

  1. stage参数输入指令。
  2. 在进入agent模块和when条件判断之前,stage将会被暂停并弹出输入对话框,直到用户输入可用参数后stage才会继续执行。
  3. 所有输入的参数在余下的stage指令中都可以通过环境变量获取。



12.1、input配置选项



12.1.1、messgae(必输)

提示信息



12.1.2、id

  1. 唯一标识
  2. 默认使用该stage名称。



12.1.3、ok

按钮名称。



12.1.4、submitter

  1. 以”,”分割的用户或外部组的列表,定义谁可以提交这个输入项
  2. 默认所有人。



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)

  1. 通过设定的条件判断决定pipeline流水线的当前stage是否执行
  2. when命令至少包含一个条件判断。
  3. 如果when包含多个条件判断,那么当且仅当所有条件判断都为true时,当前stage才会被执行。
  4. 正常情况下when判断时在agent,input,options命令之后才执行的,但是可以通过beforeAgent,beforeInput,beforeOptions参数来设置提前执行。
  5. 注意:如果我们想要在进入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

  1. 只使用于多分支结构流水线。
  2. 当构建分支匹配给定的分支或正则表达式时为true,当前stage就执行下去。



13.1.1、匹配规则

  1. EQUALS:字符串比较。
  2. GLOB:ANT通配符
  3. 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、匹配规则

  1. EQUALS:字符串比较。
  2. GLOB:ANT通配符
  3. 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

  1. 当因SCM发生变更请求(aka,GitHub and Bitbucket:Pull Request,GitLab:Merge Request, Gerrit: Change Request)而构建时为true。
  2. 可添加过滤属性,来筛选符合条件的变更请求

    id

    target

    branch

    fork

    url

    title

    author

    authorDisplayName

    authorEmail



13.5.1、过滤属性匹配规则

  1. EQUALS:字符串比较。
  2. GLOB:ANT通配符
  3. 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

  1. 当给定的groovy表达式返回值为true。
  2. 如果返回值是字符串,那么当返回为null时为false,其他字符串都表示为true。



13.8.1、案例

when { 
  expression { 
    return params.DEBUG_BUILD 
  } 
}



13.9、tag

  1. 当TAG_NAME环境变量匹配给定正则表达式时为true。
  2. 如果表达式为空则只要TAG_NAME环境变量存在则为true。



13.9.1、匹配规则

  1. EQUALS:字符串比较。
  2. GLOB:ANT通配符
  3. 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

  1. 通过将阶段设置为parallel来表明该stage为并行运行。
  2. 通过在包含parallel的stage里设置failFast true,当其中一个并行stage执行失败时强制终止其他并行stage。
  3. 可以在options里做全局设置parallelsAlwaysFailFast()。
  4. 1个stage只能有1个steps或者parallel
  5. 嵌套的stages里不能使用parallel
  6. 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

  1. 按name-value定义的命名空间矩阵,可在stage里使用定义并行任务。
  2. matrix必需包含一个axes和一个stages。
  3. failFast和parallelsAlwaysFailFast()也使用于matrix。



15.1、axes

每一个axes必需包含一个或以上axis



15.2、axis

  1. 每个axis包含一个name和一个values列表
  2. 所有axies中的values列表彼此组合产生命名空间cell。
  3. stages将按循序在各个cell中被执行。
  4. 每个命名空间的name-value键值对将自动创建对应的环境变量。



15.3、excludes

  1. 按命name-value名空间移除不需要执行的cell。
  2. 当移除的命名空间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 '执行失败'
                        
                    }
                }
            }
        }
    }
}

在这里插入图片描述



版权声明:本文为zhou920786312原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。