对Jenkinsfile语法说不,开源项目Jenkins Json Build挺你

项目背景

我所在的组织项目数量众多,使用的语言和框架也很多,比如Java、ReactNative、C# .NET、Android、iOS等,部署环境也是多种多样比如Tomcat、K8S、IIS、客户端应用是局域网内企业证书安装等,我们没有专门的配置管理员或构建部署专员,都是开发人员自己在Jenkins中写构建脚本,每个项目都有自己的构建脚本(Scripted Pipelines),但类型相同的项目比如都是Java或都是.NET项目之间,构建脚本其实都很类似,都是靠几个已存在的构建脚本改写出来的,其实开发人员对编写Jenkins构建脚本了解也不多,另外因为没有规则和约束,更没有代码复用的机制,构建部署工作很混乱和难以管理。

项目解决的问题

在上述情况下我们开发了Jenkins-Json-Build项目,该项目适合于有一些编程经验的人员在不需要了解Jenkins构建脚本如何编写的情况下,通过简单的配置Json文件,就可以轻松完成一个项目的获取源码、单元测试、代码检查、编译构建、部署等步骤,实现一个典型的CI过程,又因为此项目使用了Jenkins共享类库(Shared Libraries)机制,构建脚本复用率得到了大幅度提高,并且开发人员可以方便的扩展更多的功能,满足不同构建部署场景的需要,此项目非常适合那些开发人员自己管理构建部署的团队,通过Jenkins-Json-Build项目组织对构建部署过程进行了统一的管理和监督,又让每个项目有足够的灵活性和自主权满足各自项目构建部署的特殊性。

一个Java项目构建示例

构建服务器上需要安装的软件

构建服务器上需要安装Java、Maven和Sonar-Scanner(此项可选)。

构建需要依赖的Jenkins插件

  • JUnit
  • JaCoCo

Jenkinsfile文件内容

因为采用pipeline script from SCM构建方式,所以用Declarative Pipeline方式在Jenkinsfile中编写构建脚本:

@Library('shared-library') _

pipeline {
agent any
parameters { //定义构建参数
choice choices: ['-'], description: '请选择部署方式', name: 'deploy-choice'
}
stages {
stage('初始化') {
steps {
script{
//加载源码仓库根目录下的jenkins-project.json构建配置文件
runWrapper.loadJSON('/jenkins-project.json')
runWrapper.runSteps('初始化')
}
}
}
stage('单元测试') {
steps {
script{
//执行单元测试步骤
runWrapper.runSteps('单元测试')
}
}
}
stage('代码检查') {
steps {
script{
//执行代码检查步骤,比如SonarQube
runWrapper.runSteps('代码检查')
}
}
}
stage('编译构建') {
steps {
script{
//执行编译步骤
runWrapper.runSteps('编译构建')
}
}
}
stage('部署') {
steps {
script{
//根据选择的部署方式执行部署步骤
runWrapper.runStepForEnv('部署','deploy-choice')
}
}
}
}
}

上述Jenkinsfile文件可用于所有类型的项目构建,实际使用的时候一般还会用到以下三个Jenkins插件:

JSON配置文件内容

