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

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

1621920013076

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

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

1621920184096

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

1621920314883

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

1621921194772

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

1621921278970

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语法

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

1621922365986

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语法

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

1621926617119

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

pipeline {
    agent any					

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

3.3.3.整合生成的pipeline测试

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

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

1621924256563

或者将以下代码粘贴到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中

1621926314537

4)构建查看效果

选择更新的分支

1621926356078

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

1621926429431

更新成功

1621926499589

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脚本
        • 1621999769757

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是灰色

猜你喜欢

转载自blog.csdn.net/weixin_44953658/article/details/126517904