1. 程式人生 > >通過Jenkins搭配Unity3d + luaframework實現網頁端自動化打包

通過Jenkins搭配Unity3d + luaframework實現網頁端自動化打包

閱前提示
本文講述內容為在實現unity3d+luaframework一鍵打包後,如何與jenkins整合,進行自動化打包,如果您不知道如何做到一鍵打包,請參閱我的另一篇文章:
https://blog.csdn.net/wanzi215/article/details/81413487
如果您對unity3d,luaframework不熟悉,則不建議閱讀.

上一篇我們講了Unity3D + luaframework如何做到一鍵打包,但那只是在編譯除錯時有用,並不能徹底解放我們的電腦和雙手,接下來我們就來看看怎麼和jenkins結合做到真正的自動化打包.

以下操作都是在windows10作業系統下完成,確保你的電腦環境已經安裝好git,python,unity3d和luaframework,並且已經搭建好luaframework一鍵打包環境.

目錄:

如何安裝jenkins

進入jenkins官網:https://jenkins.io/
在首頁點選Download進行下載安裝.

安裝完畢後在瀏覽器輸入地址http://localhost:8080/jenkins開啟jenkins主頁
首次登陸會要求輸入在安裝時自動生成的密碼,以確保是通過管理員來進行安裝的,密碼存放在如下圖所示的initialAdminPassword檔案中,使用記事本即可開啟,把密碼貼到輸入框中繼續下一步

通過密碼驗證後會要求輸入管理員資訊:

接下來就可以真正進入Jenkins主介面了:

如何跟專案進行關聯

點選開始建立一個新任務


在開啟的頁面中輸入任務的名稱,這裡我們輸入”luaframework
任務型別我們選擇”構建一個自由風格的軟體專案

點選確定後繼續

在新開啟的頁面中選中General選項卡

General選項卡頁面下拉到底部,在構建那一欄選擇”增加構建步驟“,並選中”執行windows批處理命令

接著在命令欄裡輸入命令:

cd /d D:\luaframework
git pull
git submodule update --init --recursive
python package.py %clearWrapFiles% %buildResource% 

這段命令的功能如下:
* 1.切換到專案所在資料夾
* 2.用git拉取最新的工程
* 3.用git拉取最新的子模組(如果有子模組的話)
* 4.呼叫python指令碼package.py並傳入指定的引數進行打包

使用python作為嫁接而不是完全直接用windows批處理命令是因為我們需要在後續的操作裡面執行一些稍微複雜的的邏輯,比如根據傳遞的引數呼叫不同的打包函式,以及顯示日誌等等功能,使用python更方便一些

