jenkins+fastlane+git+cocoapods實(shí)現(xiàn)iOS持續(xù)集成踩坑記錄

前提

本項(xiàng)目在配置jenkins前已配置安裝fastlane并自動(dòng)上傳蒲公英,關(guān)于fastlane的使用不在本文討論范圍之內(nèi)。

安裝Jenkins

jenkins有幾種方式安裝,一種是去官網(wǎng)下載dmg安裝包(還可以下載.war文件,通過執(zhí)行命令java -jar jenkins.war安裝),這也是我最先選擇的方式,然而此種方式安裝確有一些很明顯的坑

  1. 輸入初始密碼需要前往/Users/Shared/Jenkins/Home/這個(gè)目錄下,非Jenkins用戶需要給/secrets/增加讀權(quán)限,然后找到initialAdminPassword文件,打開復(fù)制出密碼,在初次登入http://localhost:8080時(shí)使用
  2. 上面的還只是小問題,最大的問題來了。本人正確配置項(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頁面,粘貼所獲的的初始密碼

initialAdminPassword.png

插件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 Server

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


Personal access tokens.png
配置郵件地址

配置系統(tǒng)管理員郵件地址

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

Extended E-mail Notification
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/>
send email success.png

如果出現(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)建后壓縮存檔
Archive the artifacts
構(gòu)建后打包并上傳到蒲公英

除了在fastlane安裝蒲公英插件的方式,還可以在jenkins中選擇安裝Upload to pgyer插件


Upload to pgyer

構(gòu)建后上傳fir.im

需要先安裝fir-plugin插件

Upload to fir.im

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

Editable Email Notification

點(diǎn)開高級(jí)設(shè)置Advanced settings...,根據(jù)構(gòu)建狀態(tài)發(fā)信
Advanced settings

執(zhí)行Job

點(diǎn)擊“立即構(gòu)建”,未加入 fastlane相關(guān)控制臺(tái)輸出如下:


first_log.png

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勾選??

Manage Schemes.png

別忘了將相關(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、podbundle、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郵件通知模板

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容