app持续交付实战

在这里插入图片描述


一、学习目标

从产品源代码制作出可运行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:'[email protected]: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:'[email protected]: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="[email protected]:wangxu/ops.git">[email protected]: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: '[email protected]'
          }
          }

          }

}

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:'[email protected]:zhilongya/AndroidSampleApp.git'
                        }
                    }
                }

                stage('自动测试程序源码') {
    
    
                    steps {
    
    
                        bat 'mkdir iAppBVT_Python'
                        dir("iAppBVT_Python"){
    
    
                            git branch:'master', url:'[email protected]: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="[email protected]:wangxu/ops.git">[email protected]: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: '[email protected]'
          }
          }

          }
}

3、将代码添加到 Jenkins 项目与运行演示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、查看邮件

在这里插入图片描述

七、总结

部分并行相比于顺序执行效率有了明显的提升
利用 Jenkins Pipeline 代码控制APP持续交付的全流程
持续交付的子任务拆分: 减少工作节点之间的耦合性,提高节点本身操作的内聚性
效率提升:并行与串行控制
利用代码控制交付过程,灵活、方便、有效

猜你喜欢

转载自blog.csdn.net/YZL40514131/article/details/130478726