app持续交付实战
- 一、学习目标
- 二、优势
- 三、子任务拆分
- 四、环境依赖
- 1、安卓 SDK
- 2、安卓设备(真机 or 模拟器)
- 3、Appium 自动化测试
- 4、JDK
- 5、Python3环境
- 6、allure-commandline工具
- 7、allure插件
- 五、实战任务:串行执行 Jenkins Pipeline 项目
- 1、创建顺序执行 Jenkins Pipeline 项目
- 2、顺序任务流程图
- 3、添加Pipeline 代码
- 4、将代码添加到 Jenkins 项目中
- 5、顺序执行的APP持续交付Pipeline任务运行调试
- 6、查看邮件
- 六、实战任务2:并行执行 Jenkins Pipeline 项目
- 1、并行任务流程图
- 2、添加Pipeline 代码
- 3、将代码添加到 Jenkins 项目与运行演示
- 4、查看邮件
- 七、总结
一、学习目标
从产品源代码制作出可运行APP,自动部署到安卓手机,运行自动测试程序检验正确性
包含自动任务
APP Build 自动打包
APP Build 自动发布
APP Build 自动部署
APP Build UI 自动测试
邮件通知任务结果
利用Jenkins Pipeline 技术实现APP持续交付的全自动化流水线过程
二、优势
重复性定时任务最适合让计算机来做
减少人力参与,提升工作效率
让Build不再是阻碍测试进度的因素
自动化重用率高,维护频率低
三、子任务拆分
获取源码
编译、打包
部署app
自动化测试
发布可测包
邮件通知
四、环境依赖
1、安卓 SDK
2、安卓设备(真机 or 模拟器)
3、Appium 自动化测试
保证在本地脚本可以跑通
4、JDK
C:\Users\Lenovo>java -version
java version "11.0.18" 2023-01-17 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.18+9-LTS-195)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.18+9-LTS-195, mixed mode)
5、Python3环境
C:\Users\Lenovo>python
Python 3.9.6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
6、allure-commandline工具
C:\Users\Lenovo>where allure
D:\allure-commandline-2.13.2\allure-2.13.2\bin\allure
D:\allure-commandline-2.13.2\allure-2.13.2\bin\allure.bat
7、allure插件
五、实战任务:串行执行 Jenkins Pipeline 项目
1、创建顺序执行 Jenkins Pipeline 项目
2、顺序任务流程图
3、添加Pipeline 代码
文件名:androidSamplePython_seq
pipeline{
agent {
label 'app_CICD_node' //表示在那个节点运行
}
stages{
stage('安卓程序源码同步') {
steps { // steps:代表执行步骤
bat 'mkdir AndroidSampleApp' // 创建一个AndroidSampleApp目录,如果目录存在不创建,目录不存在就创建
dir("AndroidSampleApp"){ // 把git远程仓库代码,生成到AndroidSampleApp目录中
git branch:'master', url:'git@gitee.com:zhilongya/AndroidSampleApp.git'
}
}
}
stage('安卓编译打包') {
steps {
//进入子目录下AndroidSampleApp
//运行bat gradlew clean assembleDebug:安卓编译打包
// bat '''
// cd AndroidSampleApp
// sh gradlew clean assembleDebug
// '''
echo "This is test code"
}
}
stage('安卓部署') {
steps {
// 进入AndroidSampleApp目录下,
// apk=app/build/outputs/apk/debug/app-debug.apk:变量的赋值
bat '''
cd AndroidSampleApp
set apk="D:/jenkins_CICD/qywx_185637.apk"
echo %apk%
{
adb uninstall com.tencent.wework
} || {
echo 'no com.tencent.wework package'
}
#TIMEOUT /T 5
echo %apk%
adb install -r %apk%
'''
}
}
stage('自动测试程序源码同步') {
steps {
bat 'mkdir iAppBVT_Python'
dir("iAppBVT_Python"){
git branch:'master', url:'git@gitee.com:zhilongya/iAppBVT_Python.git'
}
}
}
stage('运行自动化测试') {
steps {
bat '''
# . ~/.bash_profile
cd iAppBVT_Python
#更新python依赖库
pip3.9 install -r requirements.txt
#运行自动化测试
#pytest -sv test/bvt_test.py --tc-file ~/iAppBVT_Python.json --tc-format json
pytest -sv test/test_bvt.py
'''
}
}
}
post {
success {
// archiveArtifacts artifacts: 'D:/jenkins_CICD/qywx_185637'
echo "This is test code"
}
always{
script{
emailext body:
''' <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<td>(本邮件由程序自动下发,请勿回复!)</td>
</tr>
<tr>
<td>
<h2><font color="#FF0000">构建结果 - ${BUILD_STATUS}</font></h2>
</td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr><a href="${PROJECT_URL}">${PROJECT_URL}</a>
<td>
<ul>
<li>项目名称:${PROJECT_NAME}</li>
<li>GIT路径:<a href="git@gitlab.corp.XXX.com:wangxu/ops.git">git@gitlab.corp.XXX.com:wangxu/ops.git</a></li>
<li>GIT分支:master</li>
<li>构建编号:${BUILD_NUMBER}</li>
<li>触发原因:${CAUSE}</li>
<li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<b><font color="#0B610B">变更信息:</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<ul>
<li>上次构建成功后变化 : ${CHANGES_SINCE_LAST_SUCCESS}</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>上次构建不稳定后变化 : ${CHANGES_SINCE_LAST_UNSTABLE}</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>变更集:${JELLY_SCRIPT,template="html"}</a></li>
</ul>
</td>
</tr>
<!--
<tr>
<td>
<b><font color="#0B610B">Failed Test Results</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<pre style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre>
<br />
</td>
</tr>
<tr>
<td>
<b><font color="#0B610B">构建日志 (最后 100行):</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>-->
<!-- <tr>
<td>Test Logs (if test has ran): <a
href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>
<br />
<br />
</td>
</tr> -->
<!--
<tr>
<td>
<textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">${BUILD_LOG, maxLines=100,escapeHtml=true}</textarea>
</td>
</tr>-->
<hr size="2" width="100%" align="center" />
</table>
</body>
</html>
''',
subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!', to: '1181068365@qq.com'
}
}
}
}
4、将代码添加到 Jenkins 项目中
5、顺序执行的APP持续交付Pipeline任务运行调试
6、查看邮件
六、实战任务2:并行执行 Jenkins Pipeline 项目
流程效率的优化
目标:节约运行时间,提升效率
方法:抽取可并行的节点,减少等待时间
1、并行任务流程图
2、添加Pipeline 代码
文件名:androidSamplePython_paral
pipeline{
agent {
label 'app_CICD_node'
}
stages{
stage('获取源码') {
parallel {
stage('安卓程序源码') {
steps {
bat 'mkdir AndroidSampleApp'
dir("AndroidSampleApp"){
git branch:'master', url:'git@gitee.com:zhilongya/AndroidSampleApp.git'
}
}
}
stage('自动测试程序源码') {
steps {
bat 'mkdir iAppBVT_Python'
dir("iAppBVT_Python"){
git branch:'master', url:'git@gitee.com:zhilongya/iAppBVT_Python.git'
}
}
}
}
}
stage('安卓编译打包') {
steps {
bat '''
cd AndroidSampleApp
gradlew clean assembleDebug
'''
//echo "This is test code"
}
}
stage('测试与发布') {
parallel {
stage('发布测试包') {
steps {
archiveArtifacts artifacts: 'AndroidSampleApp/app/build/outputs/apk/debug/app-debug.apk'
//echo "This is test code"
}
}
stage('自动化'){
stages{
stage('部署') {
steps {
bat '''
cd AndroidSampleApp
// set apk=app/build/outputs/apk/debug/app-debug.apk
set apk="D:/jenkins_CICD/qywx_185637.apk"
{
#try: 卸载现有的安卓app
adb uninstall com.tencent.wework
} || {
#catch
echo 'no com.tencent.wework package'
}
#sleep 5
#安装安卓app
echo %apk%
adb install -r %apk%
'''
}
}
stage('自动测试') {
steps {
bat '''
cd iAppBVT_Python
#更新python依赖库
pip3.9 install -r requirements.txt
#运行自动化测试
#pytest -sv test/bvt_test.py --tc-file ~/iAppBVT_Python.json --tc-format json
pytest -sv test/test_bvt.py
'''
}
}
}
}
}
}
}
post {
success {
// archiveArtifacts artifacts: 'D:/jenkins_CICD/qywx_185637'
echo "This is test code"
}
always{
script{
emailext body:
''' <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<td>(本邮件由程序自动下发,请勿回复!)</td>
</tr>
<tr>
<td>
<h2><font color="#FF0000">构建结果 - ${BUILD_STATUS}</font></h2>
</td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr><a href="${PROJECT_URL}">${PROJECT_URL}</a>
<td>
<ul>
<li>项目名称:${PROJECT_NAME}</li>
<li>GIT路径:<a href="git@gitlab.corp.XXX.com:wangxu/ops.git">git@gitlab.corp.XXX.com:wangxu/ops.git</a></li>
<li>GIT分支:master</li>
<li>构建编号:${BUILD_NUMBER}</li>
<li>触发原因:${CAUSE}</li>
<li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<b><font color="#0B610B">变更信息:</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<ul>
<li>上次构建成功后变化 : ${CHANGES_SINCE_LAST_SUCCESS}</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>上次构建不稳定后变化 : ${CHANGES_SINCE_LAST_UNSTABLE}</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>变更集:${JELLY_SCRIPT,template="html"}</a></li>
</ul>
</td>
</tr>
<!--
<tr>
<td>
<b><font color="#0B610B">Failed Test Results</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<pre style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre>
<br />
</td>
</tr>
<tr>
<td>
<b><font color="#0B610B">构建日志 (最后 100行):</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>-->
<!-- <tr>
<td>Test Logs (if test has ran): <a
href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>
<br />
<br />
</td>
</tr> -->
<!--
<tr>
<td>
<textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">${BUILD_LOG, maxLines=100,escapeHtml=true}</textarea>
</td>
</tr>-->
<hr size="2" width="100%" align="center" />
</table>
</body>
</html>
''',
subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!', to: '1181068365@qq.com'
}
}
}
}
3、将代码添加到 Jenkins 项目与运行演示
4、查看邮件
七、总结
部分并行相比于顺序执行效率有了明显的提升
利用 Jenkins Pipeline 代码控制APP持续交付的全流程
持续交付的子任务拆分: 减少工作节点之间的耦合性,提高节点本身操作的内聚性
效率提升:并行与串行控制
利用代码控制交付过程,灵活、方便、有效