目录
pipeline学习脑图
一、pipeline基本介绍
1、pipeline是什么
jenkins2.x开始流行pipeline(groovy语言编写)的写法,目的是通过以代码的方式来进行job的构建,减少人工操作导致的人为出错。它是用于描述整条流水线是如何进行,流水线的内容一般包括执行编译、打包、测试、部署及告警通知等步骤。
2、语法类型
pipeline有两种语法类型,分别是声明式pipeline和脚本式
2.1 声明式pipeline
pipeline {
agent { docker 'maven:3.3.3' }
stages {
stage('build') {
steps {
sh 'mvn --version'
}
}
}
}
字段说明
agent : any任意可用的执行器,none:每个stage需指定相应的agent,、node(指定节点)、docker(指定容器)
stages:整个流水线的所有执行阶段,里面包含多个stage
stage:流水线中的某个阶段,如拉取代码,编译构建,部署等阶段
steps:代表阶段内需要执行的命令,如shell命令等
2.2 脚本式
node('docker') {
checkout scm
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
字段说明
node:执行器节点,和agent类似
Stage:代表流水线中的某个阶段,如拉取代码,编译构建,部署等阶段
2.3 区别
声明式 | 脚本式 | |
pipeline代码校验 | 会校验pipeline流水线语法是否正确 | 不校验 |
重启stage | pipeline某个stage执行失败后可通过修复错误后直接回到此stage步骤开始执行 | 不可以 |
option指令 | 可以和pipeline代码逻辑分开 | 和pipeline代码逻辑嵌套,可读性差 |
语法逻辑 | 在 script{} 标记里面 | 不限制 |
总结 | 官方推荐,语法简单,严谨 | 灵活,逻辑复杂 |
二、语法说明
以声明式为例,完整pipeline流水线,由以下5部分组成,缺一不可,否则jenkins会报错
- pipeline: 代表整条流水线,包含整条流水线的逻辑。
- agent
- stages
- stage
- steps
除以上5个必要组成部分,还可以自定义选择以下选项
- 字符串变量: def xxx=xxx,可在Pipeline中引用,$xxx
- environment:配置环境变量,可用于step中,参考 localhost:8080 / pipeline-syntax / globals
- options:允许执行pipeline内置的专用选项,也可以使用由插件提供的,如timeout,retry,timestamps等
# 设置Pipeline运行的超时时间,之后Jenkins应该中止Pipeline。例如:
options { timeout(time: 1, unit: 'HOURS') }
# 失败后,重试整个Pipeline指定的次数。例如:
options { retry(3) }
# 预处理由Pipeline生成的所有控制台输出运行时间与发射线的时间。例如:
options { timestamps() }
- parameters:参数列表,如字符参数、布尔参数等
# 字符参数
parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }
- trigger:定义了触发pipeline的方式(jenkins1.x中的pollscm定时构建)
- tools:支持maven、jdk、gradle,需在jenkins全局配置中已经定义好
- when:代码逻辑
- script:流控制,如if/else
stage('Example') { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } }
- post:有always,unstable,success,failure,和 changed等多种情况,常用于构建完成或失败时的通知告警(如email/wx/dingding等)
post {
always{
script{
sh """
echo "This is test."
"""
}
}
success {
}
failure {
}
}
内置工具
部分脚本语法可以使用jenkins中的Pipeline Syntax来生成:localhost:80/pipeline-syntax/
如拉取代码操作,通过代码生成器,可以快速生成需要的pipeline代码段
如生成git拉取代码
git credentialsId: 'xxx', url: '192.168.1.1/test.git'
三、pipeline实际应用
正常来说,一个CI流水线基本包含代码拉取、编译构建、代码测试及部署,以及部署成功/失败后的通知推送,用pipeline实现这一个流程:从代码库中拉取最新的代码,如果构建成功/失败,发送钉钉到指定群上。具体的配置如下:
def code_url = 'http://192.168.1.1/test.git'
def project = 'test'
def serverName = 'betatest'
def branch = 'beta'
def devDockerDaemon = "tcp://192.168.1.3:2375"
def dockerParam = "--name ${serverName} -p 80:80 --restart=always"
def registryUrl = 'hub.docker.com'
def newImage = "${registryUrl}/${project}/${serverName}:$BUILD_NUMBER"
def credentialsId = 'jenkins'
pipeline {
agent any
stages {
stage('代码更新') {
steps {
git branch: "$branch", credentialsId: "$credentialsId", url: "$code_url"
}
}
stage('代码编译') {
steps {
sh """
/usr/local/maven3.5/bin/mvn clean compile
/usr/local/maven3.5/bin/mvn package
"""
}
}
stage('创建镜像') {
steps {
sh """
docker build -t $newImage -f Dockerfile-beta .
"""
}
}
stage('推送镜像') {
steps {
sh """
docker push $newImage
docker rmi $newImage
"""
}
}
stage('部署服务') {
steps {
sh """
docker -H ${devDockerDaemon} pull ${newImage}
docker -H ${devDockerDaemon} stop ${serverName} | true
docker -H ${devDockerDaemon} rm -f ${serverName} | true
docker -H ${devDockerDaemon} run -d ${dockerParam} ${newImage}
"""
}
}
}
post {
success {
dingtalk (
robot: jenkins-dingding,
type: MARKDOWN,
title: ${project}更新成功,
text: [
### ${JOB_NAME}发布更新 ,
---,
1. 服务名:${project},
2. 分支:${branch} ,
3. 更新结果:成功 ,
4. [详情查看](${BUILD_URL}changes),
],
at: [
111111111, //要@的人的手机
]
)
}
failure {
dingtalk (
robot: jenkins-dingding,
type: MARKDOWN,
title: ${project}更新失败,
text: [
### ${JOB_NAME}发布更新 ,
---,
1. 服务名:${project},
2. 分支:${branch} ,
3. 更新结果:失败 ,
4. [详情查看](${BUILD_URL}console),
],
at: [
111111111, //要@的人的手机
],
atAll: false,
)
}
}
}
}
该流水线分为三部分,第一部分是全局变量,通过dev 变量名,定义代码仓库地址、分支、镜像仓库、部署命令等;第二部分是流水线的执行部分(各stage),分别是拉取代码、编译、创建镜像、推送镜像及部署;第三部分是告警通知部分,可以通过微信、钉钉及邮件的方式,以上三部分组成了一个完整的CI流程(测试部分根据实际情况自行添加,这里就不作展现)。
需要的同学,可以参考这个实例进行修改,也可自己编写。
觉得有用就收藏吧~