Jenkins 實現(xiàn) iOS 項目自動打包
轉自:掘金 Perry_6
https://juejin.cn/post/6920469161021816846
Jenkins 概述
Jenkins 是一款流行的開源持續(xù)集成(Continuous Integration)工具,廣泛用于項目開發(fā),具有自動化構建、測試和部署等功能。Jenkins用Java語言編寫,可在Tomcat等流行的servlet容器中運行,也可獨立運行。通常與版本管理工具(SCM)、構建工具結合使用。常用的版本控制工具有SVN、GIT,構建工具有Maven、Ant、Gradle。
安裝 Jenkins
由于Jenkins 依賴于Java,所以在安裝Jenkins前,需要先檢查是否已安裝Java環(huán)境。在終端輸入命令進行檢測:
$ java -version
前往官網(wǎng)下載
點擊進入安裝說明頁面,可以按照提示命令安裝
使用 Homebrew 軟件包管理器安裝Jenkins 。
自制安裝程序 jenkins-lts 。
安裝命令:
安裝最新的LTS版本: brew install jenkins-lts安裝特定的LTS版本: brew install jenkins-lts@YOUR_VERSION啟動 Jenkins 服務: brew services start jenkins-lts重新啟動 Jenkins 服務: brew services restart jenkins-lts更新 Jenkins 版本: brew upgrade jenkins-lts
安裝步驟
啟動 Jenkins 服務后,瀏覽 http://localhost:8080 ,該頁面需要確認是管理員安裝,讓我們輸入密碼,密碼存放在紅色的目錄下,取出來填到輸入框里就行。

選擇安裝推薦的插件。

等待插件安裝完成,有的插件可能會安裝失敗,建議重試,直到把建議安裝的都裝好。

插件安裝完成后會自動跳轉到配置完管理員賬戶

點擊保存并完成,完成注冊
Jenkins 配置
打開瀏覽器,輸入localhost:8080,即可打開Jenkins,輸入密碼,點擊繼續(xù)。
重啟Jenkins
因部分插件依賴可能出現(xiàn)錯誤
待創(chuàng)建好用戶后,可以重啟Jenkins,并用剛創(chuàng)建的賬戶或者admin賬戶登錄Jenkins。重啟Jenkins方法,命令行中輸入jenkins-lts,回車即可。
安裝iOS相關插件
iOS打包需要鑰匙串中訪問證書、描述文件等,所以我們要安裝鑰匙串和描述文件插件。進入Jenkins->系統(tǒng)管理->插件管理安裝相關插件,可通過右上角過濾搜索。然后選擇需要安裝的插件,進行勾選,安裝。安裝成功后可以選擇是否重啟Jenkins。
等待安裝完成后重啟 jenkins
配置鑰匙串
成功之后,我們可以在Jenkins首頁->系統(tǒng)管理中發(fā)現(xiàn)剛才我們安裝的Keychains and Provisioning Profiles Management,點擊進入配置鑰匙串和描述文件。
上傳keychain和provisioning Profile文件。
可以在鑰匙串中看到登錄的鑰匙串路徑,然后只需要按照路徑找到這個文件上傳(點擊upload)即可。
注意:login.keychain-db是上傳不了的,我們需要復制一份,改為login.keychain。另外上傳的時候,找不到路徑,是因為資源庫被隱藏起來了,需要使用command+shift+.將其顯示出來,就可以了。
注意:Code Signing Identity是可以配置多個的,我們可以把通知證書、發(fā)布證書都加入到里面,方法就是點擊下面的Add Code Sign Identity。
配置描述文件
先上傳Provisioning Profiles文件,這些文件的路徑為/Users/[你的電腦用戶名]/Library/MobileDevice/Provisioning Profiles,在此路徑下找到相應的項目的profile文件上傳,拖入終端會顯示整個路徑,復制過來,點擊保存就OK了,現(xiàn)在 Jenkins不需要一個一個上傳描述文件了??。
到此為止整個插件配置完成。
創(chuàng)建一個工程
新建任務
選第一個,輸入工程名稱,點擊確定。
構建配置
General

