Jenkins Pipeline 持续集成

Pipeline Script 执行流程

在使用Pipeline之前请确保Jenkins是2.x版本以上,并且安装了Pipeline插件。

Jenkins提供了pipeline对象,作为配置的入口。它接受一个闭包,在闭包内定义配置:

pipeline {
// do some thing
}

闭包内的方法层级结构(由DSL定义):

  • stages

    • stage

      • steps

        • step

一个例子:

pipeline {
agent any
stages {
stage('1. 初始化') {
steps {
script {
println("Hello")
}
}
}
}
}

我们创建了一个Jenkins Pipeline Build,在脚本里面写上:

println(pipeline)

构建之后日志打印:

org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter@403c4fdc

实际上pipelineModelInterpreter一个实例,相当于可以给一个对象传递闭包!通过搜索找到该类所在的项目 pipeline-model-definition-plugin ,克隆下来,找到类ModelInterpreter 简略如下:

class ModelInterpreter implements Serializable {
private CpsScript script ModelInterpreter(CpsScript script) {
this.script = script
} def call(CpsClosure closure) {
Root root = (Root) closure.call()
}

推测给对象传递的闭包会调用call方法,为验证此猜想编写一下代码:

class Person{

    def call(Closure c){
c.call()
} static void main(args){
def p = new Person()
p{
print("Hello")
}
}
}

执行结果:

Hello

由此确认对象是可以接受闭包,并处理的。在call方法的第一行写着:

Root root = (Root) closure.call()

也就是说我们传给pipeline实例的闭包也是有要求的,必须是CpsClosure这种格式的闭包,并且它返回一个Root对象:

class Root implements Serializable {
Agent agent
Stages stages
}

也就是说我们定义的pipeline闭包配置,最终被Jenkins执行后会得到一个配置对象。

when 条件判断

多分支

Jenkins 可以同时监控多个分支。在集成的过程中,有的分支提交代码可能需要测试,通过之后才能合并;有的分支提交代码可能是可以部署了,我们可以根据不同的分支决定持续集成的操作,通过when方法可以设置stage执行的条件:

pipeline{
stages{
stage("init"){
when {
branch 'dev'// 当代码的分支为dev 执行当前stage
}
}
}
}

创建build时需要配合多分支Pipeline使用,这个特性可以通过Pipeline可视化体现出来。

构建参数

创建Build时候可以设置构建参数,通过参数化构建过程增加一个选项参数,设置名称为TargetImage,然后就可以设置when条件了:

when { environment name: 'TargetImage', value: 'Test' }

上面的条件意思为:当对参数TargetImage选择的选项为Test时才执行当前stage。

支持多个git仓库

我们可以在一个Build中依赖多个git仓库,并且将其代码克隆到不同的文件夹内。

正常情况下客隆一个项目的写法:

checkout([$class: 'GitSCM', branches: [[name: '*/dev']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxx', url: 'https://xxx.xxx.git']]])

假如可以指定客隆到本地的目录,那么写多个checkout指令就可以在一个Build中支持多个源码仓库了;可以在checkout中指定一个extension来设置克隆源码到本地目录:

extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'model-dissector']]

完整的指令如下:

checkout([$class: 'GitSCM', branches: [[name: '*/dev']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'model-dissector']], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxx', url: 'https://xxx.xxx.git']]])

我们也可以使用Jenkins自带的代码模板生成,在流水线语法中选择名称为checkout: Checkout from version control,然后添加一个Additional Behaviours 选择 Checkout to a sub-directory就可以了。

并行执行

如果测试阶段有多个单元测试,为了提高速度可以将这些单元测试并行执行。

通过Jenkins可以在Stage中创建并行执行的子Stage,并且为这些Stage分配不同的运行节点。

pipeline{
stages{
stage("init"){
parallel{ // 创建并行的子stages
stage("init 1"){
// do some thing
}
stage("init 2"){
// do some thing
}
}
}
}
}

在上述配置的stagesinit 1 init 2 中可以分别执行不同的单元测试,并同时运行达到节省时间的目的,这个优势在单元测试较多时候表现比较明显。

Jenkins Pipeline 持续集成的更多相关文章

  1. 【iOS】Jenkins Gitlab持续集成打包平台搭建

    Jenkins Gitlab持续集成打包平台搭建 SkySeraph July. 18th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点: ...

  2. 使用jenkins构建持续集成平台

    jenkins +   Maven + svn/git + tomcat 的持续集成平台 项目管理流程: 需求分析----原型设计----开发代码----提交测试-----内部测试-----确认上线( ...

  3. 用MSBuild和Jenkins搭建持续集成环境(2)

    http://www.infoq.com/cn/articles/MSBuild-2   作者 Mustafa Saeed Haji Ali ,译者 李剑 发布于 2012年10月23日 | 注意:  ...

  4. jenkins jmeter持续集成批处理jmx脚本

    这篇文章介绍jenkis jmeter的持续集成,利用jenkins定时任务去批处理执行jmeter的jmx脚本文件,并且生成测试报告 1:jmeter的安装这里我就不在赘述了,如有问题可参考我的jm ...

  5. RF+Jenkins构建持续集成

    引入RF是为了能够快速的开展自动化验收测试,Jenkins而一种持续集成工具,用于监控持续重复的工作,持续的软件版本发布/测试项目,而通过RF+Jenkins可以有利的对RF构建的接口项目进行持续集成 ...

  6. Jenkins+Git 持续集成

    持续集成是必要的! 希望达到的效果是:开发同事签入代码后,对应的站点可以自动实现更新.目前还只在在内部服务器上实现开发环境中的站点更新,不涉及到线上的发布. 目前使用Jenkins实现这样的持续集成. ...

  7. 使用Jenkins进行持续集成ionic3项目

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.  网上大多数是关于.net web网站以及 ...

  8. 使用jenkins实现持续集成

    一.jenkins 介绍 它是一个自动化的周期性的集成测试过程,从检出代码.编译构建.运行测试.结果记录.测试统计等都是自动完成的,无需人工干预: 它需要有专门的集成服务器来执行集成构建: 它需要有代 ...

  9. jenkins+github持续集成中的坑

    1.前言 刚开始开发自己的独立博客的时候,每次发布都要手动打包,上传服务器,杀tomcat进程,重启,来回这么重复性工作,很快就有点不耐烦了.如果能自动化的东西,就绝不要手动了,所以自己搭建了个持续集 ...

随机推荐

  1. spark打包详解

    spark打包还是比较复杂的,特别的其中有关R语言的模块.在本章,我就将其中遇到的所有问题为大家一一讲解,为大家提供一点经验. 这里的打包命令是直接从官网中找的,这里我们最后得到的是tgz格式的包.打 ...

  2. Intel优化Gen7驱动代码 Geekbench 5性能猛增

    Linux下缺少大量开发.支持是会导致各种奇葩的错误的,Intel日前就提交了一个代码修复,22nm Ivybridge及Haswell处理器的GeekBench 5的性能就提升了330%. 3.3倍 ...

  3. Object.keys()方法

    一.定义和用法 返回对象的可枚举属性和方法的名称.二.参数 obj:要返回器枚举自身属性的对象.三.返回值 返回一个所有元素为字符串的数组,其元素来自于从给定的obj里可直接枚举的属性.这些属性的顺序 ...

  4. 使用Filter来过滤掉需要排除的数组对象

    问题描述:有个地方需要根据判断是否是总分公司来控制转正入口的显影,list是获取到的所有入口的数组,需要判断数组里哪个对象的title为"员工转正",本来打算用for循环的,之后发 ...

  5. 【Weiss】【第03章】练习3.26:双端队列

    [练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. ...

  6. python迭代器、装饰器和生成器

    装饰器 1.装饰器的作用 1. 装饰器作用:本质是函数(装饰其他函数)就是为其他函数添加其他功能 2. 装饰器必须准寻得原则: 1)不能修改被装饰函数的源代码 2)不能修改被装饰函数的调用方式 3.实 ...

  7. 基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (下篇)

    前言 回顾上一篇文章<使用Swagger做Api文档 >,文中介绍了在.net core 3.1中,利用Swagger轻量级框架,如何引入程序包,配置服务,注册中间件,一步一步的实现,最终 ...

  8. 读书笔记——莫提默·J.艾德勒&查尔斯·范多伦(美)《如何阅读一本书》

    第一篇 阅读的层次 第一章 阅读的活力与艺术 阅读的目标:娱乐.获得资讯.增进理解力这本书是为那些想把读书的主要目的当作是增进理解能力的人而写.何谓阅读艺术?这是一个凭借着头脑运作,除了玩味读物中的一 ...

  9. Java容器的常见问题

    记录Java容器中的常见概念和原理 参考: https://github.com/wangzhiwubigdata/God-Of-BigData#三Java并发容器 https://blog.csdn ...

  10. 2020.3.23 模拟赛游记 & 题解

    这次的模拟赛,实在是水. 数据水,\(\texttt{std}\) 水,出题人水,做题人也水.??? 游记就说一句: 水. T1 metro 弱智题. 人均 \(100pts\). #pragma G ...