文章目录
1.pipeline流水线简介
pipline简单来说,就是运行在Jenkins上的工作流框架,将原来单独运行的单个任务可以关联起来,一起运行,比如有两个任务,A任务是将程序在一个物理机上部署,B程序是将war包通过dockerfile打包在镜像里,通过pipline就可以将两个任务关联起来,首先执行A任务在物理机上部署,A任务成功后,调用B任务将war包做成docker镜像,如果没有pipline则需要点两次任务,有了pipline就可以实现一次构建,多个任务串行。
使用pipline的好处:
- 代码:Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流程。
- 持久:无论是计划内的还是计划外的服务器重启,Pipeline都是可恢复的。
- 可停止:Pipeline可接收交互式输入,比如更新时要求运维点下确认,以确定是否继续执行Pipeline。
- 多功能:Pipeline支持现实世界中复杂的持续交付要求。它支持fork/join、循环执行,并行执行任务的功能。
- 可扩展:Pipeline插件支持其DSL的自定义扩展 ,以及与其他插件集成的多个选项。
如何创建pipline:
- Pipeline 脚本是由 Groovy 语言实现的,但是我们没必要单独去学习 Groovy
- Pipeline 支持两种语法:Declarative(声明式)和 Scripted Pipeline(脚本式)语法
- Pipeline 也有两种创建方法:可以直接在 Jenkins 的 Web UI 界面中输入脚本;也可以通过创建一个 Jenkinsfifile 脚本文件放入项目源码库中(一般我们都推荐在 Jenkins 中直接从源代码控制(SCM) 中直接载入 Jenkinsfifile Pipeline 这种方法)。
2.创建一个流水线任务生成流水线语法
1)新建任务—>类型选择流水线—>起一个名称
2)进入任务后—>找到流水线
下拉列表选择Hello World即可生成一个Declarative类型的pipeline语法
下拉选择Scripted Pipeline即可生成一段Scripted类型的pipeline语法
3.基础pipeline语法解释
[官网地址]( Pipeline Syntax (jenkins.io) )
以pipeline开头的表示是一个Declarative声明类型的pipeline语法
pipeline:表明此pipeline是一个Declarative类型的语法
agent:用于指定此pipeline任务在哪个agent上运行
stages:声明整个流水线的所有执行阶段,一般一个pipeline中只有一个stages,在stages声明多个stage
stage:代表流水线中的某个阶段,一般分为拉取代码、编译代码、部署等三个阶段
steps:代表一个阶段内需要执行的逻辑或命令,steps里面可以是shell脚本、git代码、ssh远程等任意内容
3.1.Declarative声明类型的pipeline语法
pipeline {
agent any #在任意Jenkins节点运行此任务
stages { #声明整个流水线的执行阶段
stage('拉取代码') { #第一个阶段:拉取代码
steps { #第一个阶段需要执行的逻辑或命令
echo 'pull code' #执行对应的命令
}
}
stage('编译代码') { #第二个阶段:编译代码
steps { #第二个阶段需要执行的逻辑或命令
echo 'make install code' #执行对应的命令
}
}
stage('部署代码') { #第三个阶段:部署代码
steps { #第三个阶段需要执行的逻辑或命令
echo 'deploy code' #执行对应的命令
}
}
}
}
将pipeline脚本内容粘贴在Jenkins上构建一次观察效果
pipeline有自己特殊的阶段视图,可以观察每一个阶段所执行的操作
3.2.Scripted类型的pipeline语法
Node:一个 Node 就是一个 Jenkins 节点,Master 或者 Agent,是执行 Step 的具体运行 环境
Stage:一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,比如:Build、Test、Deploy,Stage 是一个逻辑分组的概念。
Step:步骤,Step 是最基本的操作单元,可以是打印一句话,也可以是构建一个 Docker 镜像,由各类 Jenkins 插件提供,比如命令:sh ‘make’,就相当于我们平时 shell 终端中执行 make 命令一样。
node {
def mvnHome
stage('拉取代码') {
echo '拉取代码'
}
stage('编译构建') {
echo '编译构建'
}
stage('项目部署') {
echo '项目部署'
}
}
3.3.生成pipeline语法
点击流水线语法调整至流水线语法页面
3.3.1.生成从gitlab拉取代码的pipeline语法
实例步骤选择:checkout
scm:选择Git
Repository URL:填写项目所在的gitlab地址
Credentials:选择gitlab凭证
指定分支(为空时代表any) :$VERSION 这个变量由参数化构建时设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bMD1kodW-1661391057277)(https://gitcode.net/weixin_44953658/typorajiangxl-image/-/raw/master/DevOps-Image/生成git拉代码的pipeline语法.jpg)]
复制生成的代码到pipeline中
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '$VERSION']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab-root', url: 'http://192.168.16.106:30080/root/blog_project.git']]])
}
}
}
}
3.3.2.生成交互式输入的pipeline语法
交互式常用于更新线上环境,提示一些信息,让运维再次确认信息
复制语法到pipeline时,如果想分行显示,就要把input后面的单引号和最后一个单引号删除,否则会报错
pipeline {
agent any
stages {
stage('运维确认') {
steps {
input message: """
jobname: ${jobname}
branch: ${VERSION}""", ok: "更新"
}
}
}
}
3.3.3.整合生成的pipeline测试
1)编辑pipeline任务增加参数化构建
增加一个选分支的参数化构建过程
或者将以下代码粘贴到pipeline中,保存后在进入任务也可以看到如上图所示,自动添加
parameters {
gitParameter name: 'VERSION',defaultValue: 'master',type: 'BRANCH',description: '选择要更新的分支'
}
2)整合pipeline脚本
pipeline {
agent any
parameters { //参数化构建
gitParameter name: 'VERSION',defaultValue: 'master',type: 'BRANCH',description: '选择分支'
}
stages {
stage('运维确认') { //运维确认,打印更新信息
steps {
input message: """
JOB_NAME: ${JOB_NAME}
branch: ${VERSION}""", ok: "更新"
}
}
stage('拉取代码') { //拉取项目代码
steps {
checkout([$class: 'GitSCM', branches: [[name: '$VERSION']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab-root', url: 'http://192.168.16.106:30080/root/blog_project.git']]])
}
}
}
}
3)将pipeline语法粘贴到Jenkins中
4)构建查看效果
选择更新的分支
运维确认信息后方可更新,否则一直处于等待运维确认的状态
更新成功
4.进阶pipeline语法解释
4.1.agent语法
agent:指明使用哪个agent节点来执行任务,定义于pipeline最开始的位置或者时stage内部,定义在stage内部就说明这个阶段的任务要在指定的agent节点来运行
脚本实例
pipeline {
agent any
environment {
PROJECT = 'know-system'
}
}
脚本参数解释
agent命令有很多参数
any:随机使用任意可用的agent来执行任务
label:使用标签方式,让任务运行在指定标签的Jenkins节点上,示例:agent {label ‘jenkins-slave1-107’}
none:不会为整个Pipeline运行分配全局agent ,因此需要每个stage部分指定其自己使用的agent
docker:指定某个容器去执行任务
agent { docker { image 'maven:3-alpine' label 'my-defined-label' args '-v /tmp:/tmp' } }
environment:指定一个键值对,这个键值对会被pipeline当成一个环境变量,可以在stage中引用
4.2.parameters参数
parameters参数用于声明参数化构建流程
脚本示例
pipeline {
agent any
parameters {
choice(name: 'target',choices: ['线上环境','测试环境'],description: '目标更新环境')
string(name: 'project',defaultValue: 'know-system',description: '项目名称',trim: true)
gitParameter(name: 'VERSION',defaultValue: 'master',type: 'BRANCH',description: '选择要更新的分支')
}
}
脚本参数解释
parameters:声明参数化构建流程
- choice:选项参数
- name:指定名称,这个名称就相当于次参数流程的变量名称
- choices:可选参数,形成一个下拉列表
- description:描述信息
- string:字符串参数
- name: 指定名称,相当于变量名
- defaultValue:默认值
- description:描述信息
- trim: 清除空白字符
- gitParameter:选择git分支
- name:指定名称,相当于变量名
- defaultValue:默认值
- type:git拉取代码的类型,一般都是分支
- description:米哦按花素信息
4.3.stages语法
stages:指定每个阶段要进行逻辑或命令,每个stages下有多个stage
脚本示例
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
脚本参数解释
stages:声明每个阶段要执行的逻辑或命令,一般一个pipeline只有一个stages
- stage:声明当前节点要做什么,
- steps:定义要执行的动作,可以是shell脚本、拉取代码等等一系列操作
- sh:执行脚本
- checkout:拉取git代码,如果执行的参数是
checkout scm
则表示克隆scm脚本所在git项目,即Jenkinsfile所在的git项目checkout scm
只能用于Pipeline script from SCM,也就是将pipeline脚本放在git项目中,即Jenkinsfile,使用checkout scm
就会克隆Jenkinsfile所在的git项目,然后拉取到Jenkins上。- 直接在Jenkins ui中使用
checkout scm
会报错:提示checkout scm
只能应用于scm类型的pipeline脚本
4.4.post语法
post:用于任务构建成功后执行相应的动作
脚本实例:
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
post {
success { //构建成功了发送一个构成成功的消息到钉钉
sh """
echo "构建成功,发送消息到钉钉"
"""
}
failure { //构建失败了发送一个构成成功的消息到钉钉
sh """
echo "构建失败,发送消息到钉钉"
"""
}
always { //无论成功还是失败都执行此步骤
echo "构建流程结束"
}
}
}
脚本参数解释
post:用于任务构建成功后执行相应的动作
- always:无论任务构建成功还是失败,post都会执行此步骤
- success:当前流水线任务或阶段的完成状态为success,才允许在post部分执行该步骤,通常web ui是蓝色或绿色
- failure:当前流水线任务或阶段的完成状态为failure,才允许在post部分执行该步骤,通常web ui是红色
- changed:当前流水线或阶段的完成状态与它之前的运行不同时,才允许在 post 部分运行该步骤
- unstable:当前流水线或阶段的完成状态为unstable,才允许在 post 部分运行该步骤, 通常由于测试失败,代码违规等造成。通常web UI是黄色
- aborted, 只有当前流水线或阶段的完成状态为"aborted",才允许在 post 部分运行该步骤, 通常由于流水线被运维手动的aborted。比如流水线有input交互,运维发现更新的参数设置错了,点击了aborted,则当前流水线的状态就是aborted,通常web UI是灰色