前提
本項(xiàng)目在配置jenkins前已配置安裝fastlane并自動(dòng)上傳蒲公英,關(guān)于fastlane的使用不在本文討論范圍之內(nèi)。
安裝Jenkins
jenkins有幾種方式安裝,一種是去官網(wǎng)下載dmg安裝包(還可以下載.war文件,通過執(zhí)行命令java -jar jenkins.war安裝),這也是我最先選擇的方式,然而此種方式安裝確有一些很明顯的坑
- 輸入初始密碼需要前往
/Users/Shared/Jenkins/Home/這個(gè)目錄下,非Jenkins用戶需要給/secrets/增加讀權(quán)限,然后找到initialAdminPassword文件,打開復(fù)制出密碼,在初次登入http://localhost:8080時(shí)使用 - 上面的還只是小問題,最大的問題來了。本人正確配置項(xiàng)目后,通過git拉取代碼時(shí)總是出現(xiàn)timeout超時(shí)問題,查詢了一堆資料,比如增加超時(shí)時(shí)間,只拷貝最近一次的代碼
git fetch --tags --progress time out.png
然而,并沒有什么luan用,通過40+次構(gòu)建失敗,讓我認(rèn)識(shí)到此法不通,于是卸載重裝
安裝包卸載路徑:/Library/Application Support/Jenkins/Uninstall.command
brew方式卸載方法:brew uninstall jenkins
推薦的安裝方式是通過homebrew安裝,此方案安裝后以上問題不再出現(xiàn),其安裝目錄為/Users/當(dāng)前用戶/.jenkins,隱藏文件需使用命令command+shift+.顯示
安裝命令: brew install jenkins
你可能需要了解這些gem、brew、rvm、bundle的相關(guān)介紹

如果出現(xiàn)以上問題,說明brew版本不匹配,可以執(zhí)行
brew --version命令會(huì)自動(dòng)更新到最新版本
順利的執(zhí)行完brew install jenkins,結(jié)果發(fā)現(xiàn)安裝的是2.68版本,根據(jù)提示命令更新到新版2.101
啟動(dòng)Jenkins
執(zhí)行命令jenkins,瀏覽器打開http://localhost:8080 web頁面,粘貼所獲的的初始密碼

插件plugin
我只安裝了社區(qū)推薦的插件(安裝時(shí)建議翻墻),可選插件Xcode integration
與其他文章不同的是,Keychains and Provisioning Profiles Management這個(gè)插件我并沒有選擇安裝,原因是這些東西我已經(jīng)通過fastlane在腳本配置里,無需再另行上傳證書及相關(guān)設(shè)置
如果插件安裝失敗,可前往http://localhost:8080/pluginManager/available更新插件
系統(tǒng)設(shè)置
GitHub設(shè)置
如果項(xiàng)目是GitHub私有項(xiàng)目,或是使用github輪詢,需要添加GitHub Server及許可證

github需要授權(quán)才能使用相關(guān)api,access tokens可在 Settings->Developer settings->Personal access tokens里管理

配置郵件地址

這個(gè)警告??我是保留的,如果修改為本地127.0.0.1會(huì)提示反向代理設(shè)置有誤
由于本機(jī)沒有公網(wǎng)ip,所以導(dǎo)致git輪詢的方式會(huì)不可用,在此記錄一下

Default Content:
(本郵件是 Jenkins 服務(wù)端構(gòu)建完畢后自動(dòng)發(fā)送,請(qǐng)勿回復(fù))<br/><hr/>
項(xiàng)目名稱:$PROJECT_NAME<br/>
Git版本號(hào):$GIT_REVISION<br/>
觸發(fā)原因:$CAUSE<br/>
構(gòu)建編號(hào):# $BUILD_NUMBER<br/>
構(gòu)建狀態(tài):$BUILD_STATUS<br/>
構(gòu)建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/>
構(gòu)建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/>
本次構(gòu)建變化:$CHANGES_SINCE_LAST_SUCCESS<br/>

如果出現(xiàn)Failed to send out email javax.mail.AuthenticationFailedException: 535 Error: authentication failed, system busy錯(cuò)誤,在確保郵箱已開啟SMTP服務(wù)情況下,請(qǐng)保證Extended E-mail Notification與郵件通知兩者的配置是一致的,并檢查密碼。
如果提示501錯(cuò)誤,這是因?yàn)槟愕南到y(tǒng)管理員地址與授權(quán)的賬號(hào)地址不是同一個(gè),需要保持一致。
添加項(xiàng)目地址
私有項(xiàng)目如果報(bào)權(quán)限問題,最好在本機(jī)生成SSH Key,這時(shí)你需要去~/.ssh/id_rsa文件里拿取私鑰信息,然后加到Global Credentials中即可。
構(gòu)建Job
通過github構(gòu)建項(xiàng)并添加源碼管理

