本文记录一下Jenkins代码质量扫描与自动化部署的全过程。
Jenkins安装
Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
war安装
JENKINS_VERSION:2.73.3
1 | wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war |
初始登录密码在jenkins启动时可以看到。
docker安装
1 | #https://github.com/jenkinsci/docker/blob/master/README.md |
也可以自己写Dockerfile编译:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36# Version: 1.0.0
FROM centos
MAINTAINER xxx.xxx.com
#ENV JENKINS_HOME /usr/local/jenkins
#VOLUME [ "/var/jenkins_home", "/usr/local/jenkins" ]
RUN yum install -y unzip git
ADD java.sh /etc/profile.d/
ADD jenkins_env.tgz /usr/local/
ADD settings.xml ~/.m2/
RUN ln -s /usr/local/apache-ant-1.10.1 /usr/local/ant \
&& ln -s /usr/local/groovy-2.4.10 /usr/local/groovy \
&& ln -s /usr/local/apache-maven-3.3.9 /usr/local/maven \
&& ln -s /usr/local/gradle-3.4 /usr/local/gradle \
&& ln -s /usr/local/jdk1.7.0_80 /usr/local/jdk1.7
RUN chmod +x /usr/local/gradle/bin/gradle /usr/local/maven/bin/mvn /usr/local/ant/bin/ant /usr/local/groovy/bin/groovy
#RUN sed -i 's;SELINUX=.*;SELINUX=disabled;' /etc/selinux/config
RUN sed -i 's;LANG=.*;LANG="zh_CN.UTF-8";' /etc/locale.conf
#RUN timedatectl set-timezone Asia/Shanghai
RUN echo -e 'search xxx.com \nnameserver 192.168.100.101 \nnameserver 114.114.114.114' > /etc/resolv.conf
RUN . /etc/profile.d/java.sh
COPY jenkins.war /usr/local/jenkins/
WORKDIR /usr/local/jenkins
ENTRYPOINT [ "/usr/local/jdk1.7/bin/java", "-Xmx2048M", "-Xms2048M", "-XX:PermSize=128M", "-XX:MaxPermSize=512m", "-jar", "-DJENKINS_HOME=/var/jenkins_home", "jenkins.war" ]
#CMD ["-h"]
#EXPOSE 80
java.sh1
2
3
4
5
6
7
8export JAVA_HOME=/usr/local/jdk1.7
export MVN_HOME=/usr/local/maven
export GRADLE_HOME=/usr/local/gradle
export GRADLE_USER_HOME=jenkins_home/.gradle
export ANT_HOME=/usr/local/ant
export GROOVY_HOME=/usr/local/groovy
export JENKINS_HOME=/var/jenkins_home
export PATH=$JAVA_HOME/bin:$MVN_HOME/bin:$GRADLE_HOME/bin:$ANT_HOME/bin:$GROOVY_HOME/bin:$PATH
plugin安装
需要安装以下插件:
- Ant
- Build Pipeline
- Project statistics
- Static Analysis Collector
- Checkstyle
- PMD
- FindBugs
- JaCoCo
- DRY
- Git Parameter
- Extensible Choice Parameter
- Gradle
- Publish Over SSH
- Email Extension
- Configuration Slicing
- Environment Injector
环境配置
java/maven/git环境配置
登录jenkins后,在:系统管理->Global Tool Configuration中配置。
Jenkins Location
登录jenkins后,在:系统管理->系统设置中配置,用于设置管理员的邮箱地址。
Extended E-mail Notification
配置以下信息:
Default Subject:
1 | 构建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS! |
Default Content:
1 | <hr/> |
对应的变量请参考https://www.cnblogs.com/weiweifeng/p/8295724.html
邮件模板
将template.jelly文件放在$JENKINS_HOME的email-templates目录中。
Default Pre-send Script
有时候可能想在手动点击Build时,只发邮件给自己。或者是想临时过滤某些账户,可以通过Default Pre-send Script来实现,在Jenkins—>配置中配置Default Pre-send Script:
1 | // https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+Recipes#Email-extRecipes-AdditionalTemplatesIntheSourceCode |
静态代码扫描
项目配置
在pom.xml中添加:
1 | <plugin> |
代码扫描
1 | #checkstyle |
对应的checkstyle/pmd/findbugs的相关配置请参考:codecheck.zip
JaCoCo
Eclipse插件
The update site for EclEmma is http://update.eclemma.org/. EclEmma is also available via the Eclipse Marketplace Client, simply search for “EclEmma”.
Maven插件
在pom.xml中添加:
1 | <!-- https://www.cnblogs.com/fnlingnzb-learner/p/10637802.html --> |
jenkins jacoco插件会有设置rules的地方,如果有使用jenkins的话rules可以不用配置。
代码扫描:
1 | #mvn clean install jacoco:check 有异常时会中断运行,并且一定要先编译,因为jacoco是通过class文件来分析的 |
jenkins项目配置
参数化构建过程
注意:
Git parameter只能实现一些简单的过滤条件,如果想实现复杂的过滤的话,可以用Groovy脚本(通过Extensible Choice Plugin实现):
对应的脚本为:
1 | // https://gist.github.com/lyuboraykov/8deae849e4812669793a |
或者全部通过shell过滤:1
2
3
4
5
6
7// https://gist.github.com/lyuboraykov/8deae849e4812669793a
def gitURL = project.scm.key.replace("git ", "")
// refs/heads/1.6.x
def command = "git ls-remote --heads -h $gitURL | awk '{print \$2}' | sort -t '/' -k 3 -V -r | egrep '/[0-9]+\\.[0-9]+\\.x' | sed 's;^refs/heads/;;g'"
def proc = ['bash', '-c', command].execute()
proc.waitFor()
return proc.in.text.readLines()
另外,由于Jenkins的安全限制,groovy没有权限运行,可以通过http://ip:port/scriptApproval/进行授权。
配置仓库
构建触发器
Poll SCM:
定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作。我的配置如下:
1 | */5 * * * * (每5分钟检查一次源码变化) |
Build periodically:
周期进行项目构建(它不care源码是否发生变化),我的配置如下:
1 | 0 2 * * * (每天2:00 必须build一次源码) |
构建
注意:
checkstyle:checkstyle pmd:pmd pmd:cpd findbugs:findbugs只会警告,错误时不会退出。如果想显示完整的代码扫描结果,又想在错误时退出,可以进行以下配置:
如果有使用jacoco的话不能跳过测试用例:
Post Steps:
构建完成后的步骤。一般常用于自动化部署。
参考以下的自动化部署脚本:
1 |
|
构建设置
此处将代码质量扫描的结果显示出来:
构建后操作
在首页显示代码质量扫描的结果:
Editable Email Notification
Jenkins视图设置
效果如下:
权限控制
Configure Global Security
Manage and Assign Roles
Manage Roles
重点说明一下Project roles:
默认dev role是没有Build job的权限,可以在具体的project中配置,比如说允许dev build以.test结尾的项目:
1 | ^.*\.test$ |
或者只允许dev build不以.test开头的项目:
1 | ^(?!hkcash).+$ |
或者只允许dev build不以.test结尾的项目:
1 | ^.*\.(?<!test)$ |
Assign Roles
Configuration Slicing
如果项目太多的话,修改每个项目的配置太痛苦,可以通过Slicing批量修改。比如要修改Maven Goals and Options: