【Jenkins + Xcode + 蒲公英】配置 Jenkins 遇到的坑

背景

使用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)去查看士鸥,如圖:

Team ID

就這樣我解決了這個(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)烫映,如下:

Unlock Keychain

所以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)的文件夾中即可岛琼,如下圖:

workspace

  • 需要注意的是在選擇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ù)活拉讯。

成功導(dǎo)出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鳖藕,隨后出現(xiàn)的幾起案子魔慷,更是在濱河造成了極大的恐慌,老刑警劉巖著恩,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件院尔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡喉誊,警方通過查閱死者的電腦和手機(jī)邀摆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伍茄,“玉大人栋盹,你說我怎么就攤上這事》蠼茫” “怎么了例获?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)曹仗。 經(jīng)常有香客問我榨汤,道長(zhǎng),這世上最難降的妖魔是什么怎茫? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任收壕,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啼器。我一直安慰自己旬渠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布端壳。 她就那樣靜靜地躺著告丢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪损谦。 梳的紋絲不亂的頭發(fā)上岖免,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音照捡,去河邊找鬼颅湘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛栗精,可吹牛的內(nèi)容都是我干的闯参。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悲立,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鹿寨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起薪夕,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤脚草,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后原献,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馏慨,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年姑隅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了写隶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讲仰,死狀恐怖慕趴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叮盘,我是刑警寧澤秩贰,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布霹俺,位于F島的核電站柔吼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丙唧。R本人自食惡果不足惜愈魏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧培漏,春花似錦溪厘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至珊佣,卻和暖如春蹋宦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咒锻。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工冷冗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惑艇。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓蒿辙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親滨巴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子思灌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容