[TOC]
前言:
以前每次給測(cè)試人員安裝app的時(shí)候都是在Xcode上直接安裝,效率很低,浪費(fèi)時(shí)間,為了提高效率,也是配合公司整個(gè)自動(dòng)化的流程,研究了一下自動(dòng)化打包的過(guò)程,記錄如下;
步驟
安裝 Jenkins
官網(wǎng)下載地址 :
我的電腦是Mac系統(tǒng),選擇了 Mac OS X

安裝完成后需要輸入密碼進(jìn)入

密碼可以點(diǎn)擊連接在服務(wù)器上獲取,也可以從本地日志中獲取密碼;

后面就是下一步...,都有提示的
安裝相關(guān)插件
安裝推薦的插件,可以先安裝推薦的插件,然后再搜索插件自定義安裝;

搜索插件并安裝: Jenkins首頁(yè) -- 系統(tǒng)管理 -- 插件管理


需要的有:
-
Keychains and Provisioning Profiles Management: 證書管理 -
Xcode integration: 持續(xù)集成,build和archive的一些配置信息
配置Jenkins和相關(guān)的插件信息
我這邊使用的是gitlab管理源代碼,所以需要配置ssh。(注意:不能使用http配置否則會(huì)報(bào)錯(cuò))
配置 Jenkins 的 GitLab 相關(guān)信息
配置訪問(wèn)token

配置ssh
ssh生成和獲取可以點(diǎn)擊鏈接查看怎么獲取,或者百度一下

在Jekins配置GitLab賬號(hào)
在Jenkins -- 系統(tǒng)設(shè)置 -- 系統(tǒng)設(shè)置 -- 配置 -- GitLab 中進(jìn)行配置

host URL只需要寫gitlab的域名就好了,不需要具體的項(xiàng)目地址
配置訪問(wèn)GitLab的證書: 選擇 GitLab API Token,把前面獲取到的填入即可

配置相關(guān)插件
配置證書插件
需要的是:
-
Keychains: 路徑/Users/{用戶名}/Library/Keychains -
MobileDevice: 路徑/Users/{用戶名}/Library/MobileDevice
如下圖

把這兩個(gè)文件夾的內(nèi)容復(fù)制到Jenkins用戶下:(Jenkins是新建了一個(gè)用戶)

下面開(kāi)始配置鑰匙串訪問(wèn)和簽名證書

這里需要把
Xcode證書改為手動(dòng)管理,如下

新建工程
點(diǎn)擊 Jenkins -- 新建任務(wù) 開(kāi)始構(gòu)建任務(wù)

配置工程
我這邊用的是GitLab,下面以GitLab作為講解
General

對(duì)應(yīng)需要多個(gè)配置變量的,可以使用
參數(shù)化構(gòu)建過(guò)程
源碼管理
配置項(xiàng)目地址

配置項(xiàng)目的訪問(wèn)憑證

構(gòu)建觸發(fā)器
這里可以定時(shí),也可以自定義

構(gòu)建環(huán)境

構(gòu)建
更新 pod
現(xiàn)在項(xiàng)目都是使用了 pod 進(jìn)行第三方庫(kù)的管理,需要需要更新pod,否則項(xiàng)目運(yùn)行不起來(lái)
這里選擇 shell 執(zhí)行,代碼參考如下
#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd $WORKSPACE/項(xiàng)目名稱
/usr/local/bin/pod update --verbose --no-repo-update
說(shuō)明:
-
cd $WORKSPACE/項(xiàng)目名稱: 這句代碼和我們從終端更新pod的操作時(shí)一樣,這里需要注意路徑的問(wèn)題,項(xiàng)目名稱.xcworkspace或者項(xiàng)目名稱.xcodeproj的上一級(jí)目錄 -
/usr/local/bin/pod update --verbose --no-repo-update: 更新pod,這里前面是pod的絕對(duì)路徑,直接使用pod update可能會(huì)報(bào)錯(cuò)pod: command not found,所以這里使用pod的絕對(duì)路徑來(lái)執(zhí)行,見(jiàn)下面pod路徑
pod的路徑

Jenkins用戶的項(xiàng)目路徑為/Users/Shared/Jenkins/Home/workspace

配置 build 和 archive 配置
添加構(gòu)建步驟 - Xcode
注意:在
Xcode 9之后,使用Jenkins的插件Xcode integration在導(dǎo)出ipa文件的時(shí)候會(huì)報(bào)錯(cuò),因?yàn)樾枰?code>pp文件和一些其他的配置plist文件;索引這里我只archive使用了插件Xcode integration,但是導(dǎo)出ipa包使用腳本文件shell執(zhí)行,具體如下
General build settings
一、

二、

注意,這里執(zhí)行
buildarchive命令,得到的是.xcarchive文件,需要我們簽名才能變成.ipa文件
Code signing & OS X keychain options

