1. 程式人生 > >Unity和Jenkins真是絕配,將打包徹底一鍵化!

Unity和Jenkins真是絕配,將打包徹底一鍵化!

 說起打包,我們的QA簡直是要抓狂,這個確實我也很同情他們。專案最開始打包是另一個同事做的,打包步驟是有些繁瑣,但是專案上線後,不敢輕易動啊!每次他們打包總要跟我抱怨,國內版本打包步驟要10多步還能忍,不能忍的是越南版本一下子21步,所以他們也總是調侃我們程式!

QA:"大佬,什麼時候能優化下打包流程,說好的一鍵呢?"

我:"大約在冬季,下個專案肯定一鍵,如果有可能給你做個語音的,直接說打包就行了"。

最後純屬開玩笑,好了,廢話不多說了,切入今天正題,如何做到一鍵打包?

1,你瞭解Jenkins嗎?

  Jenkins是一個開源軟體專案,是基於Java開發的一種持續整合工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體的持續整合變成可能。主要功能包括:1、持續的軟體版本釋出/測試專案。2、監控外部呼叫執行的工作。這麼說比較官方,說白了,它就是一種集承了多種常用的外掛於一身的工具平臺,通過這個平臺你能很方便的管控你的專案!它的強大之處在於它能直接呼叫外部的shell指令和bat,那麼今天我們一起去解開一點點它的什麼面紗,為什麼說是一點點呢?因為它太強大了,太深了!

1.1,Jenkins是如何安裝的?

  我使用的是2.164.2,下載地址在這裡:https://jenkins.io/download/ 下載後直接解壓安裝即可,使用需要先安裝jdk,這個就不再廢話了!

  

1.2, 安裝完成,如何使用呢?

  開啟你的瀏覽器輸入:http://localhost:8080/  please wait for monment......

    

 

 

   根據提示,找到該路徑下的密碼,複製到這裡就可以了,接下來是初始化外掛,需要等待1-2分鐘

  

  初始化外掛完成後是建立使用者和密碼,這看你高興了,愛怎麼建立就怎麼建立了,我在這裡就建立了使用者名稱:admin  密碼:123456 的使用者,那麼準備工作基本完成了!

1.3,如何用Jenkins建立我們第一個任務呢?

    

  任務建立好了,接下來該如何配置這個任務呢?

  

  將你的ssh私鑰新增進來不然去gothub上無法checkout你的project

  
  到此,一個簡單的從GitHub上拉取工程的任務已經好了,構建下任務,也就是執行下我們建立的任務,你會驚喜的發現,github上的工程check下來了,目錄在E:\Jenkins\workspace\Task_BuildAPK,就是你安裝Jenkins的路徑,下面會自動建立工作區間workspace下級目錄就是你的任務名稱,所有關於本任務的操作都會在這個目錄下!大家可能會說這也忒簡單了吧,那麼來個稍微複雜點的,通過Jenkins傳入引數來控制AssetBundle的打包方式,我們專案的打包分為全部資源打包和增量打包,這兩種方式我們來嘗試下!

2,小試牛刀,Jenkins引數打包

  目標:通過Jenkins引數控制打包方式

  2.1,如何通過Jenkins建立引數並將引數傳入Editor下的打包指令中呢?

    我們就先定義幾個常用的引數,例如:資源版本號,打包渠道和AssetBundle的打包方式!

    

     引數設定完成最後顯示是這個樣子的
    

      接下來如何將引數傳遞,由於%UnityPath% -projectPath %projectPath% -quit -batchmode -executeMethod AssetBundleFramework.AssetBundleBuilder.BuildAssetBundleCommond -logFile %filename%_buildAssetbundle.log也只能呼叫Editor下的靜態方法,所以我先將設定好的引數按照一定的格式寫到本地,執行打包指令時再去解析這些引數列表!這樣就能完美的聽從Jenkins引數去執行打包命令了!

    

    

打包主要呼叫了BuildWithParameter.bat,主要完成jenkins引數本地化,assetbundle資源打包和apk打包

@echo off

set UnityPath=E:\Unity5.6.6\Unity\Editor\Unity.exe
set filename=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
set "filename=%filename: =0%"

REM 1,打AssetBudle資源;    2,生成APK;    3,Copy資源到目標路徑

