Pipeline流水线
1 Pipeline概念介绍
Jenkins Pipeline(流水线) 是帮助 Jenkins 实现 CI 到 CD 转变的重要角色。
简单来说,就是一套运行于 Jenkins 上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。
Pipeline 的实现方式是 一套 Groovy DSL(Groovy DSL语言主要是用来编写Pipeline脚本)任何发布流程都可以表述为一段 Groovy 脚本,并且 Jenkins 支持从代码库直接读取脚本,从而实现了流水线管道的理念。
2 Pipeline的几个基本概念
Node(节点):一个 Node 就是一个 Jenkins 节点,可以是 Master,也可以是 Slave,是 Pipeline 中具体 Step(步骤)的运行环境。
Stage(阶段):一个 Pipeline 由多个 Stage 组成,每个 Stage(阶段) 包含一组 Step(步骤)。注意一个 Stage(阶段) 可以跨多个 Node(节点) 执行,即 Stage(阶段) 实际上是 Step(步骤)的逻辑分组。
Step(步骤):是最基本的运行单元,可以是创建一个目录、执行一个代码打包、执行 一个 shell 命令、构建 Docker 镜像、将服务发布到 Kubernetes 集群中。
3 Jenkinsfile语法
Jenkinsfile是用来编写 Pipeline 的脚本(本人觉得类似于Ansible的Playbook)Jenkinsfile支持两种语法:
Declarative Pipeline(声明式):声明式的 Pipeline 限制用户使用严格的预选定义的结构,是一种声明式的编程模型,对比脚本式的 Pipeline 学习起来更加简单;
Scripted Pipeline(脚本式):脚本式的 Pipeline 限制比较少, 结构和语法的限制由 Groovy 本身决定,是一种命令式的编程模型。
所以我们学习使用声明式的方式编写 jenkinsfile。一般来说 jenkinsfile 会被放在代码库的根目录下。当然也可 以在 Web 页面定义。下面是两种不同方式的 jenkinsfile 示例
Jenkinsfile(声明式)语法:
pipeline{
agent any
stages{
stage("get code"){
steps{
echo "get code from scm"
}
}
stage("package"){
steps{
echo "packge code"
}
}
stage("deploy"){
steps{
echo "deploy packge to node1"
}
}
}
}
pipeline { :开头声明此脚本是 Declarative(声明式)式脚本
agent any :模块一,此处填写构建所需的环境,代理,docker环境,kubernetes环境、 maven、jdk工具等等
stages:模块二,阶段记录所有步骤,代表构建项目的阶段开头
stage:阶段步骤,一个 stages 中包含多个 stage,对应 拉取代码、编译打包、部署发布等等
steps:步骤实现,具体实现该步骤的命令,如何通过编写来实现步骤
Jenkinsfile(脚本式)语法:
node {
def mvnHome
stage('pull code') { //步骤一,拉取代码
echo "pull code"
}
stage('Build project') { //步骤二,构建打包
echo "build project"
}
stage('publish project') { //步骤三,部署上线
echo "publish project"
}
}
node:声明此脚本是Scripted Pipeline
def mvnHome:指定脚本运行所需要的各种环境、工具等
stage:指定不同的构建步骤,如拉取代码,编译打包,部署上线等,可以有多个stage
接下来我们创建一个声明式的pipeline简单熟悉一下具体功能。
4 Pipeline Job 示例
通过Web页面创建一个Pipeline(流水线)项目,点击 新建Item 后如下图:
General(一般)配置项还是勾选 Discard old builds (丢弃旧的构建):
高级项目选项可以执行pipeline的脚本,具体配置如下图:
保存后点击任务的Build Now(立即构建):
构建执行完成后,在页面的右侧以图形的形式显示 pipeline 的结构,点击对应的位 置可以查看构建执行的情况,
小结:通过上述演示可以了解到Pipeline就是将整个项目通过流水线自动化实现。
下边来看一个Pipeline(声明式)实操的例子:
进入pipeline-job任务中,通过设置→流水线进行配置,具体如下图:
① 定义 域中选择 Pipeline script from SCM(此选项指示Jenkins从源代码管理(SCM)仓库获取流水线脚本, 这里的仓库地址应该指向GitLab中你想拉取代码的仓库地址)。
② SCM(源代码管理) 域中选择Git方式拉取脚本。
③ Repository URL(仓库URL) 域中填写GitLab仓库的路径。其他默认即可,点击保存。接下来在 GitLab 的choujiang仓库创建一个 Jenkins脚本文件。
回到GitLab的choujiang仓库点击 加号 选择 新建文件 后具体配置如下图:
粘贴下方的代码到文件中:
提示:注意代码中的仓库地址还有具体发布路径要根据自己环境修改:
pipeline{
agent any
stages{
stage("get code"){
steps{
echo 'get code'
}
}
stage("package"){
steps{
sh 'cd /var/lib/jenkins/workspace/pipeline-job && tar czf /opt/web-$(date +%F).tar.gz .'
}
}
stage("deploy"){
steps{
sh 'scp /opt/web-$(date +%F).tar.gz 192.168.0.12:/usr/local/nginx/html'
sh 'ssh 192.168.0.12 "cd /usr/local/nginx/html/&&tar xf web-$(date +%F).tar.gz"'
}
}
}
}
回到Jenkins进行构建Pipeline,构建结果如下图:
评论区