- Pipeline是Jenkins的核心功能,提供一组可扩展的工具。
- 通过Pipeline 的DSL语法可以完成从简单到复杂的交付流水线实现。
- jenkins的Pipeline是通过Jenkinsfile(文本文件)来实现的。
- 这个文件可以定义Jenkins的执行步骤,例如检出代码。
- Jenkinsfile使用两种语法进行编写,分别是声明式和脚本式。
- 声明式和脚本式的流水线从根本上是不同的。
- 声明式是jenkins流水线更友好的特性。
- 脚本式的流水线语法,提供更丰富的语法特性。
- 声明式流水线使编写和读取流水线代码更容易设计。
本质上,jenkins是一个自动化引擎,它支持许多自动模式。流水线向Jenkins添加了一组强大的工具,支持用例、简单的持续集成到全面的持续交付流水线。 通过对一系列的发布任务建立标准的模板,用户可以利用更多流水线的特性,比如:
- 代码化: 流水线是在代码中实现的,通常会存放到源代码控制,使团队具有编辑、审查和更新他们项目的交付流水线的能力。
- 耐用性:流水线可以从Jenkins的master节点重启后继续运行。
- 可暂停的:流水线可以由人功输入或批准继续执行流水线。
- 解决复杂发布: 支持复杂的交付流程。例如循环、并行执行。
- 可扩展性: 支持扩展DSL和其他插件集成。
构建一个可扩展是Jenkins的核心价值,流水线可以通过ShareLibrary的方式来扩展。 下面是一个CD的场景实例
参考文档:https://jenkins.io/zh/doc/book/pipeline/
节点是一个机器,可以是Jenkins的master节点也可以是slave节点。通过node指定当前job运行的机器(这个是脚本式语法)。
- 声明式Pipeline: 使用agent指定运行的slave节点可以是label。
pipeline{
agent any
stages{
//
}
}
- 脚本式Pipleine: 使用node指定运行slave可以是label。
node("slave"){
stage("GetCode"){
//
}
}
stage定义了在整个流水线的执行任务的概念性的不同的阶段。例如: GetCode、Build、Test、Deploy、CodeScan每个阶段。
- 声明式pipeline: 定义stages->stage。
pipeline{
agent any
stages{
stage("GetCode"){
//steps
}
stage("build"){
//step
}
}
}
- 脚本式Pipeline: 直接使用stage。
node("slave"){
stage("GetCode"){
//
}
stage("build"){
//
}
}
step是每个阶段中要执行的每个步骤。例如: 在执行GetCode的时候需要判断用户提供的参数srcType的值是Git还是svn。
- 声明式Pipeline: stage->steps。
pipeline{
agent any
stages{
stage("GetCode"){
steps{
sh "ls " //step
}
}
}
}
- 脚本式Pipeline: 不需要step关键字。
node("slave"){
stage("GetCode"){
//step
if("${srcType}" == "Git"){
//用git方式代码检出
} else if ("${srcType}" == "SVN"){
//用svn方式代码检出
} else {
error "srcType is not in [Git|SVN]"
}
}
}
如果你是新手,Blue Ocean可以帮助你设置流水线,通过图形化流水线编辑器自动创建和编写Jenkinsfile。(需要安装blueocean 插件)