Jenkins的应用
制品管理
简述
- 制品是软件开发过程中产生的多种有形副产品
- 包括用例、UML图、设计文档、二进制包等
- 制品管理涉及的两件事情
- 如何将制品放到制品库中
- 如何从制品库中取出制品
- 目前现成的制品库有
- Nexus
- Artifactory
Artifactor
简述
- 可以用于归档JAR包,也可以归档所有类型的制品
- 团队初期可以考虑使用这种方式管理简单的制品
常用的参数
- artifacts,需要归档的文件路径
- fingerprint,需要对归档的文件进行签名,布尔类型
- excludes,需要排除的文件路径
- caseSensitive,对路径大小写是否敏感,布尔类型
- onlyIfSuccessful,只在构建成功时进行归档,布尔类型
Nexus
搭建环境
安装Nexus
发布制品
maven deploy插件发布制品
安装maven deploy插件
-
配置pom配置文件
---------------pom文件配置--------------- <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>3.1.1</version> </plugin>
插件相关配置
- 配置发布地址
- 配置访问nexus的用户名和密码
Nexus Platform插件发布制品
安装Nexus Platform插件
插件相关配置
- 进入Manage Jenkins
- Configure System
- Sonatype Nexus页
- 设置Nexus 服务器地址与访问凭证
- 在pipeline中加入nexusPublisher步骤
管理Docker镜像仓库
操作流程
- 选择Administration
- 选择Repository
- 选择Repositories
- 单击docker(hosted),进入Docker私有仓库创建页
- 填写表单
- 创建Docker私有仓库凭证
- 将镜像推送到Docker私有仓库所需要的访问凭证
- 构建并发布Docker镜像到仓库中
管理原始制品
简述
Nuxus提供了对raw仓库的支持,raw仓库可以被理解为一个文件系统,我们可以在该仓库中创建目录
创建raw仓库
- 选择Administration
- 选择Repository
- 选择Repositories
- 单击raw(hosted),进入raw仓库创建页
- 填写表单,点击create repository完成仓库创建
- 配置访问凭证
上传制品,获取制品
- 填写访问凭证
- 在pipeline中上传制品
从其它pipeline中拷贝制品
- Copy Artifact插件
多分支构建
创建多分支pipeline
- 选择"MultibranchPipeline"
- 设置代码仓库地址
- 设置分支扫描触发策略
- 孤儿任务(Orphaned Item)处理策略
根据分支部署到不同的环境
- 使用if else指令进行处理
- 使用when指令进行处理,when指令必须至少包含一个条件
- GitLab trigger对多分支pipeline的支持
- Generic Webhook Trigger插件在多分支pipeline场景下的应用
可视化构建及视图
Green Balls插件
将构建成功的状态图标修改为绿色的的图标
Build Monitor View插件
可以将Jenkins项目以一块看板的形式呈现,可以直观的看到某个环境的部署情况
添加监控视图看板
- 单击+号添加新视图
- 进入添加表单后,选择Build Monitor View选项
- 进入Build Monitor View编辑页,选择在视图中显示哪些Job,以及它们的排序规则
- 编辑完成后,页面就变成了之前配置的哪些内容看板
通过项目维度来建立视图
- 点击New View选项
- 填写视图信息后,点击ok
- 在Job Filters部分,勾选Use a regular expression to include jobs into the view 复选框
- 然后输入正则表达式,用于匹配项目名称
- 匹配的项目将会显示在此视图中
- 单击ok,完成视图的建立
设置默认视图
- 进入Manage Jenkins
- Configure System
- 找到Default view选项,设置默认视图
分布式构建与并行构建
分布式架构
简述
jenkins采用的是master和agent架构
node,节点,指包含Jenkins环境及有能力执行项目的机器
节点分析
- master节点
- 负责提供界面、处理Http请求及管理构建环境
- agent节点
- 负责执行构建
- 该类节点下的executor(执行器),是真正执行项目的单元
水平拓展方案
agent节点
增加agent节点的方式
- 通过JNLP协议增加agent节点
- 通过JNLP协议增加Windows agent
- 通过Swarm插件增加agent
对agent打标签
用于区分逻辑组
- 打标签维度
- 工具链
- 操作系统
- 系统位数
使用
- 通过标签指定节点,即指定agent
- agent{label 'jdk8'}
- 不分配节点,系统自动分配
- agent none
代码质量管理
静态代码分析
简述
- 静态代码分析是指在不运行程序的前提下,对源代码进行分析或检查
- 包括代码风格、可能出现的空指针、代码快大小、重复的代码等
- 使用机器来对规范的实施进行检查
- 常见的静态代码分析器
- Check-style
- FindBugs
- PMD
PMD代码规范检查
简述
PMD是一款可拓展的静态代码分析器,不仅可以对代码风格进行检查,还可以检查设计、多线程、性能等方面的问题
maven项目中的配置
maven-pmd-plugin插件并不会自动使用p3c-pmd,需要在引入dependencies部分手动加入p3c-pmd依赖,然后再rulesets属性中引入p3c的规则
-
pom.xml的配置
<!-- 阿里p3c插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.15.0</version> <configuration> <verbose>true</verbose> <!-- 规范的配置 --> <rulesets> <ruleset>rulesets/java/ali-comment.xml</ruleset> <ruleset>rulesets/java/ali-concurrent.xml</ruleset> <ruleset>rulesets/java/ali-constant.xml</ruleset> <ruleset>rulesets/java/ali-exception.xml</ruleset> <ruleset>rulesets/java/ali-flowcontrol.xml</ruleset> <ruleset>rulesets/java/ali-naming.xml</ruleset> <ruleset>rulesets/java/ali-oop.xml</ruleset> <ruleset>rulesets/java/ali-orm.xml</ruleset> <ruleset>rulesets/java/ali-other.xml</ruleset> <ruleset>rulesets/java/ali-set.xml</ruleset> </rulesets> <printFailingErrors>true</printFailingErrors> </configuration> <executions> <execution> <id>pmd-check-verify</id> <phase>package</phase> <goals> <goal>check</goal> </goals> </execution> <execution> <id>pmd-pmd-site</id> <phase>site</phase> <goals> <goal>cpd</goal> </goals> </execution> </executions> </plugin>
jenkins中的PMD的配置
插件安装
- 安装Jenkins PMD插件
- 执行pipeline后,可以在任务详情页面看到PMD报告的链接
- 单击链接进入报告页面,可以看到更详细的信息
配置示例
#在Jenkinsfile中加入pmd步骤
pipeline {
agent any
tools {
maven 'mvn-3.5.4'
}
stages {
stage('pmd'){
steps {
sh 'mvn pmd:pmd'
}
}
}
post {
always {
pmd(canRunOnFailed: true, pattern:'**/target/pmd.xml')
}
}
}
单元测试
简述
- Jenkins并不会帮我们写单元测试,需要人工进行编写单元测试
- 由机器负责自动化执行此类单元测试
JUnit插件
简述
- Junit是一个Jave语言的单元测试框架,用于单元测试与报告生成
- 当执行maven test命令时,Maven会执行测试阶段,然后生成测试报告
操作流程
-
安装Jenkins JUnit插件
-
在Jenkins中加入junit步骤,通常将junit步骤放在post always中,因为当测试不通过时依然可以收集到测试报告
-
示例
post { always { junit testResults:"**/target/surefire-reports/*.xml" } } -
当pipeline运行结束后, 在构建页可以通过TestResult查看测试报告详细信息
代码覆盖率
JaCoCo插件
简述
- 是一个免费的Java代码覆盖率的库,能帮助我们监测出代码覆盖率,并输出覆盖率报告
- 支持多维度的覆盖率测试
覆盖率维度
- 指令覆盖率(Instruction Coverage)
- 分支覆盖率(Branch Converage)
- 圈复杂度覆盖率(Cyclomatic Complexity Coverage)
- 行覆盖率(Line Coverage)
- 方法覆盖率(Method Coverage)
- 类覆盖率(Class Coverage)
- Class Coverage
使用
- 安装JaCoCo插件
- 在Maven项目中引入JaCoCo插件,执行maven jacoco生成代码覆盖率测试报告
- 在pipeline file中配置jacoco在mvn命令之后执行
- pipeline运行完成后,在任务详情页中查看测试报告
常见问题
- 代码覆盖率越高,软件的质量就越高吗?
- 代码覆盖率需要与其它指标(代码变动率、复杂度)等进行一并考虑
- 覆盖率与质量之间有弱正相关性,单并不适合作为开发人员的KPI指标
性能测试
Jenkins环境配置
- 安装python环境
- 安装Preformance插件
- 安装Taurus?不需要自行安装,Performance插件如果发现机器上没有安装Taurus,它会自动运行pip install bzt命令进行安装
Taurus
简述
- 是一个开源的自动化框架,用于运行各种开源负载测试工具和功能测试工具
- 支持的常见的负载测试工具
- Apache Jmeter
- Selenium
- Gatling
- The Grinder
- 特性
- 支持YAML或JSON来描述性能测试
- 会根据选择的性能测试类型自动下载相应的工具
应用
运行JMeter测试
-
配置jmeter的steps
pipeline { agent any stages { stage ('performance test') { steps { bzt params: 'test_config.yml' } } } } -
在项目中配置test.yml文件
execution: - scenario: simple scenarios: simple: script: simpleTestPlan.jmx modules: jmeter: download-link: http:xx.com/apache-jmeter-{version}.zip version: 5.0
bzt的参数列表
- params,字符串类型,配置文件的路径
- alwaysUseVirtualenv,布尔类型,如果为false,则不使用virtualenv进行环境隔离
- bztVersion,bzt版本,字符串类型
- generatePerformanceTrend,是否在Jenkins项目详情页生成性能趋势图
- useBztExitCode,使用bzt步骤的退出码作为Jenkins项目的构建结果
- useSystemSitePackages,为virtualenv加上--system-site-packages参数
- workingDirectory,指定bzt的工作目录
代码质量检查
SonarQube
简述
- 代码质量管理工具,能对20多种编程语言进行代码味道、Bug、安全漏洞方面进行静态分析
相关设置
- 设置sonarQube禁止非登录用户使用
- 为用户生成token,Jenkins只能通过token与SonarQube集成
- 登录SonarQube,进入个人设置页面中的Security tab页面进行设置
- 在执行mvn命令时加入相应的sonar.login参数
maven项目依赖SonarQube
-
pom.xml中加入依赖
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.4.1.1168</version> </plugin> -
执行命令
mvn clean org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.1.1168:sonar -Dsonar.host.url=http://xxx:9000 -
sonar.host.url参数用于指定sonarQube服务的地址
Jenkins集成SonarQube
- 安装SonarQube Scanner插件
- 配置SonarQube Scanner插件
- 设置Webhooks,当分析完成时,由SonarQube主动通知Jenkins
- 进入SonarQube
- 选择Adminstration
- Configuration
- Webhooks页
- 填写Jenkin的地址
- 在Jenkinsfile中加入sonarQube的stage
- 设置Quality Gates(质量阈值)
使用SonarQube提供的扫描工具(Scanner)进行代码扫描
- 安装SonarQube Scanner插件
- 设置扫描工具自动下载并安装,也可以手动安装后指定目录
- 在代码项目根目录下放入sonar-project.properties文件,sonar-scanner会读取其配置
- pipeline配置相关内容
SonarQube集成p3c
- 从Github下载p3c PMD插件,编译打包
- 将打包好的jar包放到SonarQube所在服务器的home/ext ensions/plugins目录下
- SonarQube
- 创建p3c profile
- 单击SonarQube里面的Quality Profiles
- 点击Create按钮
- 输入profile名称
- 选择java语言
- 在profile列表中找到刚刚创建的p3c profile
- 选择set as Default
- 为p3c profile激活p3c规则,新创建的profile是没有激活任何规则的,需要手动激活,点击activate More Rules
- 跳转到激活页面,激活所有的p3c规则
- 这样分析Java代码时,就会使用p3c规则了
将分析报告推送到GitLab
- 在SonarQube安装GitLab插件
- 配置SonarQube GitLab插件
- 为Sonar-scanner添加参数,告诉sonarQube将分析结果关联到GitLab的相应commit上
- 当sonarQube分析完成后,就可以在GitLab的相应commit页面上的代码行内或commit评论区看到分析结果了
更美观的测试报告
Allure测试报告
简述
- 是一个框架,能将各种测试报告更美观的呈现出来
集成allure、Maven、Jenkins
- 安装Allure Jenkins插件
- 在pom.xml文件中加入依赖
- 在pom.xml文件中加入allure插件
- 在Jenkinsfile中的post阶段加入allure步骤
- 构建完成后,我们看到在构建历史中出现allure的logo
- 点击可在allure插件中查看测试报告