pipeline

Jenkins2.x入门到精通实战(一) - pipeline介

2021-04-25  本文已影响0人  ElliotG

0. 背景

什么是pipeline?

pipeline称为部署流水线。

Jenkins 1.x只能通过界面来手动描述部署流水线。
Jenkins 2.x开始支持pipeline as code, 可以通过代码来描述部署流水线。

pipeline as code的意义在于:

 

2. Jenkinsfile和pipeline语法

Jenkinsfile是什么?

Jenkinsfile是一个文本文件。
它是部署流水线在Jenkins中的表现形式, 所有部署流水线的逻辑都卸载Jenkinsfile中。
它存在的意义就像dockerfile对于Docker的意义。

Jenkins默认是不支持Jenkinsfile的,我们需要安装pipeline插件

pipeline语法的选择

Groovy脚本语言被作为pipeline的默认语言。

脚本中每个步骤我们称之为stage
一个基本的基于groovy语法的pipeline骨架如下:

pipeline {
    agent any

    stages {
        stage("Build") {
            // 构建
            steps {
                echo("Building Start...")
            }
        }

        stage("Test") {
            // 测试
            steps {
                echo("Testing Start...")
            }
        }

        stage("Deploy") {
            // 部署
            steps {
                echo("Deploy Start...")
            }
        }
    }
}

 

3. 创建第一个pipeline

1. 在首页创建项目时选择pipeline

2. 从版本控制库拉取pipeline
    2-1) 安装git插件
    2-2) 将git私钥放到Jenkins上
         Jenkins->Creentials->System->Global credentials
              选择Kind为"SSH Username with private key"
    2-3) 将Jenkinsfile推送到gitlab
    2-4) Pipeline节点下的Destination选择"Pipeline script from SCM", SCM中选择Git, 
             Credentials中选择刚刚创建好的凭证

3. 用Maven来构建Java Application
    3-1) 安装JDK和Maven
            Manage Jenkins->Global Tool Configuration->JDK
              (可以选择外部的jdk目录, 如果是docker方式安装的jenkins一定要记得挂载外部jdk目录)
            Manage Jenkins->Global Tool Configuration->Maven
              (可以选择外部的maven目录, 如果是docker方式安装的jenkins一定要记得挂载外部maven目录)

maven构建应用示例代码, 如下:

pipeline {
    agent any

    tools {
        maven 'maven '3.6.3''
    }

    stages {
        stage("Build") {
            // Maven构建
            steps {
                script {
                    dir("$SOME_DIR") {
                        sh("mvn clean package -DskipTests=true") 
                        echo("Package xxx done")
                    }
                }
            }
        }
    }
}

 

4. 基本Groovy语法

定义变量时, 我们还是习惯使用def
eg:
def a = 0


print "Hello World"

def testMethod(String arg1, String arg2) {
    return arg1 + "_" + arg2
}

// call the method
testMethod arg2 = "B", arg1 = "A"

// return result
A_B

def printName(String name = "default name") {
    print "name is: ${name}"
}

// call method
printName()

// return result
name is: default name

要注意的是: 双引号支持占位符插值,单引号不支持。

如下代码:

def name = 'world'
print "hello ${name}"   // hello world
print 'hello ${name}'    // hello ${name}

三单引号和三双引号都支持换行
但是只有三双引号支持换行

代码如下:

def name = "Tom"

def tempStr = """
Today is a good day.
${name} plans to go to the park.
He wants to have a good rest.
"""

闭包可以作为参数传递给另一个方法

代码如下:

// 定义闭包
def codeBlock = { print "Hello Closure" }

def stage(String name, closure) {
    println name
    closure()
}

// 调用
stage("stage name", codeBlock)

// return result
stage name
Hello Closure

// Groovy的另一种简洁写法
stage("stage name") {
    print "Hello Closure"
}

 

5. pipeline的组成和指令

pipeline的组成

关键字 含义
pipeline 整条流水线的逻辑
stage 流水线的阶段
steps 每个阶段的具体步骤
agent 指定流水线的执行位置(eg: 物理机/虚拟机/Docker容器)
post pipeline执行失败后通过failure部分发送邮件到指定邮箱

 

6. 如何在pipeline中编写脚本

直接在steps块中编写Groovy代码是不可以的(eg: if-else),会出错。

Jenkins pipeline专门提供了一个script步骤, 可以再script步骤中像写代码一样编写pipeline逻辑。

例子代码如下:

pipeline {
    agent any
    stages {
        stage("Demo") {
            steps {
                script {
                    def browers = ['chrome', 'firefox']
                    for (int i = 0; i < browers.size(); i++) {
                        echo "Using the ${browsers[i]} browser"
                    }
                }
            }
        }
    }
}

pipeline内置基础步骤

dir("/myapp") {
  ...
}

参数列表:
file: 文件路径
text: 写入的内容
encoding(optional): 目标文件的编码(eg: Base64)

参数列表:
file: 文件路径
encoding(option): 读取文件的编码(eg: Base64)

stash(name: "test", includes: "test.txt")
unstash("test")

命令相关步骤

参数名 含义
script 执行的shell脚本
encoding 输出日志的编码
returnStatus 脚本返回的状态码
returnStdout true返回任务的标准输出

其它步骤

error("error occurs")

def t = tool name: 'docker', type: 'org.jenkinssci.plugins.docker.commons.tools.DockerTool'

timeout(10)

// 重复10次
retry(10) {
  ...
}

// 休眠120秒
sleep(120)
// 休眠2分钟
sleep(time: '2', unit: 'MINUTES')
上一篇下一篇

猜你喜欢

热点阅读