博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jenkins pipeline 语法详解
阅读量:5088 次
发布时间:2019-06-13

本文共 10131 字,大约阅读时间需要 33 分钟。

原文地址http://www.cnblogs.com/fengjian2016/p/8227532.html

pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。

pipeline 是jenkins2.X 最核心的特性, 帮助jenkins 实现从CI 到 CD与 DevOps的转变

 

pipeline 提供一组可扩展的工具, 通过 pipeline domain specific language syntax 可以到达pipeline as code 目的

pipiline as code :  jenkinsfile 存储在项目的 源代码库

 

为什么要使用pipeline

1. 代码: pipeline 以代码的形式实现,通过被捡入源代码控制, 使团队能够编译,审查和迭代其cd流程

2 可连续性: jenkins 重启 或者中断后都不会影响pipeline job

3.停顿: pipeline 可以选择停止并等待人工输入或者批准,然后在继续pipeline运行

4.多功能:  pipeline 支持现实世界的复杂CD要求, 包括fork、join子进程,循环和并行执行工作的能力

5.可扩展: pipeline 插件支持其DSL的自动扩展以及其插件集成的多个选项。

 

 

jenkins pipeline 入门

pipeline 脚本是有groovy 语言实现的

-无需专门学习 groovy

 

pipeline 支持两种语法

  -  Declarative 声明式

  -  Scripted pipeline  脚本式

 

如何创建基本的pipeline

  -  直接在jenkins web ui 网页界面输入脚本

  -  通过常见一个jenkins 可以检入项目的源代码管理库

 

 

Declarativ 声明式 pipeline

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

  -  声明式pipeline 必须包含在固定格式的pipeline{} 块内

  -  每个声明语句必须独立一行, 行尾无需使用分号

  -   块(Blocks{}) 只能包含章节(Sections),指令(Directives),步骤(Steps),或者赋值语句

  -  属性引用语句被视为无参数方法调用。 如input()

 

块(Blocks{})

  -  由大括号括起来的语句: 如 Pipeline{}, Sections{}, parameters{}, script{}

章节(Sections)

  -  通常包括一个或者多个指令或步骤 如 agent,post,stages,steps

指令(Directives)

  -  environment, options, parameters, triggers, stage, tools, when

步骤(steps)

  -  执行脚本式pipeline, 如script{}

 

 

agent

需要 必须存在,agent必须在pipeline块内的顶层定义,但是stage内是否使用为可选
参数 any/none/label/node/docker/dockerfile
常用参数 label/customWorkspace/reuseNode
展示:
agent { label 'this k8s-api-label'} 

agent {

    node{

      label ' this is k8sapi-label'

      customWorkspace '/some/other/path'

    }

}