當(dāng)然你也可以選擇Build periodically或Poll SCM方式
- Build periodically:周期構(gòu)建,它不關(guān)心源碼是否變化
-
Poll SCM:定時(shí)檢查源碼變更,如果有更新就checkout最新code下來,然后執(zhí)行構(gòu)建動(dòng)作
* * * * *
第一個(gè)*表示分鐘,取值0~59
第二個(gè)*表示小時(shí),取值0~23
第三個(gè)*表示一個(gè)月的第幾天,取值1~31
第四個(gè)*表示第幾月,取值1~12
第五個(gè)*表示一周中的第幾天,取值0~7,其中0和7代表的都是周日
fastlane腳本
fastlane項(xiàng)目地址:https://github.com/fastlane/fastlane
fastlane相關(guān)文檔:docs.fastlane.tools
你可以直接使用
IPANAME="jinkens-myapp"
fastlane gym --export_method ad-hoc --output_name ${IPANAME}
來指定打包方式(蒲公英文檔),也可以手動(dòng)配置,以下是我fastlane關(guān)于pgy這個(gè)action的代碼(我的fastlane已通過match自動(dòng)配置證書,關(guān)于這個(gè)命令的使用可以查看fastlane match命令)
desc "Submit a new Beta Build to Pgy"
lane :pgy do
match(type: "adhoc", app_identifier: "com.xxxxxx.ios", readonly: true)
gym(
scheme: "xxx",
silent: true, # 是否隱藏打包時(shí)不需要的信息
configuration: 'Debug', # 指定打包時(shí)的配置項(xiàng),默認(rèn)為Release
export_method: "ad-hoc", # 指定導(dǎo)出.ipa時(shí)使用的方法,可用選項(xiàng):app-store, ad-hoc, package, enterprise, development, developer-id
export_options: {
provisioningProfiles: {
"com.xxxxxx.ios" => "match AdHoc com.xxxxxx.ios"
}
}
)
pgyer(api_key: "xxxxxxxxxxxxxxxx", user_key: "xxxxxxxxxxxxxxxxxxx")
end
構(gòu)建后壓縮存檔

構(gòu)建后打包并上傳到蒲公英
除了在fastlane安裝蒲公英插件的方式,還可以在jenkins中選擇安裝Upload to pgyer插件


構(gòu)建后上傳fir.im
需要先安裝fir-plugin插件

構(gòu)建后添加郵件通知

點(diǎn)開高級(jí)設(shè)置
Advanced settings...,根據(jù)構(gòu)建狀態(tài)發(fā)信
執(zhí)行Job
點(diǎn)擊“立即構(gòu)建”,未加入 fastlane相關(guān)控制臺(tái)輸出如下:

Share Scheme
以為這就完了嗎?我還真以為這樣就搞定了-_-
執(zhí)行fastlane pgy構(gòu)建失??!CI下如果使用了workspace,你需要顯式的指定一個(gè)scheme:
Couldn't find specified scheme 'xxx'.?
Multiple schemes found but you haven't specified one.?
Since this is a CI, please pass one using the `scheme` option?
Couldn't find any schemes in this project, make sure that the scheme is shared if you are using a workspace?
Open Xcode, click on `Manage Schemes` and check the `Shared` box for the schemes you want to use?
Afterwards make sure to commit the changes into version control?
以前在本地運(yùn)行可沒這情況,趕緊按其解決辦法在Manage Schemes中將Shared勾選??

別忘了將相關(guān)設(shè)置上傳,以下是我參考[iOS] gitignore 忽略上傳pods/cocoaPods 文件修改過的.gitignore文件內(nèi)容
# Xcode
.DS_Store
*/build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
!xcshareddata
profile
*.moved-aside
DerivedData
.idea/
*.hmap
*.xccheckout
*.xcworkspace
*.xcuserstate
!default.xcworkspace
#CocoaPods
Pods
!Podfile
!Podfile.lock
#Fastlane
!fastlane
!Gemfile
!Gemfile.lock
*.ipa
*.app.dSYM.zip
最大的坑
以上所有講的都是在本地運(yùn)行自動(dòng)化構(gòu)建,配置低的小伙伴不高興了,打包??炒雞卡,于是將項(xiàng)目部署到服務(wù)器上了
然而問題來了,我在服務(wù)器上運(yùn)行時(shí)發(fā)現(xiàn)構(gòu)建無法成功,提示pod: command not found,于是google了一堆資料,多種方式都沒解決,才想到是Linux服務(wù)器并沒有配置相關(guān)的環(huán)境,當(dāng)然不支持brew、rvm、gem、pod、bundle、fastlane這些命令啦,查詢stackoverflow告訴我

蛤?相關(guān)的命令行工具只能在Mac環(huán)境運(yùn)行?

所以你需要一臺(tái)Mac服務(wù)器!
故而我現(xiàn)在本地只能手動(dòng)點(diǎn)構(gòu)建或者是采用定時(shí)構(gòu)建方式,在開機(jī)后自動(dòng)啟用Jenkins
而服務(wù)器端雖然可以hook到git commit log,但是無法通過以上腳本運(yùn)行,干脆就作為郵件發(fā)送器算了??
參考資料
手把手教你利用Jenkins持續(xù)集成iOS項(xiàng)目
利用 Jenkins 實(shí)現(xiàn) iOS 自動(dòng)化構(gòu)建踩坑記錄
Mac中jenkins的使用——自動(dòng)構(gòu)建
最全Jenkins+SVN+iOS+cocoapods環(huán)境搭建及其錯(cuò)誤匯總
Jenkins的幾個(gè)問題
jenkins 郵件配置展示change信息
Jenkins進(jìn)階系列之——02email-ext郵件通知模板

