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

背景

使用Jenkins是為了持續、自動構建項目,持續集成對整個開發團隊的開發帶來諸多好處,可以省去頻繁的集成工作,整體縮短開發周期,推動整個開發,很大程度提高團隊的工作效率。

上家公司就是用Jenkins工具實現持續集成,但是之前是別的同事配置的,這兩天在公司決定自己配置一下,結果遇到了很多坑,在此記錄一下。

ps:其實整個Jenkins配置過程還是很簡單的,不是什么技術活,網上詳細的教程也有很多,所以不多詳細描述整個配置過程,而是針對于我們公司的項目提出幾個點,并分享解決過程。

一.安裝方式

首先Jenkins安裝方式網上就有很多聲音,最開始配置作者是通過安裝包(.dmg)的方式安裝的,一切都很順利,http://localhost:8080也直接打開了面板(如果輸入地址打不開面板可能就是Java環境出現問題,可以檢查一下,升級或者重新安裝)。新建項目之后又遇到了一些問題,在下面會逐一提到。在工程都完美配置好的前提下(其實在這之前構建過 n 次,填了很多網上其他用戶遇到的同樣的問題,都比較好解決),開始構建,結果剛開始很順利,進度條走著走著就報紅了,打開控制臺輸出是以下內容:

=== 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 **

這是作者遇到的第一個大坑,網上同樣的問題也很多,很多人提出解決方法就是將/Users/apple/Library/MobileDevice下描述文件的文件夾整體移動到/User/Shared/Jenkins/Library/MobileDevice下,結果作者試了并沒有什么用,然后又查了很多資料都沒有解決這個問題,直到看到一個博客說通過安裝包的方式存在這樣的問題(修改Jenkins主目錄),作者就推翻了安裝包安裝的方式,用homebrew進行安裝,然后安裝完配置Jenkins后,在面板里添加了工程,然后構建,不幸的是同樣的問題并沒有得到解決。

其實作者這里出現這個問題的根本原因就是Team ID寫錯了,這個問題就讓人很頭大了,我這里一直沒有發現我填的是證書后面的那串數字,這個操作就是被無良博主帶歪了,Team ID應該登錄開發者賬號去查看,如圖:

Team ID

就這樣我解決了這個大坑,后來發現拷貝描述文件到Jenkins用戶目錄是正確的操作。

那么作者就這兩種安裝說一下自己比較直觀的感受:

  • homebrew安裝會比安裝包安裝效率要高一些,整個安裝過程不用怕出現配置問題,包括卸載的時候會更方便。
  • 安裝包安裝會再系統生成一個Jenkins用戶,homebrew安裝則不會。
  • 兩者主目錄路徑會不同,
homebrew安裝主路徑為:
/Users/Shared/Jenkins/Home
安裝包安裝主路徑為:
~/.jenkins/Home
  • homebrew安裝開機后手動啟動 Jenkins 服務,安裝包安裝開機后自動啟動服務。當然homebrew也可以通過命令行設置成開機自動啟動服務。
  • 其他方面,比如創建任務及整個配置過程兩種安裝方式安裝后都是一樣的,出現報錯不用質疑安裝方式有問題。

二.其他報錯

當然配置過程還有很多問題,比如:

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插件構建會導致這樣的問題,導致原因可能是沒有權限訪問鑰匙串的內容,提供解決方案是放棄Xcode插件,通過“執行 shell”運行腳本完成項目構建,如下:

security unlock-keychain -p 開機密碼(登錄鑰匙串密碼) /Users/用戶名/Library/Keychains/login.keychain
xcodebuild clean -workspace "/Users/Shared/Jenkins/Home/workspace/項目文件夾/項目/項目.xcworkspace" -scheme "默認scheme" -configuration "默認configuration" -sdk iphoneos11.4
xcodebuild -archivePath "/Users/Shared/Jenkins/Home/workspace/項目文件夾/output/默認scheme/項目.xcarchive" -workspace "/Users/Shared/Jenkins/Home/workspace/項目文件夾/項目/項目.xcworkspace" -sdk iphoneos11.4 -scheme "默認scheme" -configuration "默認configuration" archive
xcodebuild -exportArchive -archivePath "/Users/Shared/Jenkins/Home/workspace/項目文件夾/output/默認scheme/項目.xcarchive" -exportPath "/Users/Shared/Jenkins/Home/workspace/項目文件夾/ipa/默認scheme" -exportOptionsPlist '/Users/Shared/Jenkins/Home/workspace/項目文件夾/ipa/默認scheme/ExportOptions.plist' -allowProvisioningUpdates

