乐趣区

关于软件测试:持续交付Jenkinsfile-语法

实现 Pipeline 性能的脚本语言叫做 Jenkinsfile,由 Groovy 语言实现。Jenkinsfile 个别是放在我的项目根目录,随我的项目一起受源代码管理软件管制,无需像创立 ” 自在格调 \” 我的项目一样,每次可能须要拷贝很多设置到新我的项目,提供了一些间接的益处:

  • Pipeline 上的代码审查 / 迭代
  • Pipeline 的审计跟踪
  • Pipeline 的惟一实在起源,能够由我的项目的多个成员查看和编辑
    Pipeline 反对:Declarative(在 Pipeline 2.5 中引入)和 Scripted Pipeline 两种格局。两者都反对建设 Pipeline,两者都能够用于在 Web UI 中定义一个流水线 Jenkinsfile,将 Jenkinsfile 文件创建并查看到源代码管制库中通常被认为是最佳做法。

Declared Pipeline

Declared Pipeline 树

Declared Pipeline 必须蕴含在固定格局 Pipeline {} 块内,每个申明语句必须独立一行,行尾无需应用分号。块(blocks{})只能蕴含章节(Sections),指令(Directives),步骤(Steps)或赋值语句。

块 blocks{}

由大括号括起来的语句,如 Pipeline{},Section{},parameters{},script{}

章节(Sections)

章节中通常蕴含一个或多个指令或步骤。如 agent、post、stages、steps

指令(Directives)

environment、options、parameters、triggers(触发)、stage、tools、when

节点(agent)

必须存在,agent 必须在 Pipeline 块内的顶层定义,但 stage 内是否应用是可选的
参数:any/none/label/node/docker/dockerfile
罕用选项 label/cuetomWorkspace/reuseNode
示例:

agent {label 'my-label'}

agent {
    node {
        label 'my-label'
        customWorkspace '/some/other/path'
    }
}

agent {
    docker {
        image 'nginx:1.12.2'
        label 'my-label'
        args '-v /tmp:/tmp'
    }
}

构建后(post)

不是必须,用于 Pipeline 的最外层或者 stage{} 中,次要用于表白 Jenkins 实现构建动作之后须要做的事件。

示例:

pipeline {
    agent any
    stages {stage('Example'){
            steps {echo 'Hello world'}
        }
    }
    post {
        always {echo 'say goodbay'}
    }
}

阶段集(stages)

必须存在,包含程序执行的一个或多个 stage 命令,在 Pipeline 内仅能应用一次,通常位于 agent/options 前面。

步骤(steps)

必须存在,steps 位于 stage 指令块外部,包含一个或多个 step。仅有一个 step 的状况下能够疏忽关键字 step 及其{}。

环境(environment)

不是必须,environment 定义了一组全局的环境变量键值对,存在于 pipeline {} 或者 stage 指令内。执行非凡办法 credentials()能够获取 Jenkins 中预约义的凭证明文内容。

示例:

environment {CC='clang'}
environment {AN_ACCESS_KEY = credentials('my-prefined-secret-text')}
steps {sh 'printenv'}

选项(options)

不是必须,预约义 Pipeline 专有的配置信息,仅可定义一次

示例:

pipeline {
    agent any
    options{timeout(time:1,unit: 'HOURS')
    }
}

参数(parameters)

不是必须,定义参数化构建的参数可选参数,参数类型 booleanParam,choice,file,text,password,run,string
示例:

parameters {string(name: 'PERSON', defaultValue: 'Jenkins', description: '输出的文本参数')
        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
}

触发器(rtiggers)

不是必须,定义 Pipeline 被主动触发的形式选项 cron、pollSCM、upstream

示例:

triggers {cron('0 8 * * 1-5')
}

Script Pipeline

Script Pipeline 语句树

一个 Script Pipeline 能够划分成若干个 Stage,每个 Stage 代表一组操作,例如 Build,Test;Node 代表 Jenkins 节点,比方 Master, Slave 这样的节点;Step 是最根本的操作单元,在对应 Node 节点上执行的动作语句间接写在 node {} 中。

流程管制语句

如同传统的脚本语言一样,Script Pipeline 是从上至下程序执行,能够应用 Groovy 表达式进行流程管制,如 if/else 语句通过逻辑条件判断来对流程进行管制:

node {stage('Example') {if (env.BRANCH_NAME == 'master') {echo 'I only execute on the master branch'} else {echo 'I execute elsewhere'}
    }
}

异样解决语句

Script Pipeline 脚本流程管制的另一种形式是异样解决机制。当任何一个步骤因各种起因而出现异常时,都必须在代码中应用 try/catch/finally 语句块进行异样捕捉,并通过事后设定代码进行解决,保障脚本可能顺利执行:

stage('Error Handling') {
    node{
        echo "This is test demo for the error handling"

        try {

            echo "This is in the try block."

            sh 'exit 1'

        }catch (exc) {echo "Something failed, I'm in the catch block."}finally {echo "Finally, I'm in the finally block."}
    }
}

Jenkinsfile 中调用 plugin 性能

在 Jenkinsfile 中除了能够应用惯例的逻辑、流程管制,还能够调用 Jenkins 的插件性能。上面用如下实例进行阐明。

Email Extension 插件

Email Extension 是 Jenkins 中的一个内部插件,用来发送邮件,从 Jenkins 的 Plugin Manager 中进行装置。在 Pipeline 中通过代码调用能够触发该插件的运行,实现发送邮件的性能。

根底配置

在装置好 Email Extension 插件之后,首先须要抉择一个筹备用来发送 Jenkins 告诉邮件的邮箱,发件邮箱的具体参数要提前通晓(通常参数能够从邮箱的配置参数信息页面上查到);之后要在 Manage Jenkins -> Configure System 中将对应参数填写该插件的对应配置项中,必须配置的参数如下:

  • SMTP server:smtp 服务地址
  • SMTP port:smtp 端口号
  • Use SMTP Authentication:启用 smtp 平安校验
  • User Name:发件人用户名
  • Password:发件人明码
  • Default Recipients:默认收件人
    其余的参数能够依据本人的须要进行配置,Email Extension 配置参考截图如下:

Pipeline 代码

pipeline{
    agent {label 'master'}
    stages{stage('发送邮件测试') {
            steps{echo 'Test Email'}
        }
    }
    post {
        always {emailext body: '$DEFAULT_CONTENT', recipientProviders: [[$class: 'RequesterRecipientProvider']], subject: '$DEFAULT_SUBJECT'
        }
    }
}

Declared Pipeline 的入门学习难度绝对不高,这种相似咱们在做自动化测试时所接触的关键字驱动模式,只有了解其定义好的关键词,按要求填充数据即可。
尽管这种形式入门容易,但灵活性欠缺。相比之下 script Pipeline 的益处就是灵便,好封装,易于大规模应用,但须要有肯定的编程功底。

退出移动版