[TOC]
前言:
以前每次給測試人員安裝app的時候都是在Xcode上直接安裝,效率很低,浪費時間,為了提高效率,也是配合公司整個自動化的流程,研究了一下自動化打包的過程,記錄如下;
步驟
安裝 Jenkins
官網下載地址 :
我的電腦是Mac
系統,選擇了 Mac OS X
安裝完成后需要輸入密碼進入
密碼可以點擊連接在服務器上獲取,也可以從本地日志中獲取密碼;
后面就是下一步...,都有提示的
安裝相關插件
安裝推薦的插件,可以先安裝推薦的插件,然后再搜索插件自定義安裝;
搜索插件并安裝: Jenkins首頁
-- 系統管理
-- 插件管理
需要的有:
-
Keychains and Provisioning Profiles Management
: 證書管理 -
Xcode integration
: 持續集成,build
和archive
的一些配置信息
配置Jenkins
和相關的插件信息
我這邊使用的是gitlab
管理源代碼,所以需要配置ssh
。(注意:不能使用http
配置否則會報錯)
配置 Jenkins
的 GitLab
相關信息
配置訪問token
配置ssh
ssh
生成和獲取可以點擊鏈接查看怎么獲取,或者百度一下
在Jekins
配置GitLab
賬號
在Jenkins
-- 系統設置
-- 系統設置
-- 配置
-- GitLab
中進行配置
host URL
只需要寫gitlab
的域名就好了,不需要具體的項目地址
配置訪問GitLab
的證書: 選擇 GitLab API Token
,把前面獲取到的填入即可
配置相關插件
配置證書插件
需要的是:
-
Keychains
: 路徑/Users/{用戶名}/Library/Keychains
-
MobileDevice
: 路徑/Users/{用戶名}/Library/MobileDevice
如下圖
把這兩個文件夾的內容復制
到Jenkins
用戶下:(Jenkins
是新建了一個用戶)
下面開始配置鑰匙串訪問和簽名證書
這里需要把
Xcode
證書改為手動管理,如下
新建工程
點擊 Jenkins
-- 新建任務
開始構建任務
配置工程
我這邊用的是GitLab
,下面以GitLab
作為講解
General
對應需要多個配置變量的,可以使用
參數化構建過程
源碼管理
配置項目地址
配置項目的訪問憑證
構建觸發器
這里可以定時,也可以自定義
構建環境
構建
更新 pod
現在項目都是使用了 pod
進行第三方庫的管理,需要需要更新pod
,否則項目運行不起來
這里選擇 shell
執行,代碼參考如下
#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd $WORKSPACE/項目名稱
/usr/local/bin/pod update --verbose --no-repo-update
說明:
-
cd $WORKSPACE/項目名稱
: 這句代碼和我們從終端更新pod
的操作時一樣,這里需要注意路徑的問題,項目名稱.xcworkspace
或者項目名稱.xcodeproj
的上一級目錄 -
/usr/local/bin/pod update --verbose --no-repo-update
: 更新pod
,這里前面是pod
的絕對路徑,直接使用pod update
可能會報錯pod: command not found
,所以這里使用pod
的絕對路徑來執行,見下面pod
路徑
pod
的路徑
Jenkins
用戶的項目路徑為/Users/Shared/Jenkins/Home/workspace
配置 build
和 archive
配置
添加構建步驟 - Xcode
注意:在
Xcode 9
之后,使用Jenkins
的插件Xcode integration
在導出ipa
文件的時候會報錯,因為需要pp
文件和一些其他的配置plist
文件;索引這里我只archive
使用了插件Xcode integration
,但是導出ipa
包使用腳本文件shell
執行,具體如下
General build settings
一、
二、
注意,這里執行
build
archive
命令,得到的是.xcarchive
文件,需要我們簽名才能變成.ipa
文件
Code signing & OS X keychain options
這里需要解鎖鑰匙串,否則會報錯
Command /usr/bin/codesign failed with exit code 1
Advanced Xcode build options
簽名、獲取 ipa
文件
因為Xcode 9
之后簽名需要pp
文件,自帶的插件不支持,所以使用了腳本執行shell
命令如下:
xcodebuild -exportArchive -archivePath "{.xcarchive文件路徑}" -exportPath "{輸入目錄,一般是build目錄}" -exportOptionsPlist '{導致配置參數的plist文件路徑}' -allowProvisioningUpdates
參考腳本shell
如下:(PROJECT_NAME
是自己添加的參數化構建)
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
一些其他處理
更改文件名稱
打包出來的文件名稱格式不符合要求,所以自己加了一段腳本更改ipa
文件名稱
echo "ipa文件改名開始 ----- "
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文件改名結束 -----"
注意:這里更改文件名稱使用的是
mv
命令,rename
命令在mac
系統下面默認是沒有的
構建后操作
構建完成后,可以上傳ipa
文件到相應的平臺,(蒲公英之類的)
過程中遇到的錯誤以及處理
git
拉去代碼出錯
ERROR: Timeout after 10 minutes
ERROR: Error cloning remote repo 'origin'
原因:一開始在源碼管理
這一塊使用的是http
連接、設置了賬號和密碼,就一直報錯;
解決:使用ssh
連接源碼管理,具體步驟參照上面的步驟;
2018-12-11更新:
后面又嘗試了 URL
使用http
和git
開始,密碼使用賬號和密碼
和使用ssh
登錄,好像也都可以,總之這地方多試一試吧
pod
命令
pod: command not found
找不到pod
命令;
原因:Jenkins
是新開了一個用戶的;pod
命令的位置找不到;
解決:使用pod
的絕對路徑進行命令操作;
#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd $WORKSPACE/項目名稱
/usr/local/bin/pod update --verbose --no-repo-update
證書簽名問題
== 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 '........'.
原因:證書配置出錯了;
解決:參考上面的步驟,重新配置證書;
注意:把相應的證書文件復制到
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?
這個選項,就是解鎖鑰匙串訪問的權限;
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
中沒有配置證書;
解決:不要
使用自動管理證書,使用手動
管理證書,并配置相關證書文件,參考上面響應的步驟;
簽名ipa
問題
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 **
導出失?。?/p>
原因:Xcode 9
之后導出ipa
文件需要一些配置信息,(可以手動導出一遍,看看系統的配置信息ExportOptions.plist
)
解決:使用腳本shell
簽名ipa
,參考上面響應的步驟;
參考文章
http://www.lxweimin.com/p/7a2efc7c69fe
http://www.lxweimin.com/p/ce36997919b4