通過上面的命令可以發現,我們傳入了clearWrapFiles和buildResource兩個引數,傳入的格式是用兩個%組合,下面對這兩個引數進行講解:
* clearWrapFiles 是否重新生成lua介面檔案(修改了c#介面檔案後需要勾上)
* buildResource 是否重新打包assetbundle檔案

接下來我們需要在jenkins裡面進行引數的配置:
General選項卡中勾選引數化構建過程,新增兩個布林型引數,如下圖:

最後點選應用和儲存

接下來我們來看看package.py裡面的內容:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
import sys

unity_exe='"C:\Program Files\Unity5.5.6f1\Editor\Unity.exe"'
keystore= 'D:/keystore/luaframework.keystore'

code_path = os.getcwd()
buildfunction = ""

if sys.argv[1] == "true":
    buildfunction = "AutoBuild.clearAndBuild"
elif sys.argv[2] == "true":
    buildfunction = "AutoBuild.build"
else:
    print("nothing happen.")

cmd = unity_exe + " -projectPath " + code_path + " -executeMethod " + buildfunction + " -batchmode -logFile" + "log.txt" + \
                  " keyName-" + keystore + \
                  " keyPass-luaframework" + \
                  " keyAliasName-luafw" + \
                  " keyAliasPass-luaframework"
print(cmd)                  
result = os.system(cmd)

if (result != 0):
    print(result)
    f=open(code_path + "/pylog.txt","r")
    print(f.read().decode('UTF-8').encode('GBK'))
    raise Exception('Error!')
else :
    print("complete!")

這段程式碼的功能如下:
* 首先指定本地unity安裝程式的位置和android簽名檔案的位置
* 根據傳遞進來的引數呼叫不同的打包函式
* 呼叫unity的-executeMethod方法執行打包函式(這裡以打android包為例,所以需要傳入keystore的相關資訊,如果是打其它平臺的包則不需要傳)
* 把打包的日誌檔案儲存到本地
* 打包完畢後如果有錯誤,把日誌檔案列印到控制檯以便排查

注意!
這裡對clearWrapFiles和buildResource兩個引數的判斷是以字串來進行比對的,雖然我們在jenkins中配置的是布林型,但傳遞到python後的true/false都是以字串的形式,並不是真正的布林型,這裡需要注意.

接下來對一些容易出現的坑進行詳細講解:

如何正確呼叫系統git命令

git pull

上述命令非常簡單,但為什麼要單獨提出來說呢,因為這裡有個坑,我在這裡花了半天的時間.
jenkins是以服務的形式執行的,首次安裝後如果不進行設定,它會以訪客的身份進行登入,於是乎就會出現各種沒有訪問許可權導致的錯誤,如果你在通過jenkins執行git操作時出現了錯誤,那多半是因為許可權不夠導致的問題,因此我們需要對jenkins服務進行一次使用者提權的登入配置:
首先開啟計算機管理,在左邊找到服務和應用程式–服務,在右邊找到Jenkins服務,雙擊開啟

切換到登入選項卡,選中此賬戶,填入本機管理員的使用者名稱和密碼,點選應用和確定

這樣就可以正常執行git命令了

如何處理打包過程中出現的異常

為什麼要手動處理異常?因為jenkins並沒有聰明到可以檢測到打包過程中發生邏輯錯誤的情況,如果我們不主動給jenkins丟擲異常,那jenkins會認為一切正常,並且讓控制檯也顯示一切正常,這樣會對我們進行誤導,明明一切都沒有問題,為什麼包遲遲打不出來,導致效率低下,所以我們需要手動進行處理,丟擲異常讓jenkins接收,以便其在控制檯正確的顯示錯誤讓我們能及時知道.

unity支援在打包邏輯程式碼中主動呼叫EditorApplication.Exit(-1);來丟擲異常(比如版本號不對等等),注意,必須要填寫一個非0的引數,如果引數為0,則unity認為是正常退出.
另外,如果在打包過程中有任何的編譯錯誤,unity會自動丟擲一個值為1的異常,如果沒有任何異常,則會返回0,因此我們可以通過

result = os.system(cmd)
if (result != 0):

這段程式碼進行捕獲,一旦捕獲到非0的返回值即代表發生了異常,這時我們再通過python程式碼

raise Exception('Error!')

丟擲異常,這樣就能被jenkins接收到,標記事件執行失敗,以便我們及時的排查錯誤.

如何在控制檯顯示日誌

我們在呼叫打包函式時可以帶上

-logFile" + "log.txt"

把打包過程中的日誌輸出到log.txt檔案中,在發生錯誤後通過

f=open(code_path + "/pylog.txt","r")
print(f.read().decode('UTF-8').encode('GBK'))

把日誌直接列印打控制檯進行檢視
如果你的日誌中有中文字元,則需要以GBK進行編碼才能正常顯示.

好了,現在所以配置都完畢了,我們來試試打包吧
回到luaframework主頁面,點選左邊的立即構建:

在下面的Build History中可以看到構建的進度,如果正常構建則會以灰藍色顯示,如果出現問題會以紅色顯示

關於構建進度的說明:除非出現錯誤,否則jenkins是不知道真實的構建進度的,也就是說這次打包是需要三分鐘還是五分鐘它是不知道的,那它的進度以什麼為依據呢?其實是以上一次成功構建的時間來計算的,所以它顯示的進度是一個大概的進度,並不精確,如果兩次版本構建的時間間隔很長,專案發生了很大的變化,那這個進度就更不準去了,所以關於進度我們心理有數就好,還是把重心放在其結果是紅色還是灰藍色上好了.

至此整個自動化打包已製作完畢,enjoy it!