這里需要解鎖鑰匙串,否則會(huì)報(bào)錯(cuò)
Command /usr/bin/codesign failed with exit code 1
Advanced Xcode build options
簽名、獲取 ipa 文件
因?yàn)?code>Xcode 9之后簽名需要pp文件,自帶的插件不支持,所以使用了腳本執(zhí)行shell
命令如下:
xcodebuild -exportArchive -archivePath "{.xcarchive文件路徑}" -exportPath "{輸入目錄,一般是build目錄}" -exportOptionsPlist '{導(dǎo)致配置參數(shù)的plist文件路徑}' -allowProvisioningUpdates
參考腳本shell如下:(PROJECT_NAME是自己添加的參數(shù)化構(gòu)建)
echo exportArchive parameters begin ----
echo $JOB_BASE_NAME
echo $JOB_NAME
build_dir="$WORKSPACE/build"
project_name="${PROJECT_NAME}"
archivePath="$build_dir/$project_name.xcarchive"
exportPath=$build_dir
exportOptionsPlist="$WORKSPACE/ExportOptions_Debug.plist"
echo $archivePath
echo $exportPath
echo $exportOptionsPlist
echo exportArchive parameters end ----
xcodebuild -exportArchive -archivePath "$archivePath" -exportPath "$exportPath" -exportOptionsPlist "$exportOptionsPlist" -allowProvisioningUpdates
一些其他處理
更改文件名稱
打包出來(lái)的文件名稱格式不符合要求,所以自己加了一段腳本更改ipa文件名稱
echo "ipa文件改名開(kāi)始 ----- "
project_name="${PROJECT_NAME}"
echo $project_name
plistPath="$WORKSPACE/$project_name/$project_name/Info.plist"
echo $plistPath
versionString=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $plistPath)
echo $versionString
formattedDate=$(date "+%Y%m%d%H%M%S")
echo $formattedDate
oldName="$project_name.ipa"
newName="app_parent-$versionString-$formattedDate-debug.ipa"
cd "$WORKSPACE/build"
$(mv $oldName $newName)
echo "ipa文件改名結(jié)束 -----"
注意:這里更改文件名稱使用的是
mv命令,rename命令在mac系統(tǒng)下面默認(rèn)是沒(méi)有的
構(gòu)建后操作
構(gòu)建完成后,可以上傳ipa文件到相應(yīng)的平臺(tái),(蒲公英之類的)
過(guò)程中遇到的錯(cuò)誤以及處理
git拉去代碼出錯(cuò)
ERROR: Timeout after 10 minutes
ERROR: Error cloning remote repo 'origin'
原因:一開(kāi)始在源碼管理這一塊使用的是http連接、設(shè)置了賬號(hào)和密碼,就一直報(bào)錯(cuò);
解決:使用ssh連接源碼管理,具體步驟參照上面的步驟;
2018-12-11更新:
后面又嘗試了 URL 使用http和git開(kāi)始,密碼使用賬號(hào)和密碼和使用ssh登錄,好像也都可以,總之這地方多試一試吧
pod 命令
pod: command not found
找不到pod命令;
原因:Jenkins是新開(kāi)了一個(gè)用戶的;pod命令的位置找不到;
解決:使用pod的絕對(duì)路徑進(jìn)行命令操作;
#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd $WORKSPACE/項(xiàng)目名稱
/usr/local/bin/pod update --verbose --no-repo-update
證書簽名問(wèn)題
== Certificates available for the Codesign
[HaiZiGuoParents] $ /usr/bin/security find-identity -p codesigning -v
0 valid identities found
No global development team or local team ID was configured, back to default automatic signing
---------
check dependencies
Code Signing Error: There are no accounts registered with Xcode. Add your developer account to Xcode
Code Signing Error: No profiles for '.......' were found: Xcode couldn't find any iOS App Development provisioning profiles matching '........'.
原因:證書配置出錯(cuò)了;
解決:參考上面的步驟,重新配置證書;
注意:把相應(yīng)的證書文件復(fù)制到
Jenkins用戶目錄下的Library文件下面
Command /usr/bin/codesign failed with exit code 1
The following build commands failed:
CodeSign /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/......-alyncnqklycsyacghgezqybbpyae/Build/Intermediates.noindex/ArchiveIntermediates/......./InstallationBuildProductsLocation/Applications/HaiZiGuoParents.app
試試在 Code signing & OS X keychain options 添加 Unlock Keychain? 這個(gè)選項(xiàng),就是解鎖鑰匙串訪問(wèn)的權(quán)限;
Check dependencies
Code Signing Error: "Test" requires a provisioning profile with the Push Notifications feature. Select a provisioning profile for the "Release" build configuration in the project editor.
warning: no rule to process file
原因: Xcode中沒(méi)有配置證書;
解決:不要使用自動(dòng)管理證書,使用手動(dòng)管理證書,并配置相關(guān)證書文件,參考上面響應(yīng)的步驟;
簽名ipa問(wèn)題
error: exportArchive: "Test.app" requires a provisioning profile with the Push Notifications feature.
Error Domain=IDEProvisioningErrorDomain Code=9 ""Test.app" requires a provisioning profile with the Push Notifications feature." UserInfo={NSLocalizedDescription="Test.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 **
導(dǎo)出失??;
原因:Xcode 9之后導(dǎo)出ipa文件需要一些配置信息,(可以手動(dòng)導(dǎo)出一遍,看看系統(tǒng)的配置信息ExportOptions.plist)
解決:使用腳本shell簽名ipa,參考上面響應(yīng)的步驟;
參考文章
http://www.itdecent.cn/p/7a2efc7c69fe
http://www.itdecent.cn/p/ce36997919b4