{
"初始化": {
"检查Java环境": {
"Type": "COMMAND_STDOUT",
"Success-IndexOf": "java version \"1.8.0_211\"",
"Script": {
"输出Java版本": "java -version 2>&1"
}
},
"检查Maven环境": {
"Type": "COMMAND_STDOUT",
"Success-IndexOf": "Apache Maven 3.6.3",
"Script": {
"输出Maven版本": "mvn -v"
}
},
"检查SonarScanner环境": {
"Type": "COMMAND_STDOUT",
"Success-IndexOf": "SonarScanner 4.4.0.2170",
"Script": {
"输出SonarScanner版本": "sonar-scanner -v"
}
},
"绑定构建参数": {
"Type": "BUILD_PARAMETER_DROP_DOWN_MENU",
"StepsName": "部署",
"ParamName": "deploy-choice"
}
},
"单元测试": {
"执行Maven单元测试脚本": {
"Type": "COMMAND_STATUS",
"Script": {
"Maven单元测试": "cd ${PROJECT_PATH};mvn clean test"
}
},
"执行JUnit插件": {
"Type": "JUNIT_PLUG_IN",
"JunitReportPath": "**/${PROJECT_DIR}/**/target/**/TEST-*.xml"
},
"执行Jacoco插件": {
"Type": "JACOCO_PLUG_IN",
"classPattern":"${PROJECT_PATH}/target/classes",
"InclusionPattern":"${PROJECT_PATH}/**",
"LineCoverage":"95",
"InstructionCoverage":"0",
"MethodCoverage":"100",
"BranchCoverage":"95",
"ClassCoverage":"100",
"ComplexityCoverage":"0"
}
},
"代码检查": {
"执行SQ代码扫描": {
"Type": "SONAR_QUBE"
}
},
"编译构建": {
"执行Maven构建": {
"Type": "COMMAND_STATUS",
"Script": {
"Maven构建": "cd ${PROJECT_PATH};mvn clean package -U -DskipTests"
}
}
},
"部署": {
"模拟部署脚本-1": {
"Type": "COMMAND_STATUS",
"Script": {
"拷贝文件": "echo 模拟拷贝文件"
}
},
"模拟部署脚本-2": {
"Type": "COMMAND_STATUS",
"Script": {
"HTTP传输文件": "echo HTTP传输文件"
}
}
}
}

配置说明:

