搭配 Xamarin 使用 Jenkins
本指南說明如何將 Jenkins 設定為持續整合伺服器,並自動編譯以 Xamarin 建立的行動應用程式。 它描述如何在OS X上安裝 Jenkins、設定及設定作業,以在認可原始程式碼管理系統的變更時編譯 Xamarin.iOS 和 Xamarin.Android 應用程式。
與 Xamarin 的持續整合簡介引進持續整合,作為實用的軟體開發實務,可提供中斷或不相容程式代碼的早期警告。 CI 可讓開發人員在發生問題時解決問題,並將軟體保持在適合部署的狀態。 本逐步解說涵蓋如何將這兩份文件的內容一起使用。
本指南說明如何在執行 OS X 的專用電腦上安裝 Jenkins,並將它設定為在電腦啟動時自動執行。 安裝 Jenkins 之後,我們將安裝其他外掛程式以支援 MS Build。 Jenkins 支援現用 Git。 如果 TFS 用於原始程式碼控制項,也必須安裝額外的外掛程式和命令行公用程式。
設定 Jenkins 並安裝任何必要的外掛程式之後,我們將建立一或多個作業來編譯 Xamarin.Android 和 Xamarin.iOS 專案。 作業是執行某些工作所需的步驟和元數據集合。 工作通常包含下列專案:
- 原始程式碼管理 (SCM) – 這是 Jenkins 組態檔中的元數據專案,其中包含如何連線至原始程式碼控制件的資訊,以及要擷取的檔案。
- 觸發程式 – 觸發程式可用來根據特定動作啟動作業,例如開發人員將變更認可至原始程式碼存放庫時。
- 建置 指示 – 這是外掛程式或腳本,將編譯原始程式碼,併產生可在行動裝置上安裝的二進位檔。
- 選擇性建置動作 – 這可能包括執行單元測試、對程式代碼執行靜態分析、簽署程式代碼,或啟動另一個作業來執行其他建置相關工作。
- 通知 – 作業可能會傳送有關組建狀態的某種通知。
- 安全性 – 雖然是選擇性的,但強烈建議也啟用 Jenkins 安全性功能。
本指南將逐步解說如何設定涵蓋上述每個點的 Jenkins 伺服器。 最後,我們應該充分瞭解如何設定 Jenkins,為 Xamarin 行動專案建立 IPA 和 APK。
需求
理想的組建伺服器是獨立計算機,專門用來建置及測試應用程式的唯一用途。 專用計算機可確保其他角色可能需要的成品(例如網頁伺服器的成品)不會污染組建。 例如,如果組建伺服器也做為網頁伺服器,Web 伺服器可能需要一些通用連結庫的衝突版本。 由於這種衝突,網頁伺服器可能無法正常運作,或者 Jenkins 可能會建立在部署至使用者時無法運作的組建。
Xamarin 行動應用程式的組建伺服器非常類似開發人員的工作站。 它有一個用戶帳戶,其中將安裝 Jenkins、Visual Studio for Mac 和 Xamarin.iOS 和 Xamarin.Android。 所有程式代碼簽署憑證、布建配置檔和金鑰存放區也必須安裝。 一般而言,組建伺服器的使用者帳戶與開發人員帳戶不同 - 請務必在使用組建伺服器用戶帳戶登入時安裝及設定所有軟體、密鑰和憑證。
下圖說明一般 Jenkins 組建伺服器上的所有這些元素:
iOS 應用程式只能在執行 macOS 的電腦上建置和簽署。 Mac Mini 是合理的低成本選項,但任何能夠執行 OS X 10.10 (Yosemite) 或更高版本的電腦就已足夠。
如果 TFS 用於原始程式碼控制項,您會想要安裝 Team Explorer Everywhere。 Team Explorer Everywhere 可在 macOS 中的終端機提供 TFS 的跨平臺存取。
防火牆組態
為了讓測試提交至 Xamarin Test Cloud,提交測試的計算機必須能夠與測試雲端伺服器通訊。 防火牆必須設定為允許埠 80 和 443 上位於 testcloud.xamarin.com 的伺服器之間的網路流量。 此端點由 DNS 管理,IP 位址可能會變更。
在某些情況下,測試(或執行測試的裝置)必須與受防火牆保護的網頁伺服器通訊。 在此案例中,防火牆必須設定為允許來自下列IP位址的流量:
- 195.249.159.238
- 195.249.159.239
安裝 Jenkins
使用 Jenkins 的第一個工作是安裝它。 在 OS X 上執行 Jenkins 的方式有三種:
- 身為精靈,在背景中執行。
- 在 servlet 容器內,例如 Tomcat、Jetty 或 JBoss。
- 作為在用戶帳戶下執行的一般程式。
大部分的傳統持續整合應用程式會在背景執行,無論是作為精靈(在OS X或 *nix上),還是以服務的形式執行(在 Windows 上)。 這適用於不需要 GUI 互動的案例,以及可以輕鬆地執行建置環境的設定。 行動裝置應用程式也需要金鑰存放區和簽署憑證,當 Jenkins 以精靈身分執行時存取可能會有問題。 基於這些考慮,本檔著重於第三個案例 –在組建伺服器上的用戶帳戶下執行 Jenkins。
Jenkins.App 是安裝 Jenkins 的便利方式。 這是可簡化 Jenkins 伺服器的啟動和停止的 AppleScript 包裝函式。 Jenkins 不是在Bash殼層中執行,而是以在Dock中具有圖標的應用程式執行,如下列螢幕快照所示:
啟動或停止 Jenkins 就像啟動或停止 Jenkins.App 一樣簡單。
若要安裝 Jenkins.App,請從專案的下載頁面下載最新版本,如下圖所示:
將 zip 檔案解壓縮到 /Applications
組建伺服器上的資料夾,並像任何其他 OS X 應用程式一樣啟動它。
第一次啟動 Jenkins.App 時,它會顯示一個對話方塊,告知您將下載 Jenkins:
一旦 Jenkins.App 完成下載,它會顯示另一個對話框,詢問您是否要自定義 Jenkins 啟動,如下列螢幕快照所示:
自定義 Jenkins 是選擇性的,而且不需要在每次啟動應用程式時執行 – Jenkins 的預設設定適用於大部分情況。
如果需要自定義 Jenkins,請按兩下 [ 變更預設值 ] 按鈕。 這會顯示兩個連續對話框:一個要求Java命令行參數,另一個要求 Jenkins 命令行參數。 下列兩個螢幕快照顯示這兩個對話框:
執行 Jenkins 之後,您可能會想要將它設定為登入專案,以便在每次使用者登入電腦時啟動它。 您可以用滑鼠右鍵按下 Dock 中的 Jenkins 圖示,然後選擇 [ 選項...] 來執行此動作。 > 在 [登入] 開啟,如下列螢幕快照所示:
這會導致每次使用者登入時自動啟動 Jenkins.App,但不會在電腦開機時啟動。 您可以指定 OS X 在開機時用來自動登入的使用者帳戶。 開啟 [ 系統喜好設定],然後選取 [使用者和群組 ] 圖示,如下列螢幕快照所示:
按兩下 [ 登入選項 ] 按鈕,然後選擇OS X將在開機時用來登入的帳戶。
此時已安裝 Jenkins。 不過,如果我們想要建置 Xamarin 行動應用程式,則必須安裝一些外掛程式。
安裝外掛程式
當 Jenkins.App 安裝程式完成時,它會啟動 Jenkins 並使用 URL http://localhost:8080啟動網頁瀏覽器,如下列螢幕快照所示:
從此頁面,從左上角的功能表中選取 [Jenkins 管理 Jenkins >> 管理外掛程式 ],如下列螢幕快照所示:
這會顯示 Jenkins 外掛程式管理員 頁面。 如果您按下 [可用] 索引標籤,您會看到可下載並安裝超過 600 個外掛程式的清單。 下圖顯示於下列螢幕快照中:
捲動所有 600 個外掛程式來尋找一些可能很乏味且容易出錯。 Jenkins 會在介面右上角提供篩選搜尋欄位。 使用此 [篩選] 字段來搜尋,可簡化尋找並安裝下列其中一個或所有外掛程式:
- Jenkins MSBuild 外掛程式 – 此外掛程式 可讓您建置 Visual Studio 和 Visual Studio for Mac 解決方案 (.sln) 和專案 (.csproj)。
- 環境插入器外掛程式 – 這是選擇性但實用的外掛程式,可讓您在作業和建置層級設定環境變數。 它也為變數提供額外的保護,例如用來撰寫程式代碼簽署應用程式的密碼。 它有時縮寫為 EnvInject 外掛程式 。
- Team Foundation Server 外掛程式 – 這是選擇性的外掛程式,只有在您使用 Team Foundation Server 或 Team Foundation Services 進行原始程式碼控制時才需要。
Jenkins 支援 Git,而不需要任何額外的外掛程式。
安裝所有外掛程式之後,您會想要重新啟動 Jenkins,並設定每個外掛程式的全域設定。 從左上角選取 [Jenkins 管理 Jenkins >> 設定系統 ],即可找到外掛程式的全域設定,如下列螢幕快照所示:
當您選取此功能表選項時,系統會帶您前往 [ 設定系統 [Jenkins] 頁面。 此頁面包含設定 Jenkins 本身的區段,以及設定某些全域外掛程式值。 下列螢幕快照說明此頁面的範例:
設定 MSBuild 外掛程式
MSBuild 外掛程式必須設定為使用 /Library/Frameworks/Mono.framework/Commands/xbuild 來編譯 Visual Studio for Mac 方案和項目檔。 向下卷動 [ 設定系統 [Jenkins] 頁面,直到 [新增 MSBuild ] 按鈕出現為止,如下列螢幕快照所示:
按下此按鈕,並在出現的窗體上填寫 [MSBuild 的名稱] 和 [路徑] 字段。 MSBuild 安裝的名稱應該是有意義的,而 MSBuild 的路徑應該是 的路徑xbuild
,通常是 /Library/Frameworks/Mono.framework/Commands/xbuild。 按兩下頁面底部的 [儲存] 或 [套用] 按鈕來儲存變更之後,Jenkins 將能夠用來 xbuild
編譯您的解決方案。
設定 TFS 外掛程式
如果您想要將 TFS 用於原始程式碼控制項,則必須使用本節。
為了讓 macOS 工作站與 TFS 伺服器互動, 必須在工作站上安裝 Team Explorer Everywhere 。 Team Explorer Everywhere 是一組來自 Microsoft 的工具,其中包含用於存取 TFS 的跨平臺命令行用戶端。 Team Explorer Everywhere 可以從 Microsoft 下載,並安裝三個步驟:
將封存盤案解壓縮到用戶帳戶可存取的目錄。 例如,您可以將檔案解壓縮到 ~/tee。
設定殼層或系統路徑,以包含保存上述步驟一中解壓縮之檔案的資料夾。 例如,
echo export PATH~/tee/:$PATH' >> ~/.bash_profile
若要確認已安裝 Team Explorer Everywhere,請開啟終端機會話,然後執行
tf
命令。 如果 tf 已正確設定,您會在終端機會話中看到下列輸出:$ tf Team Explorer Everywhere Command Line Client (version 11.0.0.201306181526) Available commands and their options:
安裝 TFS 的命令行客戶端之後,Jenkins 必須設定命令行用戶端的完整路徑 tf
。 向下捲動 [ 設定系統 [Jenkins] 頁面,直到您找到 Team Foundation Server 區段,如下列螢幕快照所示:
輸入命令的完整路徑 tf
,然後按下 [ 儲存] 按鈕。
設定 Jenkins 安全性
第一次安裝時,Jenkins 已停用安全性,因此任何使用者都有可能以匿名方式設定和執行任何類型的作業。 本節說明如何使用 Jenkins 使用者資料庫來設定驗證和授權的安全性。
選取 [Jenkins 管理 Jenkins >> 設定全域安全性],即可找到安全性設定,如下列螢幕快照所示:
在 [設定全域安全性] 頁面上,核取 [啟用安全性] 複選框,並顯示 存取控制 窗體,類似下一個螢幕快照:
在 [安全性領域] 區段中切換 Jenkins 自己的使用者資料庫單選按鈕,並確定也已核取 [允許使用者註冊],如下列螢幕快照所示:
最後,重新啟動 Jenkins 並建立新的帳戶。 第一個建立的帳戶是根帳戶,而且此帳戶會自動升階為系統管理員。 流覽回 [ 設定全域安全性] 頁面,然後核取 [矩陣式安全性 ] 單選按鈕。 根帳戶應授與完整存取權,且匿名帳戶應提供只讀存取權,如下列螢幕快照所示:
儲存這些設定並重新啟動 Jenkins 之後,就會開啟安全性。
停用安全性
如果忘記密碼或 Jenkins 全鎖定,您可以遵循下列步驟來停用安全性:
停止 Jenkins。 如果您使用 Jenkins.app,您可以用滑鼠右鍵按兩下 Dock 中的 Jenkins.App 圖示,然後從快顯的功能表中選取 [結束] 來執行此動作:
在文本編輯器中開啟 ~/.jenkins/config.xml檔案。
將項目的值
<usesecurity></usesecurity>
從true
變更為false
。<authorizationstrategy></authorizationstrategy>
從檔案中刪除和<securityrealm></securityrealm>
專案。重新啟動 Jenkins。
設定作業
在最上層,Jenkins 會組織建置軟體到 作業所需的所有工作。 作業也有與其相關聯的元數據,提供組建的相關信息,例如如何取得原始程式碼、建置應該執行的頻率、建置所需的任何特殊變數,以及如何在建置失敗時通知開發人員。
從右上角的功能表中選取 [Jenkins > 新增作業] 來建立作業 ,如下列螢幕快照所示:
這會顯示 [ Jenkins] 新增作業頁面。 輸入作業的名稱,然後選取 [建置自由樣式的軟體專案] 單選按鈕。 下列螢幕快照顯示此範例:
按兩下 [ 確定] 按鈕會顯示作業的組態頁面。 這應該類似下列螢幕快照:
Jenkins 會在位於下列路徑的硬碟目錄中組織作業: ~/.jenkins/jobs/[JOB NAME]
此資料夾包含作業特有的所有檔案和成品,例如記錄檔、組態檔,以及需要編譯的原始程式碼。
建立初始作業之後,必須設定下列一或多個作業:
- 必須指定原始程式碼管理系統。
- 您必須將一或多個 建置動作 新增至專案。 這些是建置應用程式所需的步驟或工作。
- 作業必須指派一個 組建觸發程式 – 一組指示通知 Jenkins 如何擷取程式碼並建置最終專案。
設定原始程式碼控制件
Jenkins 的第一項工作是從原始程式碼管理系統擷取原始程式碼。 Jenkins 支援許多目前可用的熱門原始程式碼管理系統。 本節涵蓋兩個熱門系統:Git 和 Team Foundation Server。 下列各節會更詳細地討論這些原始程式碼管理系統。
使用 Git 進行原始程式碼控制
如果您使用 TFS 進行原始程式碼控制項, 請略過 本節,然後使用 TFS 繼續進行下一節。
Jenkins 支持現用 Git – 不需要額外的外掛程式。 若要使用 Git,請按兩下 [Git ] 單選按鈕,然後輸入 Git 存放庫的 URL,如下列螢幕快照所示:
儲存變更之後,Git 組態就會完成。
使用 TFS 進行原始程式碼管理
本節僅適用於 TFS 使用者。
按兩下 [Team Foundation Server] 單選按鈕,應該會出現 [TFS 組態] 區段,類似於下列螢幕快照中的內容:
提供TFS的必要資訊。 下列螢幕快照顯示已完成表單的範例:
測試原始程式碼控制項元件元件
設定適當的原始程式碼控制件之後,按兩下 [ 儲存 ] 以儲存變更。 這會將您返回作業的首頁,其類似下列螢幕快照:
驗證原始程式碼控制項已正確設定的最簡單方式是手動觸發組建,即使沒有指定的建置動作也一樣。 若要手動啟動組建,作業的首頁在左側功能表中有 [ 立即建 置] 連結,如下列螢幕快照所示:
建置啟動時,[建置歷程記錄] 對話框會顯示閃爍的藍色圓圈、進度列、組建編號,以及組建啟動的時間,類似於下列螢幕快照:
如果作業成功,則會顯示藍色圓圈。 如果作業失敗,則會顯示紅色圓圈。
為了協助針對建置時可能發生的問題進行疑難解答,Jenkins 會擷取作業的所有控制台輸出。 若要查看主控台輸出,請按下 [建置歷程記錄] 中的作業,然後在左側功能表中的 [控制台輸出] 連結上。 下列螢幕快照顯示 主控台輸出 連結,以及成功作業的一些輸出:
組建成品的位置
Jenkins 會將整個原始程式碼擷取到稱為 工作區的特殊資料夾中。 您可以在位於下列位置的資料夾內找到此目錄:
~/.jenkins/jobs/[JOB NAME]/workspace
工作區的路徑會儲存在名為 $WORKSPACE
的環境變數中。
您可以瀏覽至作業的登陸頁面,然後按下 左側功能表中的 [工作區 ] 連結,以流覽 Jenkins 中的工作區資料夾。 下列螢幕快照顯示名為 HelloWorld 之作業的工作區範例:
組建觸發程式
在 Jenkins 中起始組建有數種不同的策略 – 這些稱為 建置觸發程式。 建置觸發程式可協助 Jenkins 決定何時啟動作業並建置專案。 其中兩個較常見的組建觸發程式如下:
- 定期 建置 – 此觸發程式會讓 Jenkins 依指定的間隔啟動作業,例如每兩小時或工作日午夜一次。 不論原始程式碼存放庫中是否有任何變更,組建都會啟動。
- 輪詢 SCM – 此觸發程式會定期輪詢原始程式碼控制件。 如果已認可原始程式碼存放庫的任何變更,Jenkins 將會啟動新的組建。
輪詢 SCM 是熱門的觸發程式,因為它會在開發人員認可導致組建中斷的變更時提供快速的意見反應。 這適用於警示小組,某些最近認可的程式代碼會造成問題,並讓開發人員在變更仍然剛好的時候解決問題。
定期組建通常用來建立可散發給測試人員的應用程式版本。 例如,定期組建可能會排程為星期五晚上,讓 QA 小組的成員可以測試前一周的工作。
編譯 Xamarin.iOS 應用程式
您可以使用 或 msbuild
,在命令行xbuild
編譯 Xamarin.iOS 專案。 殼層命令將會在執行 Jenkins 的用戶帳戶內容中執行。 請務必讓使用者帳戶能夠存取佈建配置檔,以便正確封裝應用程式以供散發。 可以將這個殼層命令新增至作業組態頁面。
向下捲動至 [建置 ] 區段。 按兩下 [ 新增建置步驟 ] 按鈕,然後選取 [ 執行殼層],如下列螢幕快照所示:
下列命令行可指定 i SOLUTION_FILE.sln解決方案的發行組建 電話。 您可以在命令列上指定 IpaPackageDir
屬性來設定 IPA 的位置:
在 Mac 上使用 xbuild:
xbuild /p:Configuration="Release" \ /p:Platform="iPhone" \ /p:IpaPackageDir="$HOME/Builds" \ /t:Build MyProject.sln
xbuild 命令通常位於 /Library/Frameworks/Mono.framework/Commands 目錄中。
在 Windows 上使用 msbuild:
msbuild /p:Configuration="Release" /p:Platform="iPhone" /p:IpaPackageDir="%USERPROFILE%\Builds" /p:ServerAddress="192.168.1.3" /p:ServerUser="macuser" /t:Build MyProject.sln
msbuild 不會自動展開 $( )
命令行傳入的表達式。 基於這個理由,建議您在命令行設定 IpaPackageDir
時使用完整路徑。
如需屬性的詳細資訊IpaPackageDir
,請參閱 iOS 9.8 的版本資訊。
建置 Xamarin.Android 專案
建置 Xamarin.Android 專案的概念與建置 Xamarin.iOS 專案非常類似。 若要從 Xamarin.Android 專案建立 APK,必須設定 Jenkins 以執行下列兩個步驟:
- 使用 MSBuild 外掛程式編譯專案
- 簽署並壓縮 APK 與有效的發行金鑰存放區。
在接下來的兩節中,將更詳細地討論這兩個步驟。
建立 APK
單擊 [ 新增建置步驟 ] 按鈕,然後選取 [使用 MSBuild 建置 Visual Studio 專案或方案],如下列螢幕快照所示:
將建置步驟新增至項目之後,請填入出現的表單域。 下列螢幕快照是已完成表單的其中一個範例:
此建置步驟會在 $WORKSPACE資料夾中執行。xbuild
MSBuild 建置檔案會設定為 Xamarin.Android.csproj 檔案。 命令行自變數會指定目標 PackageForAndroid 的版本組建。 此步驟的產品將是位於下列位置的 APK:
$WORKSPACE/[PROJECT NAME]/bin/Release
下列螢幕快照顯示此 APK 的範例:
此 APK 尚未準備好進行部署,因為它尚未使用私鑰存放區簽署,且必須對齊 zip。
簽署和壓縮 APK 以供發行
簽署和壓縮 APK 在技術上是兩個不同的工作,由兩個不同的命令行工具從 Android SDK 執行。 不過,在一個建置動作中執行它們會很方便。 如需簽署和壓縮 APK 的詳細資訊,請參閱 Xamarin 關於準備 Android 應用程式以發行的檔。
這兩個命令都需要命令行參數,這些參數可能會因項目而異。 此外,其中一些命令行參數是組建執行時不應出現在主控台輸出中的密碼。 我們會將其中一些命令行參數儲存在環境變數中。 下表說明簽署和/或 zip 對齊所需的環境變數:
環境變數 | 描述 |
---|---|
KEYSTORE_FILE | 這是用來簽署 APK 之金鑰存放區的路徑 |
KEYSTORE_ALIAS | 金鑰存放區中將用來簽署 APK 的金鑰。 |
INPUT_APK | 由建立的 xbuild APK。 |
SIGNED_APK | 所產生的 jarsigner 已簽署 APK。 |
FINAL_APK | 這是 由 zipalign 產生的 ZIP 對齊 APK。 |
STORE_PASS | 這是用來存取金鑰存放區內容來唱檔案的密碼。 |
如需求一節所述,您可以使用 EnvInject 外掛程式在建置期間設定這些環境變數。 作業應該會根據插入環境變數新增新的建置步驟,如下一個螢幕快照所示:
在出現的 [ 屬性內容 ] 表單欄位中,會以下列格式新增環境變數,每行一個:
ENVIRONMENT_VARIABLE_NAME = value
下列螢幕快照顯示簽署 APK 所需的環境變數:
請注意,APK 檔案的某些環境變數建置在環境變數上 WORKSPACE
。
最後一個環境變數是存取金鑰存放區內容的密碼: STORE_PASS
。 密碼是應該在記錄檔中遮蔽或省略的敏感性值。 EnvInject 外掛程式可以設定為保護這些值,使其不會顯示在記錄中。
作業組態的 [建置] 區段緊接在 [建置環境] 區段之前。 切換 [ 插入密碼 ] 複選框時,會出現一些表單域。 這些表單域可用來擷取環境變數的名稱和值。 下列螢幕快照是新增 STORE_PASS
環境變數的範例:
一旦環境變數初始化之後,下一個步驟是新增建置步驟來簽署和壓縮 APK。 緊接在建置步驟插入環境變數之後,將會是另一個將執行 jarsigner
和zipalign
的 Execute Shell 命令組建。 每個命令都會佔用一行,如下列代碼段所示:
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore $KEYSTORE_FILE -storepass $STORE_PASS -signedjar $SIGNED_APK $INPUT_APK $KEYSTORE_ALIAS
zipalign -f -v 4 $SIGNED_APK $FINAL_APK
下列螢幕快照顯示如何在步驟中輸入 jarsigner
和 zipalign
命令的範例:
一旦所有建置動作都就緒,最好觸發手動建置來確認一切正常運作。 如果組建失敗, 應該檢閱控制台輸出 ,以取得造成組建失敗的原因資訊。
將測試提交至測試雲端
您可以使用Shell命令將自動化測試提交至測試雲端。 如需在 Xamarin Test Cloud 中設定測試回合的詳細資訊,請參閱準備 Xamarin.Android 應用程式和準備 Xamarin.iOS 應用程式。
摘要
在本指南中,我們將 Jenkins 介紹為 macOS 上的組建伺服器,並將其設定為編譯和準備 Xamarin 行動應用程式以供發行。 我們在 macOS 電腦上安裝 Jenkins 以及數個外掛程式來支援建置程式。 我們已建立並設定作業,該作業會從TFS或 Git 提取程式碼,然後將該程式代碼編譯成已準備好發行的應用程式。 我們也探索了兩種不同的方式來排程應該執行作業的時間。