Continuous Integration(CI)持續(xù)集成的優(yōu)點
- 簡而言之,它能帶來高效的開發(fā)流程,讓開發(fā)人員從"集成"的人力成本中解放出來
Jenkins工具對于CI的意義
- 如果說CI是一種概念纫谅,那Jenkins就是實現(xiàn)這個概念的比較有力的工具
- 對于移動端開發(fā)而言,持續(xù)集成的最好實踐就是自動化打包測試
- Jenkins在移動端CI上有著以下幾點的優(yōu)勢
- Mac平臺上搭建簡易:iOS自動化打包需要Xcode命令行工具的支持,在Mac平臺上搭建會方便許多益缎,坑也會少很多
- 插件支持友好:對于iOS自動化打包,Jenkins提供足夠多的插件支持
- 自帶日志:Jenkins默認情況下集成日志然想,不需要手動生成
- 默認集成GIT:Jenkins集成的GIT模塊可以方便地對GIT上的代碼進行持續(xù)集成的工作
Jenkins部署
- 從官網(wǎng)jenkins.io/ 上下載最新的pkg安裝包
- 安裝完成后莺奔,打開瀏覽器,輸入http://localhost:8080
- 如果無法打開又沾,則說明Java環(huán)境有問題弊仪,重新安裝最新的JDK即可
-
出現(xiàn)以下界面說明Jenkins已經(jīng)被正確地啟動服務(wù)
-
按照提示,在Finder中定位到文件夾杖刷,右鍵選擇“顯示簡介”励饵,設(shè)置權(quán)限
- 權(quán)限設(shè)置完畢后,進入文件夾打開initialAdminPassword就能找到密碼滑燃,復(fù)制并填寫到Jenkins服務(wù)的網(wǎng)頁(http://localhost:8080)中并繼續(xù)
- 初始化設(shè)置役听,按照默認的就好了,繼續(xù)
- 創(chuàng)建用戶,然后點擊“保存并完成”
- 插件安裝(系統(tǒng)管理->管理插件->可選插件)
- GitLab Plugin(可選典予,如果代碼是部署到GitLab環(huán)境的話安裝)
- Gitlab Hook Plugin(可選甜滨,如果代碼是部署到GitLab環(huán)境的話安裝)
-
Xcode integration(可選,如果不想寫腳本執(zhí)行打包的選擇這個作為替代)注意:目前發(fā)現(xiàn)新版本的MAC系統(tǒng)(10.13)和Xcode9默認是不允許訪問鑰匙串的瘤袖,所以建議都用腳本打包 - Keychains and Provisioning Profiles Management(如果使用腳本執(zhí)行打包衣摩,則需要安裝該插件來管理鑰匙串和證書)
信息配置
- 鑰匙串和證書
- 使用Jenkins部署自動化打包環(huán)境總的來說是比較友好而且快速的,如果說有坑捂敌,那最主要的坑來源就在證書和鑰匙串準備這一環(huán)節(jié)
- Jenkins在Mac環(huán)境下是通過獨立用戶來做到文件系統(tǒng)層面上的相對獨立艾扮,總所周知,打包iOS的iPA包是需要本機環(huán)境擁有簽名數(shù)字證書(Certificate)和描述文件(Provisioning profile)的占婉,由于環(huán)境的獨立性泡嘴,需要在Jenkins所在的環(huán)境內(nèi)放置/安裝這些內(nèi)容
- 以下是在Jenkins配置簽名數(shù)字證書(Certificate)和描述文件(Provisioning profile)的可能是最保險的實現(xiàn)方式
- 在Jenkins Dashborad(Jenkins首頁)下,點擊“系統(tǒng)管理”—>“系統(tǒng)設(shè)置”逆济,滾動找到Xcode Builder這一個fragment
-
上圖所示酌予,Keychain path的默認值如圖,可以指定一個路徑(最好是Jenkins用戶文件夾下的路徑奖慌,以防訪問權(quán)限問題)抛虫,這里直接在該默認路徑下使用Finder創(chuàng)建對應(yīng)的文件夾,并把/Users/用戶名/Library/Keychains/login.keychain復(fù)制進該文件夾简僧,如果鑰匙串文件有密碼莱褒,記得填上
-
最重要的一步,雙擊復(fù)制之后的login.keychain涎劈,進入到“鑰匙串訪問”广凸,看看里面的簽名數(shù)字證書是否正確的(如果你主機的證書變動過,復(fù)制之后的login.keychain不一定是跟主機的login.keychain一樣蛛枚,所以要打開確認一下谅海,原因是實際上證書的完整內(nèi)容是保存login.keychain-db里面,login.keychain和login.keychain-db的信息不一定完全對等)蹦浦,如果不正確扭吁,就需要把缺失的證書補全,調(diào)整完之后可以在鑰匙串訪問中刪除該登錄鑰匙串的引用
- 在Jenkins Dashborad(Jenkins首頁)下,點擊“系統(tǒng)管理”—>“系統(tǒng)設(shè)置”逆济,滾動找到Xcode Builder這一個fragment
- 命令行打包配置:Keychains and Provisioning Profiles Management
- 如果使用命令行打包盲镶,則需要額外配置鑰匙串和配置文件
-
設(shè)置位置:Jenkins Dashborad(Jenkins首頁)-> 系統(tǒng)管理 -> Keychains and Provisioning Profiles Management
- 設(shè)置域名驗證(以GitLab為例侥袜,GitHub也大同小異)
- Jenkins Dashborad(Jenkins首頁)-> Credentials
- 這里可以選擇兩種添加方式:全局證書 & 域名證書
-
顧名思義:全局證書就是全局都能使用的證書,域名證書則是指定域名才能使用的證書
-
這里以域名證書為例溉贿,設(shè)置GitLab SSH(為什么不用HTTP枫吧,因為Jenkins的HTTP連接方式可能會無法連上,而且SSH可以繞過Nginx的文件上傳大小限制宇色,總之用SSH的坑會少一些)
- PS: 如果經(jīng)過以上步驟仍然出現(xiàn)因為證書而無法打包成功的情況九杂,可以把證書安裝到“鑰匙串訪問”-“系統(tǒng)”里(原來一般都會把證書安裝到“鑰匙串訪問”-“登錄”里面)
構(gòu)建項目
-
Jenkins Dashborad(Jenkins首頁)點擊“新建”
-
新建項目界面颁湖,按照提示填寫并繼續(xù)
-
配置項目(這里以執(zhí)行腳本打包的方法為例)
-
編寫執(zhí)行的腳本
- 本人比較推薦使用腳本的方式進行打包,而不是使用Jenkins的Xcode integration例隆,因為使用腳本比較靈活而且可復(fù)用
- 腳本核心邏輯:清理工程 -> 歸檔工程 -> 導(dǎo)出ipa -> 驗證ipa -> 上傳ipa
- 核心邏輯對應(yīng)的腳本代碼(以使用cocoapod的iOS項目為例):
- 重要參數(shù)解析:
CODE_SIGN_IDENTITY:簽名證書的名字甥捺,格式--"iPhone Distribution: Shanghai ******* Co., Ltd.(*****)"
-
PROVISIONING_PROFILE:配置文件的UUID,獲取方式--Jenkins Dashborad(Jenkins首頁)-> 系統(tǒng)管理 -> Keychains and Provisioning Profiles Management
-exportOptionsPlist:這是導(dǎo)出選項的plist文件的路徑镀层,該plist文件的簡單示例如下镰禾,具體解釋可以在命令行中輸入xcodebuild -help查看
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>method</key> <string>app-store</string> <key>teamID</key> <string>開發(fā)小組ID</string> </dict> </plist>
- altool路徑:這其實就是ipa上傳工具Application Loader的命令行工具,一般地址位于/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool
- 清理工程:xcodebuild -workspace <工作區(qū)間名字.xcworkspace> -scheme <scheme名字唱逢,一般為工程名字> -configuration <Release或者Debug> clean
- 歸檔工程:xcodebuild archive -workspace <工作區(qū)間名字.xcworkspace> -scheme <scheme名字羡微,一般為工程名字> -archivePath <歸檔路徑> -configuration <Release或者Debug> CODE_SIGN_IDENTITY=<簽名證書的完整名字> PROVISIONING_PROFILE=<配置文件的UUID>
- 導(dǎo)出ipa:xcodebuild -exportArchive -archivePath <歸檔路徑> -exportPath <導(dǎo)出ipa路徑> -exportOptionsPlist <導(dǎo)出選項的plist文件>
- 驗證ipa:<altool路徑> --validate-app -f <驗證ipa的完整路徑> -u <appleID賬號名> -p <appleID密碼> -t <平臺名,ios> --output-format <輸出日志的格式normal或者xml>
- 上傳ipa:<altool路徑> --upload-app -f <驗證ipa的完整路徑> -u <appleID賬號名> -p <appleID密碼> -t <平臺名惶我,ios> --output-format <輸出日志的格式normal或者xml>
- 重要參數(shù)解析: