目录
pipeline学习脑图
一、pipeline基本介绍
1、pipeline是什么
2、语法类型
二、语法说明
三、pipeline实际应用
jenkins2.x开始流行pipeline(groovy语言编写)的写法,目的是通过以代码的方式来进行job的构建,减少人工操作导致的人为出错。它是用于描述整条流水线是如何进行,流水线的内容一般包括执行编译、打包、测试、部署及告警通知等步骤。
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会报错
除以上5个必要组成部分,还可以自定义选择以下选项
# 设置Pipeline运行的超时时间,之后Jenkins应该中止Pipeline。例如:
options { timeout(time: 1, unit: 'HOURS') }
# 失败后,重试整个Pipeline指定的次数。例如:
options { retry(3) }
# 预处理由Pipeline生成的所有控制台输出运行时间与发射线的时间。例如:
options { timestamps() }
# 字符参数
parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }
stage('Example') { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } }
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'
正常来说,一个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流程(测试部分根据实际情况自行添加,这里就不作展现)。
需要的同学,可以参考这个实例进行修改,也可自己编写。
觉得有用就收藏吧~