Jenkins Pipeline 持续集成
Jenkins Pipeline 持续集成
Pipeline Script 执行流程
在使用Pipeline之前请确保Jenkins是2.x版本以上,并且安装了Pipeline插件。
Jenkins提供了pipeline对象,作为配置的入口。它接受一个闭包,在闭包内定义配置:
pipeline {
// do some thing
}
闭包内的方法层级结构(由DSL定义):
- stages
- stage
- steps
- step
- steps
- stage
一个例子:
pipeline {
agent any
stages {
stage('1. 初始化') {
steps {
script {
println("Hello")
}
}
}
}
}
我们创建了一个Jenkins Pipeline Build,在脚本里面写上:
println(pipeline)
构建之后日志打印:
org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter@403c4fdc
实际上pipeline是ModelInterpreter一个实例,相当于可以给一个对象传递闭包!通过搜索找到该类所在的项目 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 持续集成的更多相关文章
- 【iOS】Jenkins Gitlab持续集成打包平台搭建
Jenkins Gitlab持续集成打包平台搭建 SkySeraph July. 18th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点: ...
- 使用jenkins构建持续集成平台
jenkins + Maven + svn/git + tomcat 的持续集成平台 项目管理流程: 需求分析----原型设计----开发代码----提交测试-----内部测试-----确认上线( ...
- 用MSBuild和Jenkins搭建持续集成环境(2)
http://www.infoq.com/cn/articles/MSBuild-2 作者 Mustafa Saeed Haji Ali ,译者 李剑 发布于 2012年10月23日 | 注意: ...
- jenkins jmeter持续集成批处理jmx脚本
这篇文章介绍jenkis jmeter的持续集成,利用jenkins定时任务去批处理执行jmeter的jmx脚本文件,并且生成测试报告 1:jmeter的安装这里我就不在赘述了,如有问题可参考我的jm ...
- RF+Jenkins构建持续集成
引入RF是为了能够快速的开展自动化验收测试,Jenkins而一种持续集成工具,用于监控持续重复的工作,持续的软件版本发布/测试项目,而通过RF+Jenkins可以有利的对RF构建的接口项目进行持续集成 ...
- Jenkins+Git 持续集成
持续集成是必要的! 希望达到的效果是:开发同事签入代码后,对应的站点可以自动实现更新.目前还只在在内部服务器上实现开发环境中的站点更新,不涉及到线上的发布. 目前使用Jenkins实现这样的持续集成. ...
- 使用Jenkins进行持续集成ionic3项目
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 网上大多数是关于.net web网站以及 ...
- 使用jenkins实现持续集成
一.jenkins 介绍 它是一个自动化的周期性的集成测试过程,从检出代码.编译构建.运行测试.结果记录.测试统计等都是自动完成的,无需人工干预: 它需要有专门的集成服务器来执行集成构建: 它需要有代 ...
- jenkins+github持续集成中的坑
1.前言 刚开始开发自己的独立博客的时候,每次发布都要手动打包,上传服务器,杀tomcat进程,重启,来回这么重复性工作,很快就有点不耐烦了.如果能自动化的东西,就绝不要手动了,所以自己搭建了个持续集 ...
随机推荐
- Simulink仿真入门到精通(八) M语言对Simulink模型的自动化操作及配置
8.1 M语言控制模型的仿真 M语言与Simulink结合的方式: 在Simulink模型或模块中使用回调函数 在M语言中调用与模型相关的命令,控制模型的建立,设置模块的属性,增删信号线,以及运行模型 ...
- Vue在点击内部元素时(获得焦点),怎样让外部div元素样式变化?
问题: div内部有很多元素,div. p. span .input等,各元素有嵌套,现在点击某元素时需要最外面这个div边框高亮,例如,点击了input开始输入 假设html 结构如下 <d ...
- C#的关键字Explicit 和 Implicit
一.explicit和implicit explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符:implicit 关键字用于声明隐式的用户自定义的类型转换运算符. 总结来说: ...
- c js 字符串反转
1.例如:输入 i am a student 输出 student a am i #include <stdio.h> #include <string.h> v ...
- js 拖拽实现面向对象
1.js 支持面向对象编程,但只是基于面向对象,不使用类或者接口.2.演变 工厂模式------->构造函数模式---------->原型模式 工厂模式的缺点: ①函数内部new ,不太符 ...
- ffmpeg 使用
ffmpeg 使用 一.介绍 FFmpeg 是视频处理最常用的开源软件,大量用于视频网站和商业软件(比如 Youtube 和 iTunes),视频本身是一个容器,里面包含了视频.音频和字幕等.FFmp ...
- 深入理解计算机系统 (CS:APP) - 高速缓存实验 Cache Lab 解析
原文地址:https://billc.io/2019/05/csapp-cachelab/ 这个实验是这学期的第四个实验.作为缓存这一章的配套实验,设计得非常精妙.难度上来讲,相比之前的修改现成文件, ...
- Fiddler2 下断点修改HTTP报文
一 Fiddler中设置断点修改HTTP请求 方法1:全局断点.Rules-->Automatic BreakPoint-->Before Requests(或快捷键F11),这种方法会拦 ...
- 基于 websocket 的多端桥接平台
我们现在的业务是基于新闻客户端实现的,都要经过新闻客户端的环境,进行前后端数据上的交互.但是我们在调试过程中,非常的不方便. 通常使用的工具有:modheader, postman, fiddler ...
- 我的Keras使用总结(3)——利用bottleneck features进行微调预训练模型VGG16
Keras的预训练模型地址:https://github.com/fchollet/deep-learning-models/releases 一个稍微讲究一点的办法是,利用在大规模数据集上预训练好的 ...