"检查Java环境": {
"Type": "COMMAND_STDOUT",
"Success-IndexOf": "java version \"1.8.0_211\"",
"Script": {
"输出Java版本": "java -version 2>&1"
}

该类型的节点不是必须的(但看几年前写的配置文件时很有用,对需要的构建环境一目了然),目的是检查构建服务器是否具备需要的构建环境,在命令的标准输出内未含有Success-IndexOf节点定义的字符串则执行失败,对应的另一个节点名称是Fail-IndexOf,标准输出如果含有Fail-IndexOf定义的字符串则执行失败,两者选择其一使用。

"绑定构建参数": {
"Type": "BUILD_PARAMETER_DROP_DOWN_MENU",
"StepsName": "部署",
"ParamName": "deploy-choice"
}

将部署节点(Steps)内的具体构建步骤(Step)列表,绑定到名为deploy-choice的下拉菜单构建参数上。

"执行JUnit插件": {
"Type": "JUNIT_PLUG_IN",
"JunitReportPath": "**/${PROJECT_DIR}/**/target/**/TEST-*.xml"
}

使用Jenkins的JUnit插件生成Junit和TestNG的测试报告。

"执行Jacoco插件": {
"Type": "JACOCO_PLUG_IN",
"classPattern":"${PROJECT_PATH}/target/classes",
"InclusionPattern":"${PROJECT_PATH}/**",
"LineCoverage":"95",
"InstructionCoverage":"0",
"MethodCoverage":"100",
"BranchCoverage":"95",
"ClassCoverage":"100",
"ComplexityCoverage":"0"
}

使用Jenkins的Jacoco插件检查单元测试覆盖度。

"代码检查": {
"执行SQ代码扫描": {
"Type": "SONAR_QUBE"
}
}

执行SonarQube代码检查,需要在项目根目录下要创建sonar-project.properties配置文件,以Java项目的配置文件为例:

# must be unique in a given SonarQube instance
sonar.projectKey=Jenkins:Test-Java-Build sonar.projectVersion=1.0 # Path is relative to the sonar-project.properties file. Defaults to .
sonar.sources=src
sonar.sourceEncoding=UTF-8
sonar.java.binaries=./target/classes
"执行Maven构建": {
"Type": "COMMAND_STATUS",
"Script": {
"Maven构建": "cd ${PROJECT_PATH};mvn clean package -U -DskipTests"
}
}

该节点就是执行命令,这里具体构建命令是用mvn clean package -U -DskipTests命令完成的。

经过上述配置文件的执行,我们可以很简单的完成所有的构建步骤:

这里篇幅有限,更多内容请到项目仓库查看比如:

  • 构建JS项目
  • 构建ReactNative项目
  • 构建Android项目
  • 构建iOS项目
  • 构建.NET项目
  • 构建多个子项目
  • 构建成功和失败处理
  • 在K8S内创建Pod进行构建

欢迎大家去关注、交流更多的关于Jenkins构建的问题和经验

项目仓库地址:Jenkins Json Build

对Jenkinsfile语法说不,开源项目Jenkins Json Build挺你的更多相关文章

  1. 有趣的开源项目集结完毕,HelloGitHub 月刊第 63 期发布啦!

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这里有实战项目.入门教程.黑科技.开源书籍.大厂开源项目等,涵盖多种编程语言 Pyt ...

  2. 安装开源项目 MultiType (基于 RecyclerView)出现的各种问题 -- 自己的第一篇博客

    一.引入开源项目的方式 使用开源项目 MultiType 的两种方式: 1.maven引入:在主Module 的 build.gradle 中加入 dependencies { ...... comp ...

  3. 开源项目MultiChoiceAdapter详解(一)——概要介绍

    项目地址:https://github.com/ManuelPeinado/MultiChoiceAdapter 这个项目主要是提供了一个多选适配器,使用者可以用它来替换传统的适配器,用途还算比较广泛 ...

  4. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

  5. Android 开源项目分类汇总(转)

    Android 开源项目分类汇总(转) ## 第一部分 个性化控件(View)主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Galler ...

  6. 【分享】2017 开源中国新增开源项目排行榜 TOP 100

    2017 年开源中国社区新增开源项目排行榜 TOP 100 新鲜出炉! 这份榜单根据 2017 年开源中国社区新收录的开源项目的关注度和活跃度整理而来,这份最受关注的 100 款开源项目榜单在一定程度 ...

  7. Android常用酷炫控件(开源项目)github地址汇总

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

  8. Android 常用炫酷控件(开源项目)git地址汇总

    第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.P ...

  9. .Net 开源项目资源大全

    伯乐在线已在 GitHub 上发起「DotNet 资源大全中文版」的整理.欢迎扩散.欢迎加入. https://github.com/jobbole/awesome-dotnet-cn (注:下面用 ...

随机推荐

  1. C语言学习笔记之原码反码补码

    原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0   0变1 补码:机器 ...

  2. 解决drf_yasg中的SwaggerAPI无法正确分组问题

    swagger是后台开发中很好用的交互式文档,Django原本的Django-Swagger已经停止维护了,现在一般用drf_yasg这个包来实现文档,它里面支持swagger和redoc两种,red ...

  3. Python中json.dump与repr的区别

    Json是一种轻量级的数据交换格式,Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数: 引入json包: import json json.dumps(): ...

  4. C#LeetCode刷题之#349-两个数组的交集(Intersection of Two Arrays)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4042 访问. 给定两个数组,编写一个函数来计算它们的交集. 输入 ...

  5. Python多进程队列间传递对象

    前言 在python 需要在队列中传递对象, 会出现进程不能正常退出的情况. 其原因是因为 在父进程 向子进程传入的Queue对象不对, Queue对象正常是子进程之间的信息传递, 而当我在父进程 创 ...

  6. VUE——添加组件模块(图表)

    Vue是由一个个小模块组成的,模块可以让页面简介还可以复用: 1.不固定数据数量传到子组件 父组件: <chartVue v-for="(item, index) in chartLi ...

  7. 设置与查看Linux系统中的环境变量

    大家好,我是良许. 大家都知道,在 Linux 系统中,有环境变量和 Shell 变量这两种变量. 环境变量是在程序及其子程序中全局可用的,常常用来储存像默认的文本编辑器或者浏览器,以及可执行文件的路 ...

  8. 利用C#实现OPC-UA服务端

    前言 最近接手了一个项目,做一个 OPC-UA 服务端?刚听到这个消息我是一脸懵,发自灵魂的三问“OPC-UA是什么?”.“要怎么做?”.“有什么用?”.我之前都是做互联网相关的东西,这种物联网的还真 ...

  9. MySQL是如何实现事务的ACID

    前言 最近在面试,有被问到,MySQL的InnoDB引擎是如何实现事务的,又或者说是如何实现ACID这几个特性的,当时没有答好,所以自己总结出来,记录一下. 事务的四大特性ACID 事务的四大特性AC ...

  10. Spark QuantileDiscretizer 分位数离散器

    1.概念 接收具有连续特征的列,并输出具有合并分类特征的列.按分位数,对给出的数据列进行离散化分箱处理. 和Bucketizer(分箱处理)一样也是:将连续数值特征转换为离散类别特征.实际上Class ...