对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. 我给这个Python库打101分!

    日志在开发过程中是一种被很多程序员 不重视 ,但是却 至关重要 的一项功能. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案 ...

  2. Netty(一):的入门使用。

    Netty的入门基本使用流程代码,不做具体分析.使用版本为Netty 4.x版本. 服务端调用示例: 绑定端口号为8080端口 package com.cllover; import com.sun. ...

  3. 16、Java中级进阶 面向对象 封装

    1.封装概述 封装可以被认为是一个保护屏障,将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过类提供的方法来实现对隐藏信息的操作访问,可以有效的防止该类的代码和数据被其他类随意访问. 要访问 ...

  4. gotoblas,mpich,hpl,hpcg的安装

    gotoblas的安装 mpich 安装 tar zxvf mpich-3.2.1.tar.gz cd mpich-3.2 ./configure --prefix=/usr/local/mpich( ...

  5. 设计模式:原型模式介绍 && 原型模式的深拷贝问题

    0.背景 克隆羊问题:有一个羊,是一个类,有对应的属性,要求创建完全一样的10只羊出来. 那么实现起来很简单,我们先写出羊的类: public class Sheep { private String ...

  6. 碰到 Json_CSRF 怎么办?

    前言 在最近挖洞的时候,老是碰到 POST 传参采用 JSON 格式,而不是传统的parameter=value的格式,之前也没接触过,所以也不知道该怎么搞,所以打算学习一下,此文作为一个笔记梳理. ...

  7. Java引用类型之软引用(2)

    下面接着上一篇介绍第2阶段和第3阶段的处理逻辑. 2.process_phase2() 第2个阶段移除所有的referent还存活的Reference,也就是从refs_list中移除Referenc ...

  8. [Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本

    写在前面 很多neter都有在用Ocelot做Api网关,但是Ocelot又不像kong或者其他网关一样,开箱即用.它需要你单独开一个web项目来部署,这样很多同学都在做重复的事了. 这里[Hei.O ...

  9. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 控制反转搭配简单业务

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 说明 我们上一节已经成功通过 连接提供程序存储库,获取到了 连接提供程序,但是连接提供程序和数据库连接依赖太深, ...

  10. Windows 安装 kafka

    1.kafka下载地址:http://kafka.apache.org/downloads 解压:kafka_2.12-2.6.0.tgz 2.配置zookeeper 进入config目录找到文件zo ...