> 文档中心 > DevOps篇:Jenkins Pipeline流水线语法基础与进阶

DevOps篇:Jenkins Pipeline流水线语法基础与进阶

文章目录

    • 1.pipeline流水线简介
    • 2.创建一个流水线任务生成流水线语法
    • 3.基础pipeline语法解释
      • 3.1.Declarative声明类型的pipeline语法
      • 3.2.Scripted类型的pipeline语法
      • 3.3.生成pipeline语法
        • 3.3.1.生成从gitlab拉取代码的pipeline语法
        • 3.3.2.生成交互式输入的pipeline语法
        • 3.3.3.整合生成的pipeline测试
    • 4.进阶pipeline语法解释
      • 4.1.agent语法
      • 4.2.parameters参数
      • 4.3.stages语法
      • 4.4.post语法

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)新建任务—>类型选择流水线—>起一个名称

DevOps篇:Jenkins Pipeline流水线语法基础与进阶

2)进入任务后—>找到流水线

下拉列表选择Hello World即可生成一个Declarative类型的pipeline语法

DevOps篇:Jenkins Pipeline流水线语法基础与进阶

下拉选择Scripted Pipeline即可生成一段Scripted类型的pipeline语法

DevOps篇:Jenkins 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上构建一次观察效果

DevOps篇:Jenkins Pipeline流水线语法基础与进阶

pipeline有自己特殊的阶段视图,可以观察每一个阶段所执行的操作

DevOps篇: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语法

点击流水线语法调整至流水线语法页面

DevOps篇:Jenkins 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语法

交互式常用于更新线上环境,提示一些信息,让运维再次确认信息

DevOps篇:Jenkins Pipeline流水线语法基础与进阶

复制语法到pipeline时,如果想分行显示,就要把input后面的单引号和最后一个单引号删除,否则会报错

pipeline {    agent any    stages {  stage('运维确认') {      steps {  input message: """   jobname: ${jobname}  branch: ${VERSION}""", ok: "更新"     } }      }}

3.3.3.整合生成的pipeline测试

1)编辑pipeline任务增加参数化构建

增加一个选分支的参数化构建过程

DevOps篇:Jenkins 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中

DevOps篇:Jenkins Pipeline流水线语法基础与进阶

4)构建查看效果

选择更新的分支

DevOps篇:Jenkins Pipeline流水线语法基础与进阶

运维确认信息后方可更新,否则一直处于等待运维确认的状态

DevOps篇:Jenkins Pipeline流水线语法基础与进阶

更新成功

DevOps篇:Jenkins Pipeline流水线语法基础与进阶

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脚本
        • DevOps篇:Jenkins 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是灰色