持续交付-Jenkinsfile 语法

简介: 持续交付-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 {} 中。

1080×443 111 KB

流程控制语句

如同传统的脚本语言一样,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 的好处就是灵活,好封装,易于大规模使用,但需要有一定的编程功底。

相关文章
|
SQL 分布式计算 Hadoop
Azkaban【基础 01】核心概念+特点+Web界面+架构+Job类型(一篇即可入门Azkaban工作流调度系统)
【2月更文挑战第6天】Azkaban【基础 01】核心概念+特点+Web界面+架构+Job类型(一篇即可入门Azkaban工作流调度系统)
1031 0
|
Kubernetes 搜索推荐 应用服务中间件
【kubernetes】新版helm3的三大概念+快速指南+自定义charts模板
chart:代表helm包,包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。 Repository(仓库):用来存放和共享 charts 的地方。 Release :运行在 Kubernetes 集群中的 chart 的实例,一个 chart 通常可以在同一个集群中安装多次,每一次安装都会创建一个新的 release。
696 1
【kubernetes】新版helm3的三大概念+快速指南+自定义charts模板
|
移动开发 前端开发 小程序
7 款最棒的 React 移动端 UI 组件库 - 特别针对国内使用场景推荐
优秀的 React UI 移动端组件库和模版框架,帮我们节省开发时间,提高开发效率,统一设计语言。更棒的是内置的功能复杂,我们自己很难处理的常用组件,比如表格、表单、富文本编辑器、时间日期选择器、实时拖拽组件等,再进一步,还有帮我们把组件的轮子装好的 React admin 后台管理系统。本文推荐 7 款适用于中文使用者习惯的开源 React 移动端 UI 库,特别针对国内使用场景推荐。
5455 0
宜搭子表单内数据提交时如何与历史数据进行去重效验?
宜搭子表单内数据提交时如何与历史数据进行去重效验?不是仅仅在当前提交页面内的子表单数据进行重复效验。
宜搭子表单内数据提交时如何与历史数据进行去重效验?
|
Kubernetes 安全 数据安全/隐私保护
利用服务网格实现全链路mTLS(二):通过出口网关访问外部mTLS服务
阿里云服务网格(Service Mesh,简称ASM)提供了一个全托管式的服务网格平台,兼容Istio开源服务网格,简化服务治理,包括流量管理、服务间通信安全及网格可观测性。ASM出口网关统一管理网格内的出口流量,实现全链路加密通信与精细访问控制。本文介绍如何配置ASM出口网关以管理出口流量并发起mTLS通信,涉及配置ServiceEntry、创建出口网关、设置虚拟服务及目标规则等步骤,最终实现安全可控的mTLS服务访问。
305 3
|
运维 监控 容器
一行超长日志引发的 “血案” - Containerd 频繁 OOM 背后的真相
在Sealos公有云中,6月10日北京和广州可用区服务器遭遇突发问题,内存使用率飙升导致服务中断。疑似内存泄露,但升级服务器配置后问题仍重现。排查发现Containerd进程内存占用异常,升级Containerd至1.7.18未解决问题。通过pprof分析和日志检查,发现因`max_container_log_line_size`配置为-1,导致超长日志一次性加载内存。修复该参数为16384后,问题解决。事件强调了默认配置合理性、日志管理、监控和源码理解的重要性。
624 1
一行超长日志引发的 “血案” - Containerd 频繁 OOM 背后的真相
|
数据可视化 搜索推荐 Devops
从DevOps实践者的角度谈谈云效Flow
一名DevOps实践者参与了云效流水线Flow的评测,认为Flow对新手友好,具有可视化编排功能。但在上手过程中,了解相关术语和流畅编排设计可能构成一些挑战。Flow的功能基本满足需求,但开放性有待提高,建议开放插件开发以丰富生态。YAML编排作为趋势,Flow在易用性和功能完善上仍有进步空间,如语法检查、智能提示等功能。此外,产品模块间的逻辑性和交互清晰度也需改进。总结来说,Flow功能齐全,适合中小企业,但在用户体验和生态建设上有改进余地。
541 3
|
缓存 Linux Docker
docker 跨平台构建镜像
docker 跨平台构建镜像
323 0
|
弹性计算 网络协议 Linux
自动优化 Linux 内核参数
【4月更文挑战第28天】
206 0
|
JSON 数据格式
【❤强哥推荐❣】VSCode常用快捷键配置文件表、代码片段,记得收藏
【❤强哥推荐❣】VSCode常用快捷键配置文件表、代码片段,记得收藏
【❤强哥推荐❣】VSCode常用快捷键配置文件表、代码片段,记得收藏