jenkins  pipeline 总体介绍

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:, 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:, 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 的内置条件

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

11111

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

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

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

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

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

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

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

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

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

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

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

  6. Hadoop Hive sql语法详解

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

  7. Thymeleaf3语法详解和实战

    Thymeleaf3语法详解 Thymeleaf是Spring boot推荐使用的模版引擎,除此之外常见的还有Freemarker和Jsp.Jsp应该是我们最早接触的模版引擎.而Freemarker工 ...

  8. Xpath语法详解

    1.简介 XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历 XPath的安装 Chrome插件XPath Helper 点Chrome浏览器 ...

  9. mysql用户授权、数据库权限管理、sql语法详解

    mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...

  10. Java8的Stream语法详解(转载)

    1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...

随机推荐

  1. Kafka Producer源码简述

    接着上文kafka的简述,这一章我们一探kafka生产者是如何发送消息到消息服务器的. 代码的入口还是从 kafkaTemplate.send开始 最终我们就会到 org.springframewor ...

  2. Softmax函数详解与推导

    一.softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个 ...

  3. RabbitMQ消息队列(十二)-性能测试

    硬件配置 宿主机用的联想3850X6的服务器四颗E7-4850v3的处理器,DDR4内存,两块1.25TB的pcie固态.在宿主机上使用的事esxi5.5的虚拟化平台,在子系统中安装RabbitMQ和 ...

  4. 【bug】----- Git上传文件错误导致本地代码丢失

    1.问题描述:通过Git上传本地文件,在git commit操作后本地未上传的代码全部丢失... 2.解决: 第一步:在项目目录下打开Git Bash: 第二步:输入 git reflog 第三步:在 ...

  5. DocX开源WORD操作组件的学习系列二

    DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...

  6. 五一之起一台服务器玩玩-u盘安装centos

    之前淘宝买的300块钱笔记本,就是拿来练手的,但是命令基本都知道了,不来练手,学习下去就没有动力了啊. 对于新的笔记本,我们怎么安装系统呢?能去官网就去官网,你绝对没有体验过睡一晚早上起来服务器就被黑 ...

  7. 第48章 UserInfo端点(UserInfo Endpoint) - Identity Server 4 中文文档(v1.0.0)

    UserInfo端点可用于检索有关用户的身份信息(请参阅规范). 调用者需要发送代表用户的有效访问令牌.根据授予的范围,UserInfo端点将返回映射的声明(至少需要openid作用域). 示例 GE ...

  8. C#对象比较的总结

    简单整型比较: 从这里可以看出整型比较无论是==和Equals方法都是进行比较,比较“正常” ; ; Console.WriteLine(m1 == m2);//值比较True Console.Wri ...

  9. C# Redis 过期机制不生效问题

    引用: https://ask.csdn.net/questions/358802 根据这里的代码写出监听事件后,事件并没有生效 在比对了多次配置文件后,终于发现了一点蹊跷,在配置中不能有与之相冲的配 ...

  10. 熟悉常用的HBase操作,编写MapReduce作业

    1. 以下关系型数据库中的表和数据,要求将其转换为适合于HBase存储的表并插入数据: 学生表(Student) 学号(S_No) 姓名(S_Name) 性别(S_Sex) 年龄(S_Age) 201 ...