當然,只是為了實現簡單的構建版本需求。

注意:
exportOptionsPlist代表包含導出的ipa包的配置信息的文件,我們可以再構建之前先在/Users/Shared/Jenkins/Home/workspace/項目文件夾/ipa/默認scheme生成這個文件,如果不會生成這個文件可以手動打包,打包導出的文件夾會生成這個文件,可以直接拿來使用,同時這個文件里能看到Team ID

2)

/Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/項目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/項目/InstallationBuildProductsLocation/Applications/項目.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/項目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/項目/InstallationBuildProductsLocation/Applications/項目.app/Frameworks/AliThirdparty.framework
    CodeSign /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/項目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/項目/InstallationBuildProductsLocation/Applications/項目.app/Frameworks/AliyunPlayerSDK.framework
(4 failures)
Build step '執行 shell' marked build as failure
Finished: FAILURE

一切都進行很順利,就差最后一點點就Archive完了,到構建一些.framework時又報問題了,這個問題真的是無解,仿佛就作者遇到了這樣的問題,也無從查證,實在是搞不明白errSecInternalComponent這是什么問題,又看到了很多博客做了很多飄逸的操作,結果也沒有給我解決問題。后來我就回看往期的構建版本發現用腳本構建之前(Xcode插件構建)時到這步操作并沒有報這個錯而是繼續構建,然后報了錯誤1),然后我就又換回了腳本構建的方式,通過構建版本方式的切換我發現成功導出了ipa文件,就這樣作者終于看到了:
** ARCHIVE SUCCEEDED ** ** EXPORT SUCCEEDED **
本以為就這樣結束了,作者就針對工程中多個Scheme創建了多個任務,用很詭異的切換構建方式都成功地完成自動化打包,然后關機下班。
第二天一上班欣喜地點了“立即構建”,結果爆炸了,又報了這個錯誤,心態爆炸了,原來切換構建方式的方法只是解決了一時的問題。后來靜下心來想問題出在哪兒,又上網上翻了翻,看到了
Xcode Command /usr/bin/codesign failed with exit code 1 : errSecInternalComponent,下面有個回答點醒了我,就是腳本構建需要先執行security unlock-keychain -p 開機密碼(登錄鑰匙串密碼) /Users/用戶名/Library/Keychains/login.keychain,將登錄鑰匙串打開,提供訪問。之前用Xcode插件構建不會在這里報錯是因為Xcode插件有個解鎖的選項,如下:

Unlock Keychain

所以Xcode插件構建后再用腳本構建不會問題,并且構建成功,而且重啟電腦后又會報這個問題。所以腳本構建需要先執行security unlock-keychain -p 開機密碼(登錄鑰匙串密碼) /Users/用戶名/Library/Keychains/login.keychain

3)

前一陣子公司也開發新版本,Jenkins 也被擱置了。結果前兩天想打包發現 Jenkins 面板打不開了,定位了半天也沒找到問題出在哪里,索性就直接在公司的新電腦上重新部署了一下 Jenkins,最后我把問題歸咎于 macOS Mojave,哈哈。
結果沒開心多久,像之前一樣配置工程,結果打包失敗了,報錯信息如下:

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 **

這個問題就是導出的ExportOptions.plist配置的值不對,解決這個問題最快的辦法就是手動打個包,然后導出包的文件夾里也會有這個文件,拷貝到workspace對應的文件夾中即可,如下圖:

workspace

  • 需要注意的是在選擇Development distribution optionsApp Thinning一定要選擇None,如下圖:
    Development distribution options

    這樣打完包之后的ExportOptions.plist內容如下圖:
    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.

出現這個問題就在終端輸入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遇到這個報錯久無法繼續配置任務了,我是用homebrew安裝后遇到這個問題的,在網上查了很多資料,感覺沒有實質性的幫助,看官方日志及解決方案也沒有解決這個問題,最后我根據路徑找到了報錯的jar包,然后去官網下載了Generic Java package (.war),用新下的jenkins.war里的jenkins-core-2.138.3替換了報錯的jenkins-core-2.151.jar,完美解決了這個問題。


就這樣經歷了99+次構建,作者用生命集成好了Jenkins,實現了持續集成,再次聲明不是什么技術活。

成功導出

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容