原文地址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'}} #只要满足大括号里面的某一个条件,才去做某些事情

Jenkins pipeline 语法详解的更多相关文章

  1. Jenkins pipeline:pipeline 语法详解

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

  2. Jenkins Pipeline 参数详解

    Pipeline 是什么 Jenkins Pipeline 实际上是基于 Groovy 实现的 CI/CD 领域特定语言(DSL),主要分为两类,一类叫做 Declarative Pipeline,一 ...

  3. [持续交付实践] pipeline使用:语法详解

    一.引言 jenkins pipeline语法的发展如此之快用日新月异来形容也不为过,而目前国内对jenkins pipeline关注的人还非常少,相关的文章更是稀少,唯一看到w3c有篇相关的估计是直 ...

  4. 自动化集成:Pipeline流水语法详解

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述Pipeline流水线用法. 一.Webhook原理 ...

  5. [转帖]helm模板文件chart编写语法详解

    helm模板文件chart编写语法详解 https://blog.51cto.com/qujunorz/2421328 需要学习一下. charts编写介绍 开始 快速创建一个chart模板,helm ...

  6. 利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解

    本文转载自利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解 导语 由于最近工作需要利用 Jenkins 远程 API 操作 Jenkins 来完成一些列操作,就抽空研究 ...

  7. Velocity魔法堂系列二:VTL语法详解

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  8. Hive笔记--sql语法详解及JavaAPI

    Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...

  9. Hadoop Hive sql语法详解

    Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...

随机推荐

  1. uploadify中文开发文档,解决php多图上传

    图片上传好用插件有,比如 uploadify  ueditor html5的各种ajax上传插件,大部分都是异步,返回只是true之类,有些时候需要上传图片需要一起上传,其实可以通过操作流程来避免这个 ...

  2. Codeforces 219C - Color Stripe - [DP]

    题目链接:http://codeforces.com/problemset/problem/219/C 题意: 给你 $n$ 个方块排成水平一排,每个方块都涂上 $k$ 种颜色中的一种.要求对尽量少的 ...

  3. Lombok安装及使用

    为什么要使用Lombok: 虽然一般的IDE(eclipse,Intellij)都有自动生成代码的功能,如:生成setter,getter,toString,equels,hashcode等.但是如果 ...

  4. Gym - 101375H MaratonIME gets candies 交互题

    交互题介绍:https://loj.ac/problem/6 题意:输出Q X ,读入><= 来猜数,小于50步猜出就算过样例 题解:根本不需要每次输出要打cout.flush()... ...

  5. splash 安装

    搞定NVIDIA显卡后,开始弄splash 根据 https://github.com/paperManu/splash 提示 最简安装就是用apt sudo apt install flatpak ...

  6. centos7安装Apache

    1.下载安装包wget http://mirrors.hust.edu.cn/apache/httpd/httpd-2.4.37.tar.gz 2.解压tar zxvf httpd-2.4.37.ta ...

  7. Page3:组合系统状态空间输入输出描述、矩阵指数函数性质[Linear System Theory]

    内容包含组合系统的状态空间描述以及输入输出描述,零输入响应的概念以及矩阵指数函数的性质

  8. [daily][centos] redhat增加扩展仓库

    https://rpmfusion.org/Configuration sudo yum localinstall --nogpgcheck https://download1.rpmfusion.o ...

  9. [skill][funny] 一个很厉害的for循环

    int DSSL_MoveServerToMissingKeyList( DSSL_Env* env, DSSL_ServerInfo* si ) { DSSL_ServerInfo** new_se ...

  10. 安装多个java后,java版本不对

    参考资料: https://www.cnblogs.com/Kidezyq/p/5781131.html 主要原因是javac -version是由JAVA_HOME指定的路径中的java版本来决定的 ...