REM 接受Jenkins傳入的引數
set parameter=%1
echo parameter:%parameter%

REM 將Jenkins傳入的引數寫到本地,Editor下讀取在jenkins中設定的版本號和渠道名稱
echo %parameter%>parameter.txt


echo Start Build AssetBundle
REM BuildAssetBundle
%UnityPath% -projectPath E:\Jenkins\workspace\Task_BuildAPK\AssetBundleFramework\AssetBundleFramework-master -quit -batchmode -executeMethod AssetBundleFramework.AssetBundleBuilder.BuildAssetBundleCommond -logFile %filename%_buildAssetbundle.log
echo Build AssetBundle Finished


echo Start Build APK
REM Build APK
%UnityPath% -projectPath E:\Jenkins\workspace\Task_BuildAPK\AssetBundleFramework\AssetBundleFramework-master -quit -batchmode -executeMethod PerformBuild.CommandLineBuildAndroid -logFile %filename%_buildApk.log
REM %1 -projectPath %2 -quit -batchmode -executeMethod APKBuild.Build -logFile build.log


if not %errorlevel%==0 ( goto fail ) else ( goto success )
 
:success
echo Build APK OK
REM Copr Dir
goto end
 
:fail
echo Build APK Fail
goto end
 
:end

 

   2.1,這樣到底可行嗎?一起構建一次我們最新的任務看下結果!

  

  不好意思,命令全部走完了,也沒報錯,就是沒生成出來apk,,,最後看日誌才知道是這裡的問題,坑了我1個多小時.

  

 

  

 解決方案:將sdk的路徑新增到全域性屬性中的環境變數即可!

  

再次構建後,打包後生成了引數檔案,打包日誌檔案和apk檔案!

 

3.0,打包成功,Jenkins還能再做點什麼呢?

  工具之所以成為工具,就是因為你想要的它都能滿足你,這個時候能來個通知就完美了!

  3.1,構建結果,通過郵件通知你,怎麼配置郵件呢?
  

  郵件主題設定:

    【構建通知】$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
  郵件內容模板內容:      

<!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>    
            本郵件由系統自動發出,無需回覆!<br/>            
            各位同事,大家好,以下為${PROJECT_NAME }專案構建資訊</br> 
            <td><font color="#CC0000">構建結果 - ${BUILD_STATUS}</font></td>   
        </tr>    
        <tr>    
            <td><br />    
            <b><font color="#0B610B">構建資訊</font></b>    
            <hr size="2" width="100%" align="center" /></td>    
        </tr>    
        <tr>    
            <td>    
                <ul>    
                    <li>專案名稱 : ${PROJECT_NAME}</li>    
                    <li>構建編號 : 第${BUILD_NUMBER}次構建</li>    
                    <li>觸發原因: ${CAUSE}</li>    
                    <li>構建狀態: ${BUILD_STATUS}</li>    
                    <li>構建日誌: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>    
                    <li>構建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>    
                    <li>工作目錄 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>    
                    <li>專案  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>    
                </ul>    

<h4><font color="#0B610B">失敗用例</font></h4>
<hr size="2" width="100%" />
$FAILED_TESTS<br/>

<h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
<hr size="2" width="100%" />
<ul>
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
</ul>
詳細提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>

            </td>    
        </tr>    
    </table>    
</body>    
</html>

  將郵件通知配置到我們的任務中
  

    設定完成,再次構建下我們的任務,AssetBundle打包完成,apk生成完畢,郵件傳送事件被觸發,Nice!!!

    

     接下來,檢查下郵件上都發送了什麼?

    
    意不意外,驚不驚喜,好不好玩?這些我也只是花了2天時間學習的,如果有什麼地方寫的不好或者是不正確歡迎指正和交流!大家有問題可以到QQ群:375151422找我交流!

 

   未完待續,我們既然可以自動化生成apk了,那麼接下來就是apk的測試了,先給大家看了,我自己沒寫完的測試!自動啟動模擬器,啟動後如果apk已安裝,先解除安裝,再次安裝最新的apk,然後啟動apk並且支援退出該應用和關閉模擬器!如果有時間,下一篇會和大家一起分享,開源,奉獻,程式精神!花了三個多小時寫了這篇部落格,剛好今天母親節了,工作再忙,不能忘記父母和家人,父母要的並不多,一個電話足矣!!!晚安,睡覺!!!