agent {

     docker {

        image 'im-web'

        label 'this is k8sapi-label'

        args '-v /tmp:/tmp'

      }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

# customWorkspace  node节点的工作空间

 

 

post

需要 否,用于pipeline的最外层或者stage{}中
参数
常用选项

构建后操作的内置判定条件

always,changed,failure,sucess,unstable,aborted

展示:
pipeline {    agent any    stages {        stage('Example') {            steps {                echo 'Hello World'            }        }    }    post {        always {            echo 'I will ........!'        }    }}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

stages

需要 是,包括顺序执行的一个或者多个stage命令
参数
常用选项

构建后操作的内置判定条件

always,changed,failure,sucess,unstable,aborted

展示:
pipeline {    agent any    stages {        stage('Example') {            steps {                echo 'Hello World'            }        }    }      stage('echo') {          steps {              echo 'I will ........!'          }      }}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

steps

需要 是,steps位于stage指令块内部,包括一个或者多个step
参数
说明

仅有一个step的情况下可以忽略关键字step及其{}

展示:
pipeline {    agent any    stages {        stage('Example') {            steps {                echo 'Hello World'            }        }    }      stage('echo') {          steps {              echo 'I will ........!'          }      }}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Directives (指令)

 

environment指令指定一系列键值对,这些键值对将被定义为所有step或stage-specific step的环境变量,具体取决于environment指令在Pipeline中的位置。

该指令支持一种特殊的方法credentials(),可以通过其在Jenkins环境中的标识符来访问预定义的凭据。
对于类型为“Secret Text”的凭据,该 credentials()方法将确保指定的环境变量包含Secret Text内容;对于“标准用户名和密码”类型的凭证,指定的环境变量将被设置为username:password。

 

environment

需要 是,environment 定义了一组全局的环境变量键值对
参数
说明

存在于pipeline{} 或者stage指令内,

注意特殊方法credentials() ,可以获取jenkins中预定义的凭证明文内容

展示:
pipeline {    agent any        environment {        SONAR_SERVER = 'http://172.16.230.171:9000'    }        stages {        stage('Example') {            steps {                echo "${SONAR_SERVER}"            }        }    }}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

options

buildDiscarder

    pipeline保持构建的最大个数。例如:options { buildDiscarder(logRotator(numToKeepStr: '1')) }
  disableConcurrentBuilds
    不允许并行执行Pipeline,可用于防止同时访问共享资源等。例如:options { disableConcurrentBuilds() }
  skipDefaultCheckout
    默认跳过来自源代码控制的代码。例如:options { skipDefaultCheckout() }
  skipStagesAfterUnstable
    一旦构建状态进入了“Unstable”状态,就跳过此stage。例如:options { skipStagesAfterUnstable() }
  timeout
    设置Pipeline运行的超时时间。例如:options { timeout(time: 1, unit: 'HOURS') }
  retry
    失败后,重试整个Pipeline的次数。例如:options { retry(3) }
  timestamps
    预定义由Pipeline生成的所有控制台输出时间。例如:options { timestamps() }

 

options

需要 否,预定义pipeline专有的配置信息,仅可定义一次
参数
说明
authorizationMatrix, buildDiscarder, catchError, disableConcurrentBuilds, overrideIndexTriggers, retry, script, skipDefaultCheckout, skipStagesAfterUnstable, timeout, waitUntil, withContext, withCredentials, withEnv, ws
展示: 设置构建超时时间 为1个小时
pipeline {    agent any        options {        timeout(time:1, unit: 'HOURS')    }        environment {        SONAR_SERVER = 'http://172.16.230.171:9000'        JAVA_HOME='/data/jdk'    }        stages {        stage('sonarserver') {            steps {                echo "${SONAR_SERVER}"            }        }        stage('javahome') {            steps {                echo "${JAVA_HOME}"            }        }    }}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

parameters

 parameters指令提供用户在触发Pipeline时的参数列表。这些参数值通过该params对象可用于Pipeline步骤

可用参数

  string
    A parameter of a string type, for example: parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }
  booleanParam
    A boolean parameter, for example: parameters { booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') }
  目前只支持[booleanParam, choice, credentials, file, text, password, run, string]这几种参数类型,其他高级参数化类型还需等待社区支持。

 

parameters

需要 否,定义参数化构建的参数
参数
说明
booleanParam,choice,file,text,password,run,string
示例

 

pipeline {    agent any        options {        timeout(time:1, unit: 'HOURS')    }        parameters {        choice(name:'PerformMavenRelease',choices:'False\nTrue',description:'desc')     //   password(name:'CredsToUse',defaultValue:'',description:'A password to build with')    }        environment {        SONAR_SERVER = 'http://172.16.230.171:9000'        JAVA_HOME='/data/jdk'    }        stages {        stage('sonarserver') {            steps {                echo "${SONAR_SERVER}"            }        }        stage('javahome') {            steps {                echo "${JAVA_HOME}"            }        }        stage('get parameters') {            steps {                echo "${params.PerformMavenRelease}"            }        }            }}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

调用定义的参数, 需要使用 params.PerformMavenRelease

 

 

 

 

 

 

 

 

triggers

 

triggers指令定义了Pipeline自动化触发的方式。对于与源代码集成的Pipeline,如GitHub或BitBucket,triggers可能不需要基于webhook的集成也已经存在。目前只有两个可用的触发器:cron和pollSCM。

triggers

需要 否,定义pipeline被自动触发的方式
参数
说明
cron,pollSCM,upstream
示例

 

pipeline {    agent any        options {        timeout(time:1, unit: 'HOURS')    }        parameters {        choice(name:'PerformMavenRelease',choices:'False\nTrue',description:'desc')     //   password(name:'CredsToUse',defaultValue:'',description:'A password to build with')    }        environment {        SONAR_SERVER = 'http://172.16.230.171:9000'        JAVA_HOME='/data/jdk'    }       triggers {
     cron('H 4/* 0 0 1-5') } stages { stage('sonarserver') { steps { echo "${SONAR_SERVER}" } } stage('javahome') { steps { echo "${JAVA_HOME}" } } stage('get parameters') { steps { echo "${params.PerformMavenRelease}" } } }}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

when

  when指令允许Pipeline根据给定的条件确定是否执行该阶段。该when指令必须至少包含一个条件。如果when指令包含多个条件,则所有子条件必须为stage执行返回true。这与子条件嵌套在一个allOf条件中相同(见下面的例子)。

更复杂的条件结构可使用嵌套条件建:not,allOf或anyOf。嵌套条件可以嵌套到任意深度

 

 内置条件
  branch
    当正在构建的分支与给出的分支模式匹配时执行,例如:when { branch 'master' }。请注意,这仅适用于多分支Pipeline。
  environment
    当指定的环境变量设置为给定值时执行,例如: when { environment name: 'DEPLOY_TO', value: 'production' }
  expression
    当指定的Groovy表达式求值为true时执行,例如: when { expression { return params.DEBUG_BUILD } }
  not
    当嵌套条件为false时执行。必须包含一个条件。例如:when { not { branch 'master' } }
  allOf
    当所有嵌套条件都为真时执行。必须至少包含一个条件。例如:when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }
  anyOf
    当至少一个嵌套条件为真时执行。必须至少包含一个条件。例如:when { anyOf { branch 'master'; branch 'staging' } }

 

when

需要
参数
说明
inside a stage directive
pipeline {    agent any    stages {        stage('Example Build') {            steps {                echo 'Hello World'            }        }        stage('Example Deploy') {            when {                allOf {                    branch 'production'                    environment name: 'DEPLOY_TO', value: 'production'                }            }            steps {                echo 'Deploying'            }        }    }}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Parallel(并行)

 

 Declarative Pipeline近期新增了对并行嵌套stage的支持,对耗时长,相互不存在依赖的stage可以使用此方式提升运行效率。除了parallel stage,单个parallel里的多个step也可以使用并行的方式运行。

pipeline {    agent any    stages {        stage('Non-Parallel Stage') {            steps {                echo 'This stage will be executed first.'            }        }        stage('Parallel Stage') {            when {                branch 'master'            }            parallel {                stage('Branch A') {                    agent {                        label "for-branch-a"                    }                    steps {                        echo "On Branch A"                    }                }                stage('Branch B') {                    agent {                        label "for-branch-b"                    }                    steps {                        echo "On Branch B"                    }                }            }        }    }}

 

 

 

 

 

 

 

变量传递

1. 自定义变量(局部)

def username = 'jenkins'echo "hello Mr.${username}"

 

2. 环境变量

withEnv(['JAVA_HOME=/data/jdk']) {  sh '$JAVA_HOME/bin/start.sh'}

 

3. 环境变量(全局)

environment {        JAVA_HOME='/data/jdk'        }echo " java path $JAVA_HOME"

 

4. 参数化构建(全局)

parameters  {        string(name: 'GIT_BRANCH', defaultValue: 'master', description: 'default build branch')  }调用: echo  "${params.name}"

 

 

判断:

1.when 仅用于stage内部

2. when 的内置条件

1). when {branch 'master'}  #当是master的时候,才执行某些事情                                            2). when {envionment name:'DEPLOY_TO',value:'production'}  #当环境变量name 的值是production的时候,才执行某些事情3). when {expression {return params.DEBUG_BUILD}}   #表达式的返回值是真的情况下,才执行4). when {not {branch 'master'}}            #不是master的情况下,执行5). when {allOf {branch 'master'; environment name: 'DEPLOY_TO',value:'production'}} #当大括号中所有的项都成立,才去做某些事情6). when {anyOf {branch 'master'; branch 'staging'}}  #只要满足大括号里面的某一个条件,才去做某些事情

 

转载于:https://www.cnblogs.com/111testing/p/9721424.html

你可能感兴趣的文章
mysql中配置ssl_key、ssl-cert、ssl-ca的路径及建立ssl连接(适用于5.7以下版本,5.7及以上请看本文末尾的备注)...
查看>>
select2 简单解析
查看>>
学生党必备 超级计算器
查看>>
arm学习笔记六(协处理器)
查看>>
牛客网2016校招真题在线编程之懂二进制
查看>>
UVA11734_Big Number of Teams will Solve This
查看>>
DP Codeforces Round #FF (Div. 1) A. DZY Loves Sequences
查看>>
acdream1116 Gao the string!(hash二分 or 后缀数组)
查看>>
Django 模型
查看>>
mysql手动安装之后出现的问题与解决
查看>>
File转换成MultiPartFile
查看>>
JavaScript创建对象
查看>>
10.9做题——洛谷P1927防护伞
查看>>
使用thinkphp3.2中的验证码功能
查看>>
数据结构树之二叉树
查看>>
Nginx部署静态页
查看>>
剑指 offer set 3 旋转数组的最小数字
查看>>
存储类型auto,static,extern,register的区别 <转>
查看>>
【Git使用】SourceTree可视化工具的安装和使用攻略
查看>>
单例模式
查看>>