1. 程式人生 > 其它 >使用Jenkins+Blue Ocean 持續構建自動化部署之安卓原始碼打包、測試、郵件通知

使用Jenkins+Blue Ocean 持續構建自動化部署之安卓原始碼打包、測試、郵件通知

什麼是BlueOcean?

BlueOcean重新考慮了Jenkins的使用者體驗。BlueOcean由Jenkins Pipeline設計,但仍然相容自由式工作,減少了團隊成員的混亂,增加了清晰度。

  • 連續交付(CD)Pipeline的複雜視覺化,允許快速和直觀地瞭解Pipeline的狀態。
  • Pipeline編輯器通過引導使用者直觀和視覺化的過程建立Pipeline,使建立Pipeline平易近人。
  • 個性化,以適應團隊每個成員的角色需求。
  • 需要干預和/或出現問題時確定精度。BlueOcean顯示了Pipeline需要注意的地方,便於異常處理和提高生產率。
  • 用於分支和拉取請求的本地整合可以在GitHub和Bitbucket中與其他人進行程式碼協作時最大限度提高開發人員的生產力。

BlueOceans使用

依賴外掛

該外掛安裝完成後,在所要構建的任務中就會出現BlueOcean選擇,該專案是基於上篇部落格Pipeline專案,傳送門:https://www.cnblogs.com/feng0815/p/14287056.html


點選開啟 Blue Ocean

執行

實時展示進度

並行執行

以上的執行都是序列的,必須上個流程結束才能執行下個流程,這樣就會造成執行效率較低。
對於沒相互依賴的流程,我們可以進行並行執行
修改執行指令碼

pipeline{
    agent {
        label 'master'
    }
stages{
    stage(<span class="hljs-string">'獲取原始碼'</span>) {
        parallel {
            stage(<span class="hljs-string">'安卓程式原始碼'</span>) {
                steps {
                    sh <span class="hljs-string">'mkdir -p AndroidSampleApp'</span>
                    <span class="hljs-built_in">dir</span>(<span class="hljs-string">"AndroidSampleApp"</span>){
                        git branch:<span class="hljs-string">'master'</span>, url:<span class="hljs-string">'https://gitee.com/sfboy/AndroidSampleApp.git'</span>
                    }
                }
            }

            stage(<span class="hljs-string">'自動測試程式原始碼'</span>) {
                steps {
                    sh <span class="hljs-string">'mkdir -p iAppBVT_Python'</span>
                    <span class="hljs-built_in">dir</span>(<span class="hljs-string">"iAppBVT_Python"</span>){
                        git branch:<span class="hljs-string">'master'</span>, url:<span class="hljs-string">'https://gitee.com/sfboy/iAppBVT_Python.git'</span>
                    }
                }
            }
        }
    }

    stage(<span class="hljs-string">'安卓編譯打包'</span>) {
        steps {
            sh <span class="hljs-string">'''
                . ~/.bash_profile
                cd AndroidSampleApp
                sh gradlew clean assembleDebug
            '''</span>
        }
    }

    stage(<span class="hljs-string">'測試與釋出'</span>) {
        parallel {
            stage(<span class="hljs-string">'釋出測試包'</span>) {
                steps {
                    archiveArtifacts artifacts: <span class="hljs-string">'AndroidSampleApp/app/build/outputs/apk/debug/app-debug.apk'</span>
                }
            }

            stage(<span class="hljs-string">'自動化'</span>){
                stages{
                    stage(<span class="hljs-string">'部署'</span>) {
                        steps {
                            sh <span class="hljs-string">'''
                                . ~/.bash_profile
                                cd AndroidSampleApp
                                apk=app/build/outputs/apk/debug/app-debug.apk
                                {
                                    #try: 解除安裝現有的安卓app
                                    adb uninstall com.appsflyer.androidsampleapp
                                } || {
                                    #catch
                                    echo 'no com.appsflyer.androidsampleapp package'
                                }
                                sleep 5

                                #安裝安卓app
                                adb install $apk
                            '''</span>
                        }
                    }

                    stage(<span class="hljs-string">'自動測試'</span>) {
                        steps {
                            sh <span class="hljs-string">'''
                                . ~/.bash_profile

                                cd iAppBVT_Python

                                #更新python依賴庫
                                pip3 install -r requirements.txt

                                #執行自動化測試
                                pytest -sv test/bvt_test.py --tc-file iAppBVT_Python.json --tc-format json
                            '''</span>
                        }
                    }
                }
            }
        }
    }

    stage(<span class="hljs-string">'通知郵件'</span>) {
        steps {
            emailext body: <span class="hljs-string">'$DEFAULT_CONTENT'</span>, recipientProviders: [[$<span class="hljs-class"><span class="hljs-keyword">class</span>:</span> <span class="hljs-string">'RequesterRecipientProvider'</span>]], subject: <span class="hljs-string">'$DEFAULT_SUBJECT'</span>
        }
    }
}

}