Jenkins入门之Pipeline语法(1)

1.什么是pipeline

从某种抽象层次上讲,部署流水线(Deployment pipeline)是指从软件版本控制库到用户手中这一过程的自动化表现形式。——《持续交付——发布可靠软件的系统方法》
按《持续交付》中的定义,Jenkins本来就支持pipeline(通常会把部署流水线简称为pipeline,本书会交替使用这两个术语),只是一开始不叫pipeline,而叫任务。
所有的pipeline都会在Jenkins上产生一个Jenkinsfile文件. Jenkins默认是不支持Jenkinsfile的。我们需要安装pipeline插件

2.pipeline语法

2.1 脚本式语法

脚本式语法更像是Groovy代码,有着巨大的灵活性,但是鉴于使用此种语法还需要去了解Groovy代码,这里就先不去做研究

node {
	stage('Build') {
		// 执行构建
	}
	stage('Test') {
		// 执行测试
	}
	stage('Deploy') {
		try{
			// 执行构建
		}catch(err){
			currentBuild.result = "FAILURE"
			mail body: "project build error is here:$(env.BUILD_URL)" ,
			from: 'xxx@yyy.com',
			replyTo: 'yyy@yyyy.com',
			subject: 'project build failed',
			to: 'zzz@yyy.com'
			throw err
		}
		
	}
}

2.2 声明式语法

在Jenkins社区推介的pipeline语法中,声明式语法更加得到青睐,因为它更加简单,更结构化.

pipline {
  agent any

  stages {
      stage('Build') {
          steps {
              echo 'Building..'
          }
      }
      stage('Test') {
          steps {
              echo 'Testing..'
          }
      }
      stage('Deploy') {
          steps {
              echo 'Deploying..'
          }
      }
  }
  post {
      failure {
          mail to: 'team@example.com', subject: 'The Pipline failed :('
      }
  }
}

2.3 在Jenkins上新建一个流水线任务,并在pipeline写上测试代码

pipeline {
    agent any
    
    stages {
        stage('Build') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

3. pipeline语法说明

3.1 必要的Groovy知识

  • 虽然Groovy同时支持静态类型和动态类型,但是在定义变量时,在Groovy中我们习惯使用def关键字,比如def x="abc"、def y=1。
  • 不像Java,Groovy语句最后的分号不是必需的。
  • Groovy中的方法调用可以省略括号,比如System.out.println "Hello world"。
  • 支持命名参数,例如:
    //定义一个函数名字为createName,并向它传递两个字符参数,函数会返回相应的字符.
    def createName(String giveName, String familyName){
    	return givenName + " " + familyName
    }
    //调用时可以这样
    createName familyName = "Lee", giveName = "Bruce"
    
  • 支持默认参数值,例如:
    def sayHello(String name = "humans"){
    	print "hello ${name}"
    }
    sayHello() //此时括号不能省略
    
  • 支持单引号、双引号。双引号支持插值,单引号不支持。比如
    def name = 'word'
    print "hello ${name}" // 结果: hello world
    print 'hello ${name}' // 结果: hello ${name}
    
  • 支持三单引号和三双引号,都可以进行换行,但只有三双引号支持插值

3.2 pipeline的组成

Jenkins pipeline其实就是基于Groovy语言实现的一种DSL(领域特定语言),用于描述整条流水线是如何进行的。流水线的内容包括执行编译、打包、测试、输出测试报告等步骤。

3.2.1 pipeline最简单结构

pipeline {
   agent any
   
   stages {
       stage('Build') {
           steps {
               echo 'Hello World'
           }
       }
   }
}

  • pipeline: 代表整条流水线,所有的步骤和逻辑都包含在这里面.
  • stages: 整个流水线所有的步骤都包含在这个里面
  • stage: 阶段. 一整个流水线中的其中一个步骤
  • steps: 流水线中的一个或者多个stage中的某个详细步骤
  • agent: 指定该条流水线从哪里开始执行(物理机, 虚拟机, 容器)

3.2.2 步骤

pipeline中的每一个步骤组成了一个具体的流水线, pipeline中的有些步骤集成在了插件中,只要安装了相应的插件就可以使用了.
参考地址: https://github.com/jenkinsci/pipeline-plugin/blob/master/COMPATIBILITY.md

3.3 post部分

post是整个pipeline步骤完成之后的内容,相当于是一个反馈部分
根据pipeline或阶段的完成状态,post部分分成多种条件块,包括:

• always:不论当前完成状态是什么,都执行。
• changed:只要当前完成状态与上一次完成状态不同就执行。
• fixed:上一次完成状态为失败或不稳定(unstable),当前完成状态为成功时执行。
• regression:上一次完成状态为成功,当前完成状态为失败、不稳定或中止(aborted)时执行。
• aborted:当前执行结果是中止状态时(一般为人为中止)执行。
• failure:当前完成状态为失败时执行。
• success:当前完成状态为成功时执行。
• unstable:当前完成状态为不稳定时执行。
• cleanup:清理条件块。不论当前完成状态是什么,在其他所有条件块执行完成后都执行。post部分可以同时包含多种条件块。

3.4 pipeline的指令

指令是pipeline基础结构中的补充:

# 在使用指令时,需要注意的是每个指令都有自己的“作用域”。如果指令使用的位置不正确,Jenkins将会报错
• environment:用于设置环境变量,可定义在stage或pipeline部分。
• tools:可定义在pipeline或stage部分。它会自动下载并安装我们指定的工具,并将其加入PATH变量中。
• input:定义在stage部分,会暂停pipeline,提示你输入内容。
• options:用于配置Jenkins pipeline本身的选项,比如options {retry(3)}指当pipeline失败时再重试2次。options指令可定义在stage或pipeline部分。
• parallel:并行执行多个step。在pipeline插件1.2版本后,parallel开始支持对多个阶段进行并行执行。
• parameters:与input不同,parameters是执行pipeline前传入的一些参数。
• triggers:用于定义执行pipeline的触发器。
• when:当满足when定义的条件时,阶段才执行。
posted @ 2021-12-01 09:49  少林寺驻峨眉山大神父  阅读(451)  评论(0编辑  收藏  举报