iOS Jenkins自動構建
安裝
下載安裝Jenkins,直接在官網下載安裝,此處不累述,網上很多教程.
可以參考http://www.lxweimin.com/p/41ecb06ae95f
配置
登入Jenkins頁面
通過http://localhost:8080打開頁面進行配置(如果沒有另外指定端口,默認端口是8080)
如果打不開頁面,可能是java環境沒有安裝,需先安裝java環境。
-
第一次打開會出現下面錯誤頁面
Jenkins打開出錯
按照提示,找到/Users/Shared/Jenkins/Home/secrets 這個目錄,這個目錄雖然是共享目錄,但是有權限限制的,非Jenkins用戶沒有讀寫權限的,需要手動需改權限后才能讀,打開initialAdminPassword文件,復制出密碼,就可以填到網頁上去重置密碼了。
安裝插件
- 安裝GitLab插件
因為我們用的是GitLab來管理源代碼,Jenkins本身并沒有自帶GitLab插件,所以我們需要依次選擇 系統管理->管理插件,在“可選插件”中選中“GitLab Plugin”和“Gitlab Hook Plugin”這兩項,然后安裝。 - 安裝Xcode插件
同安裝GitLab插件的步驟一樣,我們依次選擇系統管理->管理插件,在“可選插件”中選中“Xcode integration”安裝。 - 安裝簽名證書管理插件
iOS打包內測版時,需要發布證書及相關簽名文件,因此這兩個插件對于管理iOS證書非常方便。還是在系統管理->管理插件,在“可選插件”中選中“Credentials Plugin”和“Keychains and Provisioning Profiles Management”安裝。 - 安裝FTP插件
在系統管理->管理插件,在“可選插件”中選中“Publish over FTP”安裝。如果要進行安裝包的統一管理,需要用到此插件,將文件上傳到指定服務器目錄. - fir-plugin
如果要分發到fir.rm,可以安裝此插件,但Jenkins插件庫本身不提供此插件,可以到fir.rm官網現在此插件后再安裝,提供了對應的指導文檔.
其他插件是否需要,主要看實際需求,這里只列明必要插件及主要需要使用到的插件.
系統配置
-
Keychains and Provisioning Profiles Management配置
系統管理->Keychains and Provisioning Profiles Management,進入Keychains and Provisioning Profiles Management頁面,點擊“瀏覽”按鈕,分別上傳自己的keychain和證書。
上傳成功后,我們再為keychain指明簽名文件的名稱。點擊“Add Code Signing Identity”,最后添加成功后如下圖所示:
Keychains配置
Keychain其實在/Users/管理員用戶名/Library/Keychains 目錄下,名字為login.keychain或login.keychain-db(名字的差異跟mac系統版本有關). 如果上傳login.keychain-db文件提示文件不匹配類似錯誤時,可以將login.keychain-db名稱改為login.keychain后上傳.當把這個Keychain設置好了之后,需要手動做一些拷貝動作:將這個Keychains拷貝到/Users/Shared/Jenkins/Library/Keychains這里,(Library是隱藏文件)。MobileDevice文件也直接拷貝到/Users/Shared/Jenkins/Library/MobileDevice文件目錄下(實際是拷貝對應目錄下的Provisioning Profiles)。
注意: Provisioning Profiles設置路徑時指定/Users/Shared,不要用管理員目錄,編譯時會因為權限問題不通過.
-
Xcode Builder設置
系統管理->系統設置
圖
其中Keychain path設置 ${HOME}/Library/Keychains/login.keychain
Keychain password為開機密碼
如果用git下載代碼,配置private key.
舉例中是用的碼云管理代碼.
- sudo su - jenkins //切換到jenkins用戶
- mkdir .ssh
-
ssh-keygen -t rsa //生成 ssh key,復制 xxx.pub 公鑰到 git 服務器上即可
碼云添加公鑰
在Jenkins管理頁面,選擇“Credentials”,然后選擇“Global credentials (unrestricted)”,點擊“Add Credentials”,如下圖所示,我們填寫自己的SSH信息,Private Key選擇第三個"From the Jenkins master ~/.ssh",然后點擊“Save”,這樣就把SSH添加到Jenkins的全局域中去了。
完成以上步驟,就基本完成了Jenkins的設置,接下來就是創建工程了.
創建工程
工程創建跟普通Jenkins工程一致,這里主要提出需要特別注意的點.
git代碼庫位置設置
填寫git下載地址及在以上步驟中添加的用戶
構建環境設置
-
勾選"Keychains and Code Signing Identities",下拉框選擇之前設置好的keychain及簽名.
-
勾選"Mobile Provisioning Profiles",注意Provisioning profile需和所選的證書一一對應
構建設置
-
如果項目中用到cocoapads,需要在構建之前進行安裝.
如果沒有安裝,編譯時會報如下錯誤.
選在構建步驟中增加執行如下shell腳本的運行.
#/bin/bash -l
export LANG=en_US.UTF-8
cd ${JENKINS_HOME}/workspace/${JOB_NAME}/KOOCAN-PortalCore
/usr/local/bin/pod install
-
pod命令不識別
解決方案:在系統管理->系統設置 頁面設置PATH的值,獲取用戶目錄下的PATH值并在這里設置
-
構建步驟增加xcode
這里的Development Team ID給證書的一致,Keychain通過下拉框選擇.
如果*.xcworkspace不在Jenkins的job目錄下,需要制定路徑.
構建過程中出現的一些問題總結
-
Jenkins xcodebuild There are no schemes in workspace
解決:
-
xcode中manage schemess
-
勾選Shared選項
-
報錯: No signing certificate "iOS Development" found: No "iOS Development" signing certificate matching team ID "28SDX923G4" with a private key was found.
解決:https://stackoverflow.com/questions/41617743/jenkins-error-no-signing- certificate 將鑰匙串的開發證書從登陸拷貝到系統目錄報錯:No profiles for 'com.sowell-tech.ShareSDKDemo.HelloWord' were found: Xcode couldn't find a provisioning profile matching 'com.sowell-tech.ShareSDKDemo.HelloWord'.
解決:1.保證teamID填寫正確 2.將工程本身的描述文件復制到Jenkins的描述文件夾文件夾中不包含project 或 workspace文件
報錯:xcodebuild: error: The directory /Users/Shared/Jenkins/Home/workspace/Demo1 does not contain an Xcode project or workspace.
解決:在構建步驟,Advanced Xcode build options設置Xcode Workspace File的值,值為 *.xcodeproj的絕對路徑,不需要后綴.
重命名打包文件+版本號
#/bin/bash -l
export LANG=en_US.UTF-8
# app重命名
plist=${JENKINS_HOME}/workspace/${JOB_NAME}/KOOCAN-PortalCore/KOOCAN-PortalCore/Info.plist
buildver=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${plist}")
date=`date +"%Y%m%d"`
# 上傳到蒲公英
cd ${WORKSPACE}/build
mv `find . -name *_Release.ipa |awk -F '/' '{print $2}'` `find . -name *_Release.ipa | awk -F '/' '{print $2}' | awk '{print substr($0,0,length-12)}'`_${buildver}_${date}_Release.ipa
APPNAME=`find . -name *_Release.ipa`
echo "APPNAME=${APPNAME}"
curl -F "file=@${APPNAME}" -F "uKey=*" -F "_api_key=*" https://qiniu-storage.pgyer.com/apiv1/app/upload
jenkins管理員用戶忘記密碼
打開JENKINS_HOME/config.xml文件,修改<useSecurity>true</useSecurity>的值為false,然后重新啟動Jenkins.
命令如下:
停止Jenkins:sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
啟動Jenkins: sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
重新啟動后不需要賬號密碼可以登陸Jenkins。