目录
前言
提到 CI 工具,首先想到的就是"CI 界"的大佬------Jenkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的 CI 工具,但是都不足以撼动 Jenkins 的地位。在企业中对于持续集成、持续部署的需求非常多,并且也会经常有-些比较复杂的需求,此时新生的 CI 工具不足以支撑这些很复杂的需求。但是 Jenkins丰富的插件基本上可以满足任何场景。
流水线概念
什么是流水线
Jenkins 流 水 线 是 一 套 插 件 , 它 支 持 在 Jenkins 中 实 现 和 集 成 持 续 交 付 流 水 线(ContinuousDeliveryPipeline)。流水线提供了一组可扩展的工具,用于通过 Pipeline DSL 将简单到复杂的交付流水线以代码的形势展现,类似于基础设施即代码。
持续交付流水线会经历一个复杂的过程:从版本控制、向用户和客户提交软件、软件的每次变更(提交代码到仓库)到软件发布(Release)。这个过程包括以一种可靠并可重复的方式构建软件,以及通过多个测试和部署阶段来开发构建好的软件(称为 Build)。
Jenkins 流水线的定义被写在一个文本文件中(一般为 Jenkinshle),该文件"定制"了整个构建软件的过程. Jenkinsfile 也可以被提交到项目的代码仓库中,在 Jenkjns 中可以直接引用。将持续交付流水线作为应用程序的一部分,像其他代码一样进行版本化和审查,这是流水线即代码的基础。
创建 Jenkinsfile 并提交到代码仓库中的好处如下:
- 自动为所有分支创建流水线构建过程。
- 在流水线上进行代码复查/迭代。
- 对流水线进行审计跟踪。
- 流水线的代码可以被项目的多个成员查看和编辑。
- 可以对 Jenkinsfile 进行版本控制。
Jenkins流水线
Jenkins 流水线主要分为声明式分和脚本式两种,包含 pipline(流水线)、node(节点)、stage(阶段)、step(步骤)等区块。
pipeline
pipeline 是用户定义的一个持续交付(CD)流水线模型。流水线的代码定义了整个构建过程,包括构建、测试和交付应用程序的阶段。另外,pipeline 块是声明式流水线语法的关键部分。
node
node 是---个机器,它是 Jenkins 环境的-部分,另外,node 块是脚本化流水线语法的关键部分。
stage
stage 块定义了在整个流水线的执行任务中概念不同的子集(比如 Bujld、Test、Deploy 阶段),它被许多插件用于可视化 Jenkins 流水线当前的状态/进展。
step
本质上是指通过一个单一的任务告诉 Jenkins 在特定的时间点需要做什么,比如要执行 shell 命令,可以使用 sh SHELL_COMMAND。其运行里程如下图所示:
从上文可以了解,Jenkins 流水线分为脚本式和声明式,而声明式是"新一代"的流水线, 比脚本式更加灵活,可读性更强,并且声明式流水线支持以图形化的方式进行编辑,所以声明式流水线是着重学习的对象。
创建一个简单的流水线
创建Pipeline项目
选择模板
在定义中选择"Pipline script",模板使用"Hello World"
- stages:代表整个流水线的所有执行阶段。通常 stages 只有 1 个,里面包含多个 stage
- stage:代表流水线中的某个阶段,可能出现 n 个。一般分为拉取代码,编译构建,部署等阶段。
- steps:代表一个阶段内需要执行的逻辑。steps 里面是 shell 脚本,git 拉取代码,ssh 远程发布等任意内容。
agent 指定了流水线的执行节点。
参数:
- any 在任何可用的节点上执行 pipeline。
- none 没有指定 agent 的时候默认。
- label 在指定标签上的节点上运行 Pipeline。
- node 允许额外的选项。
根据流水线或阶段的完成情况而运行(取决于流水线中 post 部分的位置).
post 支持以下post-condition 块中的其中之一: always, changed, failure, success, unstable, 和 aborted。这些条件块允许在 post 部分的步骤的执行取决于流水线或阶段的完成状态。
- always 无论流水线或者阶段的完成状态。
- changed 只有当流水线或者阶段完成状态与之前不同时。
- failure 只有当流水线或者阶段状态为"failure"运行。
- success 只有当流水线或者阶段状态为"success"运行。
- unstable 只有当流水线或者阶段状态为"unstable"运行。例如:测试失败。
bash
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
always {
echo 'I will always say Hello again!'
}
}
}