源碼管理
我使用Git,credentials是登錄的賬號密碼,打包分支可以根據(jù)需要設置
如果沒有添加一個,如下圖
構建環(huán)境
選擇剛才插件填寫的對應證書。
構建(關鍵)
點擊增加構建步驟,選擇執(zhí)行shell,輸入打包腳本
腳本說明
-exportArchive有一個文件adhoc_ExportOptions.plist。
不用自己創(chuàng)建,可以使用xcode導出ipa后,從導出的文件夾里獲取。名字為ExportOptions.plist,修改一下名字就行了 method:有四種渠道。我將他們做了區(qū)分,分成四個不同的plist文件。
分別為 app-store ad-hoc enterprise development
打包導出ipa后需要執(zhí)行上傳內(nèi)測或應用平臺,我是上傳的蒲公英, 使用cURL直接上傳到蒲公英,具體命令蒲公英官方有提供 蒲公英API,獲取uKey 和 _api_key也是在這個頁面
到這里就配置完了,點擊保存,可以開始構建了。
附打包腳本
#!/bin/sh
export LANG=en_US.UTF-8
# 1.設置配置標識,編譯環(huán)境(根據(jù)需要自行填寫 release |debug )
configuration="release"
# 工程名(根據(jù)項目自行填寫)
APP_NAME="TestDome"
# TARGET名稱(根據(jù)項目自行填寫)
TARGET_NAME="TestDome"
# ipa前綴(根據(jù)項目自行填寫)
IPA_NAME="測試"
# info.plist路徑
#project_infoplist_path="./${TARGET_NAME}/Info.plist"
# 取版本號
#bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")
#bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${project_infoplist_path}")
# 日期
DATE=$(date +%Y%m%d-%H-%M-%S)
# 工程文件路徑
ARCHIVE_NAME="${APP_NAME}_${DATE}.xcarchive"
# 存放ipa的文件夾名稱(根據(jù)自己的喜好自行修改)
IPANAME="${APP_NAME}_${DATE}_IPA"
# 工程根目錄#工程源碼目錄(這里的${WORKSPACE}是jenkins的內(nèi)置變量表示(jenkins job的路徑):/Users/plz/.jenkins/workspace/TestDome/)
# ${WORKSPACE}/TestDome/ 中的TestDome根據(jù)你的項目自行修改
CODE_PATH="${WORKSPACE}"
# 要上傳的ipa文件路徑 ${username} 需要換成自己的用戶名
ROOT_PATH="/Users/${username}/Desktop/Jenkins"
ARCHIVE_PATH="${ROOT_PATH}/Archive/${ARCHIVE_NAME}"
IPA_PATH="${ROOT_PATH}/Export/${IPANAME}"
echo "ARCHIVE_PATH: ${ARCHIVE_PATH}"
echo "IPA_PATH: ${IPA_PATH}"
echo "IPA_PATH:\n${IPA_PATH}">> export_history.txt
# 導包方式(這里需要根據(jù)需要手動配置:AdHoc/AppStore/Enterprise/Development)
EXPORT_METHOD="AdHoc"
# 導包方式配置文件路徑(這里需要手動創(chuàng)建對應的XXXExportOptionsPlist.plist文件,并將文件復制到根目錄下[我這里在源項目的根目錄下又新建了ExportPlist文件夾專門放ExportPlist文件])
if test "$EXPORT_METHOD" = "AdHoc"; then
EXPORT_METHOD_PLIST_PATH=${CODE_PATH}/ExportOptions/AdHocExportOptions.plist
elif test "$EXPORT_METHOD" = "AppStore"; then
EXPORT_METHOD_PLIST_PATH=${CODE_PATH}/ExportOptions/AppStoreExportOptios.plist
elif test "$EXPORT_METHOD" = "Enterprise"; then
EXPORT_METHOD_PLIST_PATH=${CODE_PATH}/ExportOptions/EnterpriseExportOptions.plist
else
EXPORT_METHOD_PLIST_PATH=${CODE_PATH}/ExportOptions/DevelopmentExportOptions.plist
fi
# 指ipa定輸出文件夾,如果有刪除后再創(chuàng)建,如果沒有就直接創(chuàng)建
if test -d ${IPA_PATH}; then
rm -rf ${IPA_PATH}
mkdir -pv ${IPA_PATH}
echo ${IPA_PATH}
else
mkdir -pv ${IPA_PATH}
fi
# 進入工程源碼根目錄
cd "${CODE_PATH}"
# 執(zhí)行pod
pod install --verbose --no-repo-update
#mkdir -p build
# 清除工程
echo "++++++++++++++++clean++++++++++++++++"
xcodebuild clean -workspace ${APP_NAME}.xcworkspace -scheme ${APP_NAME} -configuration ${configuration}
# 將app打包成xcarchive格式文件
echo "+++++++++++++++++archive+++++++++++++++++"
xcodebuild archive -workspace ${APP_NAME}.xcworkspace -scheme ${APP_NAME} -configuration ${configuration} -archivePath ${ARCHIVE_PATH}
# 將xcarchive格式文件打包成ipa
echo "+++++++++++++++++ipa+++++++++++++++++"
xcodebuild -exportArchive -archivePath ${ARCHIVE_PATH} -exportPath "${IPA_PATH}" -exportOptionsPlist ${EXPORT_METHOD_PLIST_PATH} -allowProvisioningUpdates
# 刪除工程文件
# echo "+++++++++刪除工程文件+++++++++"
# rm -rf $ARCHIVE_PATH
# 蒲公英上傳結果日志文件路徑
PGYERLOG_PATH="${IPA_PATH}/upload_pgyer_log"
# 創(chuàng)建蒲公英上傳結果日志文件夾
mkdir -p ${PGYERLOG_PATH}
# 創(chuàng)建蒲公英上傳結果日志文
touch "${PGYERLOG_PATH}/log.txt"
# 上傳IPA到蒲公英 根據(jù)蒲公英官方文檔編寫
file_path="${IPA_PATH}/${IPA_NAME}.ipa"
echo "正在上傳文件"
echo $file_path
curl -F "file=@${file_path}" -F "uKey=0ea4142136d51cbe5aaf94cdbf6aaeb1" -F "_api_key=16d3ff684c5576f9d9f6c958cf0a7300" https://upload.pgyer.com/apiv1/app/upload
構建 (打包上傳)
立即構建
點擊立即構建開始構建
點擊構建版本可以查看狀態(tài)和控制臺輸出信息
Jenkins 打包 ipa 常見錯誤匯總
問題1. pod時候會出現(xiàn) command not found
當你jenkins服務在非OS X系統(tǒng)運行時,使用Mac節(jié)點的配置稍微不一樣。
解決方案
系統(tǒng)管理-系統(tǒng)配置-全局屬性

