Jenkins Pipeline 持续集成
Pipeline Script 基础
在使用Pipeline之前请确保Jenkins是2.x版本以上,并且安装了Pipeline插件。
Jenkins提供了pipeline
方法,作为配置的入口。该方法接受一个闭包,在闭包内定义配置:
pipeline {
// do some thing
}
闭包内的方法层级结构:
- stages
- stage
- steps
- step
- steps
- stage
一个例子:
pipeline {
agent any
stages {
stage('1. 初始化') {
steps {
script {
println("Hello")
}
}
}
}
对于上述例子的执行逻辑:
Jenkins关心的一个入口就是pipeline
方法,调用的时候执行我们传递给pipeline的闭包。该闭包内包含一段代码,执行时其实就是这闭包的执行过程。对于上面那段配置执行流程为:
- 调用agent方法,参数是any
- 调用stages方法,参数是个闭包,开始执行闭包
- 调用stage传入参数
1. 初始化
, 调用后返回的方法还接受闭包。 - 执行script的闭包
- 向上返回,执行结束
通过执行过程来看JenkinPipeline的设计非常简单,主要是利用Groovy语言的闭包特性和调用无参方法不需要括号的特性。但是这样设计也有明显的缺点: - 无法直接看出各层的依赖关系。
- 配置抽象,Java程序员不容易理解,具有一定的学习成本。
我们可以将上面的配置改造成类似Java程序的写法:
def myScript = {println("Hello")}
def myScriptInStep = script(myScript)
def mySteps = steps(myScriptInStep)
def initStage = stage('1. 初始化')(mySteps)
def pipelineFunc = {
agent any
stages initStage
}
pipeline pipelineFunc
这样写对象之间的关系清楚了,但是没有闭包的那种写法直观。
多分支
Jenkins同样可以对多分支进行处理。它可以同时监控多个分支,并且通过groovy
灵活配置。在集成的过程中,有的分支提交代码可能需要测试,通过之后才能合并;有的分支提交代码可能是可以部署了,我们可以根据不同的分支决定持续集成的操作,通过when
方法可以设置stage
执行的条件:
pipeline{
stages{
stage("init"){
when {
branch 'dev'// 当代码的分支为dev 执行当前stage
}
}
}
}
创建build时需要配合多分支Pipeline使用,这个特性可以通过Pipeline可视化体现出来。
并行执行
如果测试阶段有多个单元测试,为了提高速度可以将这些单元测试并行执行。
通过Jenkins可以在Stage中创建并行执行的子Stage,并且为这些Stage分配不同的运行节点。
pipeline{
stages{
stage("init"){
parallel{ // 创建并行的子stages
stage("init 1"){
// do some thing
}
stage("init 2"){
// do some thing
}
}
}
}
}
在上述配置的stagesinit 1
和init 2
中可以分别执行不同的单元测试,并同时运行达到节省时间的目的,这个优势在单元测试较多时候表现比较明显。