Jenkins Pipeline 的核心概念:
-
Pipeline 是一套运行于
Jenkins
上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。 -
Pipeline是 Jenkins2.X 的
最核心的特性
,帮助Jenkins 实现从CI到CD与DevOps的转变。 -
Pipeline是一组插件,让
Jenkins
可以实现持续交付管道的落地和实施。
持续交付管道(CD Pipeline)是将软件从版本控制阶段到交付给用户或客户的完整过程的自动化表现。软件的每一次更改(提交到源代码管理系统)都要经过一个复杂的过程才能被发布。
Pipeline提供了一组可扩展的工具,通过Pipeline Domain Specific Language(DSL)syntax可以达到Pipeline as Code(Jenkinsfile存储在项目的源代码库)的目的。
Pipeline入门:
先决条件
要使用Jenkins Pipeline,您将需要:
- Jenkins 2.x或更高版本
- Pipeline插件(请自行在插件管理中安装。)
Pipeline 定义
脚本Pipeline是用Groovy写的 。Groovy相关语法请移步>。
Pipeline支持两种语法:
- Declarative 声明式
- Scripted pipeline 脚本式
如何创建基本Pipeline:
- 直接在Jenkins网页界面中输入脚本。
- 通过创建一个Jenkinsfile可以检入项目的源代码管理库。
用任一方法定义Pipeline的语法是一样的,但是Jenkins支持直接进入Web UI的Pipeline,通常认为最佳实践是在Jenkinsfile Jenkins中直接从源代码控制中加载Pipeline。
在Web UI中定义Pipeline
要在Jenkins Web UI中创建基本Pipeline:
-
单击Jenkins主页上的New Item。
-
输入Pipeline的名称,选择Pipeline,然后单击确定。
-
在脚本文本区域中,输入Pipeline,然后单击保存。
-
单击立即生成以运行Pipeline,查看控制台输出。
Pipeline几个核心概念:
-
Stages:阶段组/Stage:阶段
- 一个 Pipeline 有多个 Stage 组成,每个 Stage 包含一组 Step。
- 注意一个 Stage 可以跨多个 Node 执行,即 Stage 实际上是 Step 的逻辑分组。
- 一个Jenkinsfile 可以分为大的阶段,如打包、构建、 部署。测试
- 构建的流程,可以分为这几步,获取源代码,然后打包,构建,进行编译,替换配置文件,编译完打包,进行部署 这个阶段就是stage
-
Node:节点,一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行环境。
-
Steps:步骤,Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenklins Plugin提供,例如:sh ‘make’
Pipeline几个核心关键字:
-
块(blocks{}):
由大括号括起来的语句,如pipeline{},Section{},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/cuetomWorkspace/reuseNode
指令名 | 说明 | 作用域 |
---|---|---|
agent | 定义执行任务的代理 | stage 或pipeline |
input | 暂停pipeline,提示输入内容 | stage |
environment | 设置环境变量 | stage或pipeline |
tools | 自动下载并安装指定的工具,并将其加入到PATH变量中 | stage或pipeline |
options | 配置Jenkins pipeline本身,如options{retry(3}},指pipeline失败时再重试2次 | stage 或 pipeline |
build | 触发其他的job | steps |
when | 定义阶段执行的条件 | stage |
triggers | 定义执行pipeline的触发器 | pipeline |
parameters | 执行pipeline前传入一些参数 | pipeline |
parallel | 并行执行多个step | stage |
示例:
-
agent:
agent { label 'my-label' } agent { node { label 'my-label' customWorkspace '/some/other/path' } } agent { docker { image 'application_name:verison' label 'my-label' args '-v /tmp:/tmp' } }
-
stage间通过stash进行文件共享,即使stage不在同一个执行主机上:
pipeline{ agent none stages{ stage('stash'){ agent { label "master" } steps{ writeFile file: "a.txt", text: "$BUILD_NUMBER" stash name: "abc", includes: "a.txt" } } stage('unstash'){ agent { label "node" } steps{ script{ unstash("abc") def content = readFile("a.txt") echo "${content}" } } } } }
-
steps中的一些操作:
命令名 说明 error 抛出异常,中断整个pipeline timeout timeout闭包内运行的步骤超时时间 waitUntil 一直循环运行闭包内容,直到return true,经常与timeout同时使用 retry 闭包内脚本重复执行次数 sleep 暂停pipeline一段时间,单位为秒 pipeline{ agent any stages{ stage('stash'){ steps{ timeout(50){ waitUntil{ script{ def r = sh script: 'curl http://xxx', returnStatus: true return (r == 0) } } } retry(10){ script{ sh script: 'curl http://xxx', returnStatus: true } } sleep(20) } } } }
-
triggers:定时构建
pipeline { agent any triggers { cron('H 9 * * *') }