值:在終端中輸入echo $PATH將輸出內(nèi)容復制填寫。
問題2:ipa包導出失敗,導致報錯:curl: (26) Failed to open/read local data from file/application
1.先去文件路徑下查看打包是否成功,路徑下包含已經(jīng)IPA文件,確定路徑?jīng)]有問題;
2.查看腳本文件中的路徑,腳本中的ipa名稱與打包出來的IPA文件的名稱不一致。
解決方案
將腳本中的ipa名稱改為應用的顯示名稱
問題3. 打包時報錯:error: exportArchive: The data couldn’t be read because it isn’t in the correct format.
解決方案 1
xcode archive 導出 ipa 時不要勾選 Rebuild from Bitcode ,導出的
ExportOptions.plist替換項目目錄下的AdHocExportOptions.plist

解決方案 2
需要把xcode上的BitCode關閉,設置成No即可,project和targets里面對應的BitCode都需要關閉

問題4. 打包時報錯:xcodebuild: error: 'APP.xcworkspace' does not exist
解決方案
Choose Product > Scheme > Manage Schemes.
Share your scheme:

也可能是Xcode Workspace File 路徑錯誤
問題5. 編輯報錯 error: /Users/plz/.jenkins/workspace/target_name/Pods/Target Support Files/Pods-HIGO/Pods-HIGO.release.xcconfig: unable to open file (in target "target_name" in project "target_name") (in target 'target_name' from project 'target_name')
解決方案
shell腳本中添加如下命令
1. sudo gem install cocoapods --pre
2. pod install
如果不行 加上 3. pod update
問題6. 編輯報錯 This project contains no schemes
解決方案

這里我們不能去Jenkins項目目錄下修改Xcode項目的shared勾選,我們應該在本地的開發(fā)源碼上修改,然后提交到git遠程倉庫,再次構建!!
問題7. 編輯報錯 `xcodebuild -exportArchive -archivePath /xxx.xcarchive -exportOptionsPlist /Users/xxx/ExportOptions.plist -allowProvisioningUpdates -exportPath ./
error: archive not found at path '/xxx.xcarchive' Build step 'Execute shell' marked build as failure`
解決方案
用腳本構建時,腳本輸寫錯誤
問題8. 編輯報錯 error: archive not found at path '/Users/plz/Desktop/Jenkins/HIGO/Archive/HIGO_20210122-15-43-31.xcarchive'
查看日志發(fā)現(xiàn)在執(zhí)行
pod install時中斷了,引入的三方庫沒有拉下來

解決方案
按照日志提示 shell 腳本 pod install 前執(zhí)行 pod update PLPlayerKit --no-repo-update
參考文章
Jenkins+github+fir持續(xù)集成iOS項目
iOS: Jenkins + xcodebuild打包ipa + 上傳蒲公英
-End-
最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!

面試題】即可獲取