对Jenkinsfile语法说不,开源项目Jenkins Json Build挺你
对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插件:
- Agent Server Parameter Plugin 用于选择构建的Agent服务器
- Custom Checkbox Parameter Plugin 用于选择子项目进行构建,多用于微服务项目
- Git Parameter 用于选择分支构建
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挺你的更多相关文章
- 有趣的开源项目集结完毕,HelloGitHub 月刊第 63 期发布啦!
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这里有实战项目.入门教程.黑科技.开源书籍.大厂开源项目等,涵盖多种编程语言 Pyt ...
- 安装开源项目 MultiType (基于 RecyclerView)出现的各种问题 -- 自己的第一篇博客
一.引入开源项目的方式 使用开源项目 MultiType 的两种方式: 1.maven引入:在主Module 的 build.gradle 中加入 dependencies { ...... comp ...
- 开源项目MultiChoiceAdapter详解(一)——概要介绍
项目地址:https://github.com/ManuelPeinado/MultiChoiceAdapter 这个项目主要是提供了一个多选适配器,使用者可以用它来替换传统的适配器,用途还算比较广泛 ...
- .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...
- Android 开源项目分类汇总(转)
Android 开源项目分类汇总(转) ## 第一部分 个性化控件(View)主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Galler ...
- 【分享】2017 开源中国新增开源项目排行榜 TOP 100
2017 年开源中国社区新增开源项目排行榜 TOP 100 新鲜出炉! 这份榜单根据 2017 年开源中国社区新收录的开源项目的关注度和活跃度整理而来,这份最受关注的 100 款开源项目榜单在一定程度 ...
- Android常用酷炫控件(开源项目)github地址汇总
转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...
- Android 常用炫酷控件(开源项目)git地址汇总
第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.P ...
- .Net 开源项目资源大全
伯乐在线已在 GitHub 上发起「DotNet 资源大全中文版」的整理.欢迎扩散.欢迎加入. https://github.com/jobbole/awesome-dotnet-cn (注:下面用 ...
随机推荐
- 怎么用 Solon 开发基于 undertow jsp tld 的项目?
Solon 开发 jsp 还是简单的,可以有 jetty 启动器 或者 undertow 启动器.此文用 undertow + jsp + tld 这个套路搞一把: 一. 开始Meven配置走起 用s ...
- Tutte 定理与 Tutte–Berge 公式
Tutte theorem 图 \(G=(V,E)\) 有完美匹配当且仅当满足 \(\forall U\subseteq V,o(G-U)\le|U|,o(X)\) 表示 X 子图的奇连通块数. Tu ...
- 带你用 Python 实现自动化群控设备
1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和灰产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接下来的几篇文章,我将带大家聊聊企业 ...
- 9. Technical Overview 技术概述
9.1 Runtime Environment 运行环境 Spring Security 3.0需要Java 5.0运行时环境或更高版本.由于Spring Security的目标是以独立的方式运行,所 ...
- 你真的会做 2 Sum 吗?| 含双重好礼
小预告:文末有两份福利,记得看到最后哦- 2 Sum 这题是 Leetcode 的第一题,相信大部分小伙伴都听过的吧. 作为一道标着 Easy 难度的题,它真的这么简单吗? 我在之前的刷题视频里说过, ...
- 获取到jqgrid发送的请求得到的数据
loadComplete: function (data) { console.log(data); }, 例: var jgGrid = $("#jgTable").jqGrid ...
- Linux下mv命令高级用法
mv 也是 Linux 下一个使用频率非常高的命令,但除了一些基本用法,你还知道它的哪些高级用法呢? 1. 基本用法 移动一个/多个文件: 移动一个/多个目录: 重命名文件/目录. 这些都是很基本的用 ...
- Linux系统中有趣的命令(可以玩小游戏)
Linux系统中有趣的命令(可以玩小游戏) 前言 最近,我在看一些关于Linux系统的内容,这里面的内容是真的越学越枯燥,果然学习的过程还是不容易的.记得前几个月初学Linux时,有时候就会碰到小彩蛋 ...
- Java基础的基础,花1h看这一篇就够了!
------------恢复内容开始------------ Java笔记 一直以来,总想着Java会点基础就可以写后端程序了,但越到后来越发现Java基础的重要性.更不必说在面试时,Java基础 ...
- Mysqldump备份提示没有权限
在使用mysqldump备份的时候如果提示没有权限,执行以下命令 grant select on mysql.proc to 'your-mysqldump-user' 转自https://stack ...