背景
很多开发同学都忙于写代码,但是对项目发布的整个流程不是很清楚,本文基于CI/CD的思想,结合Jenkins,docker,maven搭建一个自动化的发布流程,并加入代码质量检测,希望通过这个流程,能给开发小伙伴一个大概的CI/CD概览,同时也反过来思考怎么去写好代码。
目标
本次demo的目标输出结果为
- 本地推送代码后自动触发jenkins构建流程
- Jenkins展示javadoc, jxr, projectinfo等site阶段常规文档
- Jenkins展示测试结果
- Jenkins展示测试覆盖率
- Jenkins展示 Checkstyle结果
- Sonar server展示结果
- 服务在docker 容器中自动启动
大家可以对着这些目标验证自己是否成功。
前期准备
知识准备
- 基本了解docker的基本操作,用于搭建环境,我会把所有代码都贴出来,但是为了方便排查问题,至少过一遍官网的quick start.
- 熟悉maven,包括pom标签,lifecycle, dependency机制等,这部分对于理解整个流程是最重要的
- jenkins界面操作,这个可以等搭建完成后自己先点点看
如果没有上面的知识储备,理论上只要照着做,也能成功,但出了问题可能无法解决,可以在下方留言寻求帮助
硬件要求
实验环境为2台2核2G linux centos,SonarQube 和Jenkins对系统负载有点要求,所以将这俩分开来搭建。即现有2核2G server-a, server-b两服务器,下面以此代称。
注:如果选择都装在同一台服务器上,后面执行sonar分析的时候会遇到容器内网络访问问题,下面也会进行补充说明,但是对于docker不熟悉的同学还是建议分开来,避免学习成本。
软件安装
- docker(server-a, server-b 都需安装)
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
此部分为单纯安装docker,和官网上是一样的,有问题可以看下官网。
service docker start
启动守护线程
2.Jenkins(server-a安装,可以和下面的SonarQube搭建同时进行,节省时间)
docker run -p 9010:8080 -p 50000:50000 -u root -d \
-v $(which docker):/usr/bin/docker \
-v /opt/data/jenkins-data/home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts
设置web访问端口9010,-v volume挂载命令,将容器内资源映射到host。第1个v和第3个v的目的是将host docker映射到容器内部,这样在jenkins内启动服务容器时实际上是启动在host上的。
启动后进入Jenkins验证页面,使用docker ps 查看已启动的容器,
使用 docker查看容器日志命令查看 jenkins日志获取密码,
docker logs <jenkins-container-id>
或者
docker exec -it <jenkins-container-id> bash
进入容器内部,再按照页面提示的文件路径,cat 命令查看文件内容,输入密码,然后安装推荐插件完成Jenkins初始化,安装估计要点时间,可以先放着进行下一步。
- SonarQube(server-b安装)
docker run -d --name sonarqube \
-p 9012:9000 \
-v sonarqube_data:/opt/sonarqube/data \
-v sonarqube_extensions:/opt/sonarqube/extensions \
-v sonarqube_logs:/opt/sonarqube/logs \
sonarqube:latest
设置web端口9012,初始登录账号密码均为admin。
- 插件安装
Jenkins正常启动后,进入左上角Jenkins->manage Jenkins-> manage plugins插件中心,搜索安装以下插件:
Jenkins配置构建过程
-
基础配置
打开Jenkins->manage Jenkins->Global Tool Configuration
配置git和maven
- 配置 Config File Provider Plugin 插件
该插件目的在于添加自定义的配置文件,这里我们用来解决sonar server的host地址问题,maven里sonar插件的机制是请求其它搭建了sonarqube的server来进行分析,sonar server的host地址需要配置。
打开Jenkins->manage Jenkins->managed files,
点击add new config,
选择type 为 global maven settings.xml,
点击提交,然后左边菜单栏点击config files,
进入页面后点击笔记本图标,
更改name 为 sonar-maven,
在下方content中 更改pluginGroups标签为
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
在profiles标签中添加
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
http://<your-server-b-ip>:9012
</sonar.host.url>
</properties>
</profile>
注意更换<your-server-b-ip>。
注:如果只有一个server,<your-server-b-ip>填 server-ip是不行,这里变成了同一个docker下的container之间的通信,要借助docker network,执行:
docker network create sonar -- 创建name为sonar的network
docker network connect sonar <jenkins-container-id> -- 连接 Jenkins
docker network connect sonar <sonar-container-id> -- 连接 sonar
上方的 <your-server-b-ip> 改成 sonar的容器names(命令行最后一列NAMES)即可
-
Jenkins配置构建过程
点击左上角Jenkins 选择 New Item, 构建一个maven项目,名字输入Jenkins-demo,确定。
这时在我们主界面上会出现该项目
点击进入项目,在左侧菜单栏中找到configure构建配置,进入。
上方的General等tab表示这个构建过程的阶段,下面将几个必要的点讲解一下
- Source Code Management
源代码的地址配置,直接使用的github(有搭gitlab的可以把代码拉下来再上传到自己的)选择git,这里有写好的demo项目
demo地址: https://github.com/JaphyFan/jenkins-parent.git
大家可以直接用,拉到本地看下pom文件,代码我随意写的,主要是项目结构-多模块单体仓库(mono-repository),以及该结构下Pom里的配置,可以fork到自己的github仓库里,方便下面验证自动发布的时候修改代码,觉得有帮助的可以给个star。
这里填写URL就行
-
build trigger
触发build操作,为了全自动化,勾选poll scm,schedule里填写H/5 * * * *,代表每5分钟检测git 代码是否有变更,有的话自动构建。
-
Build Environment
这里我们主要是为了解决sonar server的问题,将刚开始我们创建的sonar-maven的配置文件放到构建环境中,如果你在 配置 Config File Provider Plugin 插件 中新建了文件,这个下拉框会显示出来,target填写settings.xml。
注:设置SonarQube其实也有其它方式,例如命令参数等,这里不做细究。 -
Build
真正的构建环节,设置maven执行命令:
clean install site:site -Prelease -s settings.xml
-P使用我们在pom 里定义的release profile,主要是生成文档,具体请看pom文件,-s settings.xml 引用我们在Build Environment里加入的maven 配置。 - Post-build Actions
这里是我们添加各种报告展示的地方,点击 左下方的add post-build action, 然后添加- aggregate downstream test results
- record jacoco coverage report
- record compiler warnings and static analysis results
aggregate downstream test results和record jacoco coverage report不需要填写,直接默认的就行,record compiler warnings and static analysis results在tool里选择 Checkstyle,javadoc,junit三个即可,选一个点下左下方的add tool,依次添加。
点击保存,至此构建配置完成了。
实验与结论
转换到项目主页面
点击左侧菜单的build now, 左下方会生成构建过程 #1,点击进入
点击console output查看构建日志,第一次构建速度比较慢,主要是下载maven依赖,构建成功后我们就可以验证文章开头设立的目标了。
- 本地推送代码后自动触发jenkins构建流程
- Jenkins展示javadoc, jxr, projectinfo等site阶段常规文档
- Jenkins展示测试结果
- Jenkins展示测试覆盖率
- Jenkins展示 Checkstyle结果
- Sonar server展示结果
- 服务在docker 容器中自动启动
- 验证1:
将项目代码fork到自己的github,更改代码,push上去,可以观察项目主页面右下方build history这里,我们设置的轮训时间是5分钟,最长5分钟会出现自动构建过程。 - 验证2:
在项目主页面,构建成功后有一个 maven-generated-site(上方图片里就有), 点击进入可看到项目信息以及javadoc和jxr生成的xref文档(提供源码和文档的交叉浏览) - 验证3:
项目主页面 最新测试结果(上方图片里就有)运行了4个测试,没有失败。 - 验证4:
项目主页面 jacoco图表(上方图片里就有),可以点击表格查看更详细内容(sonar server里也默认附带了jacoco覆盖率) - 验证5:
Warnings next generation在 项目主页面 插件生成了 Javadoc warnings, Junit wirings, Checkstyle wirings (上方图片里就有) -
验证6:
登录server-b搭建的sonar server, 查看分析报告
-
验证7:
java服务我们其实真实启动的是子模块order,我给order开了swagger,端口是9000,浏览器查看 server-a-ip:9000/swagger-ui.html,可以看到接口页面。
同时在server-a下 使用docker ps 可以看到 order容器启动着。
至此验证完毕。由于篇幅所限,pom文件反而没有多提,但其实pom才是最重要的,jenkins这种maven风格的构建方式全程借助maven的lifecycle,需要好好看下maven官网。另外,加强本地代码质量检测也很重要,像checkstyle, sonar,测试覆盖率这种idea都是有提供插件的。
希望本文对大家有所帮助,时间仓促,有需要优化或解释不清的地方欢迎留言讨论。