背景
使用Jenkins
是為了持續(xù)活合、自動(dòng)構(gòu)建項(xiàng)目,持續(xù)集成對(duì)整個(gè)開發(fā)團(tuán)隊(duì)的開發(fā)帶來(lái)諸多好處过椎,可以省去頻繁的集成工作,整體縮短開發(fā)周期戏仓,推動(dòng)整個(gè)開發(fā)疚宇,很大程度提高團(tuán)隊(duì)的工作效率亡鼠。
上家公司就是用Jenkins
工具實(shí)現(xiàn)持續(xù)集成,但是之前是別的同事配置的敷待,這兩天在公司決定自己配置一下间涵,結(jié)果遇到了很多坑,在此記錄一下榜揖。
ps:其實(shí)整個(gè)Jenkins
配置過程還是很簡(jiǎn)單的勾哩,不是什么技術(shù)活,網(wǎng)上詳細(xì)的教程也有很多举哟,所以不多詳細(xì)描述整個(gè)配置過程思劳,而是針對(duì)于我們公司的項(xiàng)目提出幾個(gè)點(diǎn),并分享解決過程妨猩。
一.安裝方式
首先Jenkins
安裝方式網(wǎng)上就有很多聲音潜叛,最開始配置作者是通過安裝包(.dmg)的方式安裝的,一切都很順利壶硅,http://localhost:8080
也直接打開了面板(如果輸入地址打不開面板可能就是Java
環(huán)境出現(xiàn)問題钠导,可以檢查一下,升級(jí)或者重新安裝)森瘪。新建項(xiàng)目之后又遇到了一些問題,在下面會(huì)逐一提到票堵。在工程都完美配置好的前提下(其實(shí)在這之前構(gòu)建過 n 次扼睬,填了很多網(wǎng)上其他用戶遇到的同樣的問題,都比較好解決)悴势,開始構(gòu)建窗宇,結(jié)果剛開始很順利,進(jìn)度條走著走著就報(bào)紅了特纤,打開控制臺(tái)輸出是以下內(nèi)容:
=== BUILD TARGET *** OF PROJECT **** WITH CONFIGURATION ***** ===
Check dependencies
Code Signing Error: No profile for team '**********' matching '********' found: Xcode couldn't find any provisioning profiles matching '**********/********'. Install the profile (by dragging and dropping it onto Xcode's dock item) or select a different one in the General tab of the target editor.
Code Signing Error: Code signing is required for product type 'Application' in SDK 'iOS 11.1'
Code Signing Error: Code signing is required for product type 'Application' in SDK 'iOS 11.1'
Code Signing Error: Code signing is required for product type 'Application' in SDK 'iOS 11.1'
** ARCHIVE FAILED **
這是作者遇到的第一個(gè)大坑军俊,網(wǎng)上同樣的問題也很多,很多人提出解決方法就是將/Users/apple/Library/MobileDevice
下描述文件的文件夾整體移動(dòng)到/User/Shared/Jenkins/Library/MobileDevice
下捧存,結(jié)果作者試了并沒有什么用粪躬,然后又查了很多資料都沒有解決這個(gè)問題,直到看到一個(gè)博客說通過安裝包的方式存在這樣的問題(修改Jenkins
主目錄)昔穴,作者就推翻了安裝包安裝的方式镰官,用homebrew
進(jìn)行安裝,然后安裝完配置Jenkins
后吗货,在面板里添加了工程泳唠,然后構(gòu)建,不幸的是同樣的問題并沒有得到解決宙搬。
其實(shí)作者這里出現(xiàn)這個(gè)問題的根本原因就是Team ID
寫錯(cuò)了笨腥,這個(gè)問題就讓人很頭大了拓哺,我這里一直沒有發(fā)現(xiàn)我填的是證書后面的那串?dāng)?shù)字,這個(gè)操作就是被無(wú)良博主帶歪了脖母,Team ID
應(yīng)該登錄開發(fā)者賬號(hào)去查看士鸥,如圖:
就這樣我解決了這個(gè)大坑,后來(lái)發(fā)現(xiàn)拷貝描述文件到
Jenkins
用戶目錄是正確的操作镶奉。
那么作者就這兩種安裝說一下自己比較直觀的感受:
-
homebrew
安裝會(huì)比安裝包安裝效率要高一些础淤,整個(gè)安裝過程不用怕出現(xiàn)配置問題,包括卸載的時(shí)候會(huì)更方便哨苛。 - 安裝包安裝會(huì)再系統(tǒng)生成一個(gè)
Jenkins
用戶鸽凶,homebrew
安裝則不會(huì)。 - 兩者主目錄路徑會(huì)不同建峭,
homebrew安裝主路徑為:
/Users/Shared/Jenkins/Home
安裝包安裝主路徑為:
~/.jenkins/Home
-
homebrew
安裝開機(jī)后手動(dòng)啟動(dòng) Jenkins 服務(wù)玻侥,安裝包安裝開機(jī)后自動(dòng)啟動(dòng)服務(wù)。當(dāng)然homebrew
也可以通過命令行設(shè)置成開機(jī)自動(dòng)啟動(dòng)服務(wù)亿蒸。 - 其他方面凑兰,比如創(chuàng)建任務(wù)及整個(gè)配置過程兩種安裝方式安裝后都是一樣的,出現(xiàn)報(bào)錯(cuò)不用質(zhì)疑安裝方式有問題边锁。
二.其他報(bào)錯(cuò)
當(dāng)然配置過程還有很多問題姑食,比如:
1)
xcodebuild[33781:175258] [MT] IDEDistribution: Step failed: <IDEDistributionSigningAssetsStep: 0x7fd7dafe7ec0>: Error Domain=IDEDistributionSigningAssetStepErrorDomain Code=0 "Locating signing assets failed." UserInfo={NSLocalizedDescription=Locating signing assets failed., IDEDistributionSigningAssetStepUnderlyingErrors=(
"Error Domain=IDEProvisioningErrorDomain Code=9 \"\"***.app\" requires a provisioning profile with the Push Notifications feature.\" UserInfo={NSLocalizedDescription=\"***.app\" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the \"provisioningProfiles\" dictionary in your Export Options property list.}"
)}
error: exportArchive: "***.app" requires a provisioning profile with the Push Notifications feature.
Error Domain=IDEProvisioningErrorDomain Code=9 ""***.app" requires a provisioning profile with the Push Notifications feature." UserInfo={NSLocalizedDescription="***.app" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}
** EXPORT FAILED **
問題定位之后了解到Xcode
版本在9
以上可能在面板中用Xcode
插件構(gòu)建會(huì)導(dǎo)致這樣的問題螟蒸,導(dǎo)致原因可能是沒有權(quán)限訪問鑰匙串的內(nèi)容笋敞,提供解決方案是放棄Xcode
插件,通過“執(zhí)行 shell”運(yùn)行腳本完成項(xiàng)目構(gòu)建玖喘,如下:
security unlock-keychain -p 開機(jī)密碼(登錄鑰匙串密碼) /Users/用戶名/Library/Keychains/login.keychain
xcodebuild clean -workspace "/Users/Shared/Jenkins/Home/workspace/項(xiàng)目文件夾/項(xiàng)目/項(xiàng)目.xcworkspace" -scheme "默認(rèn)scheme" -configuration "默認(rèn)configuration" -sdk iphoneos11.4
xcodebuild -archivePath "/Users/Shared/Jenkins/Home/workspace/項(xiàng)目文件夾/output/默認(rèn)scheme/項(xiàng)目.xcarchive" -workspace "/Users/Shared/Jenkins/Home/workspace/項(xiàng)目文件夾/項(xiàng)目/項(xiàng)目.xcworkspace" -sdk iphoneos11.4 -scheme "默認(rèn)scheme" -configuration "默認(rèn)configuration" archive
xcodebuild -exportArchive -archivePath "/Users/Shared/Jenkins/Home/workspace/項(xiàng)目文件夾/output/默認(rèn)scheme/項(xiàng)目.xcarchive" -exportPath "/Users/Shared/Jenkins/Home/workspace/項(xiàng)目文件夾/ipa/默認(rèn)scheme" -exportOptionsPlist '/Users/Shared/Jenkins/Home/workspace/項(xiàng)目文件夾/ipa/默認(rèn)scheme/ExportOptions.plist' -allowProvisioningUpdates
當(dāng)然贡蓖,只是為了實(shí)現(xiàn)簡(jiǎn)單的構(gòu)建版本需求曹鸠。
注意:
exportOptionsPlist代表包含導(dǎo)出的ipa包的配置信息的文件,我們可以再構(gòu)建之前先在/Users/Shared/Jenkins/Home/workspace/項(xiàng)目文件夾/ipa/默認(rèn)scheme
生成這個(gè)文件斥铺,如果不會(huì)生成這個(gè)文件可以手動(dòng)打包彻桃,打包導(dǎo)出的文件夾會(huì)生成這個(gè)文件,可以直接拿來(lái)使用晾蜘,同時(shí)這個(gè)文件里能看到Team ID
邻眷。
2)
/Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/項(xiàng)目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/項(xiàng)目/InstallationBuildProductsLocation/Applications/項(xiàng)目.app/Frameworks/AliyunVideoSDKPro.framework: errSecInternalComponent
Command /usr/bin/codesign failed with exit code 1
** ARCHIVE FAILED **
The following build commands failed:
CodeSign /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/項(xiàng)目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/項(xiàng)目/InstallationBuildProductsLocation/Applications/項(xiàng)目.app/Frameworks/AliThirdparty.framework
CodeSign /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/項(xiàng)目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/項(xiàng)目/InstallationBuildProductsLocation/Applications/項(xiàng)目.app/Frameworks/AliyunPlayerSDK.framework
(4 failures)
Build step '執(zhí)行 shell' marked build as failure
Finished: FAILURE
一切都進(jìn)行很順利,就差最后一點(diǎn)點(diǎn)就Archive
完了剔交,到構(gòu)建一些.framework
時(shí)又報(bào)問題了耗溜,這個(gè)問題真的是無(wú)解,仿佛就作者遇到了這樣的問題省容,也無(wú)從查證抖拴,實(shí)在是搞不明白errSecInternalComponent
這是什么問題,又看到了很多博客做了很多飄逸的操作,結(jié)果也沒有給我解決問題阿宅。后來(lái)我就回看往期的構(gòu)建版本發(fā)現(xiàn)用腳本構(gòu)建之前(Xcode
插件構(gòu)建)時(shí)到這步操作并沒有報(bào)這個(gè)錯(cuò)而是繼續(xù)構(gòu)建候衍,然后報(bào)了錯(cuò)誤1),然后我就又換回了腳本構(gòu)建的方式洒放,通過構(gòu)建版本方式的切換我發(fā)現(xiàn)成功導(dǎo)出了ipa
文件蛉鹿,就這樣作者終于看到了:
** ARCHIVE SUCCEEDED **
** EXPORT SUCCEEDED **
。
本以為就這樣結(jié)束了往湿,作者就針對(duì)工程中多個(gè)Scheme
創(chuàng)建了多個(gè)任務(wù)妖异,用很詭異的切換構(gòu)建方式都成功地完成自動(dòng)化打包,然后關(guān)機(jī)下班领追。
第二天一上班欣喜地點(diǎn)了“立即構(gòu)建”他膳,結(jié)果爆炸了,又報(bào)了這個(gè)錯(cuò)誤绒窑,心態(tài)爆炸了棕孙,原來(lái)切換構(gòu)建方式的方法只是解決了一時(shí)的問題。后來(lái)靜下心來(lái)想問題出在哪兒些膨,又上網(wǎng)上翻了翻蟀俊,看到了
Xcode Command /usr/bin/codesign failed with exit code 1 : errSecInternalComponent,下面有個(gè)回答點(diǎn)醒了我订雾,就是腳本構(gòu)建需要先執(zhí)行security unlock-keychain -p 開機(jī)密碼(登錄鑰匙串密碼) /Users/用戶名/Library/Keychains/login.keychain
肢预,將登錄鑰匙串打開,提供訪問洼哎。之前用Xcode
插件構(gòu)建不會(huì)在這里報(bào)錯(cuò)是因?yàn)?code>Xcode插件有個(gè)解鎖的選項(xiàng)烫映,如下:
所以
Xcode
插件構(gòu)建后再用腳本構(gòu)建不會(huì)問題,并且構(gòu)建成功谱净,而且重啟電腦后又會(huì)報(bào)這個(gè)問題。所以腳本構(gòu)建需要先執(zhí)行security unlock-keychain -p 開機(jī)密碼(登錄鑰匙串密碼) /Users/用戶名/Library/Keychains/login.keychain
擅威。
3)
前一陣子公司也開發(fā)新版本壕探,Jenkins 也被擱置了。結(jié)果前兩天想打包發(fā)現(xiàn) Jenkins 面板打不開了郊丛,定位了半天也沒找到問題出在哪里李请,索性就直接在公司的新電腦上重新部署了一下 Jenkins,最后我把問題歸咎于 macOS Mojave厉熟,哈哈导盅。
結(jié)果沒開心多久,像之前一樣配置工程揍瑟,結(jié)果打包失敗了白翻,報(bào)錯(cuò)信息如下:
error: exportArchive: The data couldn’t be read because it isn’t in the correct format.
Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/v4/j6xwm71s0nl2hjkfr7kyxd_w0000gn/T/ipatool-json-filepath-CcF4eM}
** EXPORT FAILED **
這個(gè)問題就是導(dǎo)出的ExportOptions.plist
配置的值不對(duì),解決這個(gè)問題最快的辦法就是手動(dòng)打個(gè)包,然后導(dǎo)出包的文件夾里也會(huì)有這個(gè)文件滤馍,拷貝到workspace
對(duì)應(yīng)的文件夾中即可岛琼,如下圖:
- 需要注意的是在選擇
Development distribution options
時(shí)App Thinning
一定要選擇None
,如下圖:
Development distribution options
這樣打完包之后的ExportOptions.plist
內(nèi)容如下圖:
ExportOptions.plist
4)
$ /bin/sh -xe /var/folders/v4/j6xwm71s0nl2hjkfr7kyxd_w0000gn/T/jenkins2815406958203751547.sh
+ xcodebuild clean -workspace $'/Users/apple/.jenkins/workspace/xxx/xxx.xcworkspace' -scheme xxx -configuration xxx -sdk iphoneos11.0
xcodebuild: error: SDK "iphoneos11.0" cannot be located.
出現(xiàn)這個(gè)問題就在終端輸入xcodebuild -showsdks
查看電腦支持的 iOS SDKs 就好了巢株。
5)
憤怒的管家:
org.apache.commons.jelly.JellyTagException: jar:file:/Users/apple/.jenkins/war/WEB-INF/lib/jenkins-core-2.151.jar!/hudson/model/UpdateCenter/CoreUpdateMonitor/message.jelly:53:20: <j:otherwise> can't parse argument number: changelog.url
安裝完
Jenkins
遇到這個(gè)報(bào)錯(cuò)久無(wú)法繼續(xù)配置任務(wù)了槐瑞,我是用homebrew
安裝后遇到這個(gè)問題的,在網(wǎng)上查了很多資料阁苞,感覺沒有實(shí)質(zhì)性的幫助困檩,看官方日志及解決方案也沒有解決這個(gè)問題,最后我根據(jù)路徑找到了報(bào)錯(cuò)的jar包
那槽,然后去官網(wǎng)下載了Generic Java package (.war)
悼沿,用新下的jenkins.war
里的jenkins-core-2.138.3
替換了報(bào)錯(cuò)的jenkins-core-2.151.jar
,完美解決了這個(gè)問題倦炒。
就這樣經(jīng)歷了99+
次構(gòu)建显沈,作者用生命集成好了Jenkins
,實(shí)現(xiàn)了持續(xù)集成逢唤,再次聲明不是什么技術(shù)活拉讯。