1 全局配置
1.1 Keychain全局配置
1.1.1配置Provisioning Profiles
????1击喂、將/Users/管理員用戶名/Library的MobileDevice文件夾拷貝到/Users/Shared/Jenkins/Library下上岗;
/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles
/Users/HJDev/Library/MobileDevice/Provisioning Profiles
1.1.2 配置login.keychain文件
????2叮姑、將/Users/管理員用戶名/Library/Keychains/下的login.keychain及l(fā)ogin.keychain-db這兩個文件拷貝到/Users/Shared/Jenkins/Library/Keychains文件夾下面铐懊。
????注意:Mac OS 10.12以下的沒有l(wèi)ogin.keychain-db這個文件,只需要拷login.keychain文件默穴。
1.1.3 放開開發(fā)證書與發(fā)布證書訪問權(quán)限
????設置開發(fā)證書與發(fā)布證書的訪問控制權(quán)限直颅;
1.1.4 上傳login.keychain與ProvisioningProfile
????2氧吐、在全局Keychains一項中upload剛剛拷貝的login.keychain與****Provisioning Profiles
iPhone Developer:?****(****)
iPhone Distribution: China **** Co.,Ltd.
1.2 keychain證書設置
????????在Mac OS上讹蘑,證書其實是跟登陸賬號走的,也就是添加時筑舅,如果選擇“登陸”座慰,則只會添加進該賬號目錄下的keychain中。針對Jenkins部署翠拣,因為其會另創(chuàng)建一個叫Jenkins的賬戶角骤,如果發(fā)布證書是安裝在當前賬戶時,構(gòu)建會報錯說找不到provisioning profile對應的證書心剥,而當前帳號下的“鑰匙串”中明明有這個證書。
????????此問題需要登出當前Mac帳戶背桐,然后登錄Jenkins帳號优烧,然后再次添加證書,選擇“登錄”類型链峭,這樣證書才會真正安裝到jenkins帳號下畦娄,構(gòu)建才能找到該證書。
1.2.1 CodeSigning Error: Provisioning profile "HJ_Dis" doesn't includesigning certificate "iPhone Distribution: China Dev Co., Ltd.".
構(gòu)建報錯:
Code Signing Error: Provisioningprofile "HJ_Dis" doesn't include signing certificate"iPhone Distribution: China Dev Co., Ltd.".
原因分析:
? ? ? ? 原因在于Provisioning profile與簽名證書沒對應上弊仪,鑰匙串中存在兩個同名證書熙卡,應該只保留真正用到的那一個。
? ? ? ? 另外励饵,還有一個原因是Mac OS賬號jenkins名下其實并沒有安裝該證書驳癌,只是系統(tǒng)登錄賬號下安裝了,而jenkins構(gòu)建時是使用Jenkins帳號進行的役听,其名下找不到證書自然就報錯了颓鲜。
2 工程NewItemForIOS配置
2.1 構(gòu)建環(huán)境配置
2.1.1 設置工程SVN路徑與賬戶
2.1.2 指定Keychain與CodeSign
????在“源碼管理”設置為None時,此處設置無效典予,需要在xcode工程中設置證書與provisioning pfrofile
2.1.3 編寫shell打包腳本
????Xcode9以后只能通過shell腳本打包甜滨,而不能通過Jenkins的xcode集成控件打包。
2.2 自動構(gòu)建腳本格式
????????其中打包類型是adhoc瘤袖、dev或者app-store衣摩,是在腳本中plist文件中指定的,與工程中設置無關捂敌。Provisioning profile也是在Jenkins中指定的艾扮,與工程設置無關既琴。
? ? ? ? 打包主要是xcodebuild命令,分為編譯archive文件與導出ipa文件兩步栏渺。編譯archive時可以設置不同scheme呛梆、target、configuration磕诊。
目前本人工作中將一個WorkSpace下的工程規(guī)劃了7類target對應編譯不同環(huán)境App填物,包括:
三個企業(yè)環(huán)境包HJ_EntDev、HJ_EntPre霎终、HJ_EntDis滞磺;三個App調(diào)試環(huán)境包HJ_Dev、HJ_Pre莱褒、HJ_AppStore击困;一個Adhoc預發(fā)布包HJ_AdhocDis。
????????打包機器上腳本(注意要有\(zhòng)換行連接符广凸,不然會報CodeSign錯誤):
如果是命令行測試阅茶,則要先進入其工程目錄:
cd /Users/Shared/Jenkins/Home/workspace/IOS_Adhoc
Xcode9 xcodebuild export plist 配置
http://blog.csdn.net/andanlan/article/details/78113330?locationNum=9&fps=1
2.2.1 Ent_Dev企業(yè)測試包腳本
打包腳本:
IPANAME="HJ_EntDev"
security set-key-partition-list -Sapple-tool:,apple:,codesign: -s -k hjdev ~/Library/Keychains/login.keychain-db
xcodebuild -archivePath"./build/${IPANAME}-iphoneos/hjdev.xcarchive" \
-workspace "hjdev.xcworkspace" -sdk iphoneos-scheme "${IPANAME}" \
-configuration "Release" archive
xcodebuild -exportArchive -archivePath"./build/${IPANAME}-iphoneos/hjdev.xcarchive" \
-exportPath "./build/${IPANAME}" -exportOptionsPlist "../hjEntDisExportOptions.plist"\
-allowProvisioningUpdates
上傳蒲公英腳本:
IPANAME="HJ_EntDev"
curl -F "file=@./build/${IPANAME}/${IPANAME}.ipa" -F "uKey=05cac7a8d17b3265d0fb3fda30b66751" -F "_api_key=d25e34087622e5c01d8810c328c125ee" http://www.pgyer.com/apiv1/app/upload
2.2.2 adhoc包腳本
打包腳本:
IPANAME="HJ_AdhocDis"
securityset-key-partition-list -S apple-tool:,apple:,codesign: -s -k hjdev ~/Library/Keychains/login.keychain-db
xcodebuild-archivePath "./build/${IPANAME}-iphoneos/hjdev.xcarchive" \
-workspace"hjdev.xcworkspace" -sdk iphoneos -scheme "${IPANAME}" \
-configuration"Release" archive
xcodebuild-exportArchive -archivePath"./build/${IPANAME}-iphoneos/hjdev.xcarchive" \
-exportPath"./build/${IPANAME}" \
-exportOptionsPlist"../HJAdhocDisExportOptions.plist" \
-allowProvisioningUpdates
上傳蒲公英腳本:
IPANAME="HJ_AdhocDis"
curl -F "file=@./build/${IPANAME}/${IPANAME}.ipa" \
-F"uKey=05cac7a8d9865f0bd0fb3fda30b66751" -F "_api_key=d25e3403921985c01d8810c328c125ee" http://www.pgyer.com/apiv1/app/upload
2.2.6 全自動參數(shù)化打包腳本
打包腳本:
securityset-key-partition-list -S apple-tool:,apple:,codesign: -s -k hjdev ~/Library/Keychains/login.keychain-db
xcodebuild-archivePath "./build/${BuildType}-iphoneos/hjdev.xcarchive" \
-workspace"hjdev.xcworkspace" -sdk iphoneos -scheme "${BuildType}" \
-configuration"Release" archive
xcodebuild-exportArchive -archivePath"./build/${BuildType}-iphoneos/hjdev.xcarchive" \
-exportPath"./build/${BuildType}" \
-exportOptionsPlist"../${BuildType}ExportOptions.plist" \
-allowProvisioningUpdates
上報蒲公英腳本:
curl -F "file=@./build/${BuildType}/${BuildType}.ipa" \
-F "uKey=05cac7a812375f0bd0fb3fda30b66751" -F \ "_api_key=d25e340391b2e59742810c328c125ee" http://www.pgyer.com/apiv1/app/upload
2.3 設置任務超時
jenkins設置任務超時 超過限定時間停止任務
http://blog.csdn.net/dengruijin/article/details/52847860
????????jenkins的”build timeout plugin”插件可以幫我們完成該任務。我使用的是jenkins-2.7.1, 默認就已經(jīng)安裝了該插件谅海,如果默認沒有安裝可在插件管理中搜索進行安裝脸哀。
任務超時配置如下圖:
2.4 權(quán)限修改
2.4.1遞歸修改所有權(quán)限
命令 : sudo chmod -R 777 tools_command/
解釋 : -R 為遞歸遍歷tools_command文件夾, chmod 755修改權(quán)限
2.5 Jenkins配置遠程節(jié)點(解決Linux上iOS打包)
????????iOS打包無法在Linux上進行,因為Jenkins的Xcode插件需要調(diào)用Xcode扭吁,Xcode只能在OSX系統(tǒng)下安裝撞蜂。
2.5.1 登錄Jenkins,添加MacOSX節(jié)點
系統(tǒng)管理?管理節(jié)點?新建節(jié)點
????當前master為Linux系統(tǒng)
2.5.2 輸入節(jié)點名稱侥袜,勾選PermanentAgent
2.5.3 開啟要綁定OSX系統(tǒng)電腦的遠程登錄
系統(tǒng)偏好設置?共享?勾選?遠程登錄
????獲取遠程登錄的用戶名和IP
2.5.4 配置節(jié)點
??? 若沒有Launch slave agents on Unix machines via SSH選項蝌诡,需要安裝SSH Slaves plugin插件
????若沒有Keychains and Provisioning Profiles Management選項,需要安裝kpp-management-plugin插件
2.5.5 節(jié)點創(chuàng)建完成
????節(jié)點創(chuàng)建完成后會自動連接
2.5.6 選擇MacOSX節(jié)點
General?勾選?Restrict where this project can be run?輸入?MacOSX
2.5.7 正在MacOSX上構(gòu)建
2.6 自動上傳蒲公英
jenkins+xcode+蒲公英實現(xiàn)ipa自動化打包
http://www.cocoachina.com/ios/20170811/20218.html
Jenkins持續(xù)集成打包+上傳蒲公英
http://blog.csdn.net/yaoliangjun306/article/details/72471429
使用Jenkins實現(xiàn)持續(xù)集成蒲公英(iOS)
https://www.pgyer.com/doc/view/jenkins_ios
實現(xiàn)腳本代碼:
curl -F "file=@/Users/Shared/Jenkins/Home/workspace/IOS_Ent_Dis/build/HJ_EntDis/HJ_EntDis.ipa"\
-F "uKey=05cac765327b5f0bd0fb3fda30b66751" -F "_api_key=d25e398641b2e5c01d8810c328c125ee" http://www.pgyer.com/apiv1/app/upload
3 常見問題
3.1 配置問題
3.1.1 構(gòu)建報錯:jenkins xcodebuild: error: The directorydoes not contain an Xcode project or workspace
原因:
其實在于keychain跟provisionfile沒配置好
3.1.2 xcodebuild: error: The flag -scheme is required when specifying-archivePath but not -exportArchive.
????????此問題一是由于工程的scheme文件沒有設置shared:
????二是由于工程配置中沒指定對scheme文件名:
3.1.3 FATAL: Unable to delete '/Users/Shared/Jenkins/Home/Package/.DS_Store'
????????此為權(quán)限問題枫吧,是因為Jackins賬號對新建的Package目錄沒有寫權(quán)限導致浦旱,添加Jackins讀寫權(quán)限即可。
3.1.4 code sign failed with?exit code 1
????????此問題為項目工程中證書設置問題九杂,需要設置為發(fā)布證書來打包闽寡。
3.1.5 error: exportArchive:
????"hjdev.app" requires a provisioning profile with the Push Notifications and Associated Domains features
????注意:升級 Xcode 9 之后,編譯完成之后打包會一直報如下所示的錯誤:
error: exportArchive:"APPNAME.app" requires a provisioning profile with the PushNotifications feature.
ErrorDomain=IDEProvisioningErrorDomain Code=9 ""APPNAME.app" requiresa provisioning profile with the Push Notifications feature."UserInfo={NSLocalizedDescription="APPNAME.app" requires aprovisioning profile with the Push Notifications feature.,NSLocalizedRecoverySuggestion=Add a profile to the"provisioningProfiles" dictionary in your Export Options propertylist.}
** EXPORT FAILED **
Failed to build/Users/Tolecen/.jenkins/workspace/APPNAME/build/APPNAME_release.ipa
Build step 'Xcode' marked build asfailure
Finished: FAILURE
????????因為 Xcode 9 默認不允許訪問鑰匙串的內(nèi)容尼酿,必須要設置allowProvisioningUpdates 才會允許爷狈,但是由于 Xcode integration 插件封閉,并不能對其進行修改加上這個屬性裳擎,所以決定使用 Shell 腳本代替插件涎永。
解決方案
將 Jenkins 項目里的 Xcode ?構(gòu)建步驟去掉,使用下面所示的命令:
xcodebuild -archivePath "/Users/USERNAME/.jenkins/workspace/APPNAME/build/Debug-iphoneos/APPNAME.xcarchive" -project APPNAME.xcodeproj -sdk iphoneos -scheme "SCHEMENAME" -configuration "Debug" archive
xcodebuild -exportArchive -archivePath "/Users/USERNAME/.jenkins/workspace/APPNAME/build/Debug-iphoneos/BasketballLeague.xcarchive" -exportPath "/Users/USERNAME/.jenkins/workspace/APPNAME/build/APPNAME_debug" -exportOptionsPlist '/Users/USERNAME/.jenkins/workspace/APPNAME/build/ExportOptions.plist' -allowProvisioningUpdates
????????如果是 workspace 的項目,那就將上面第一段的命令中 -project APPNAME.xcodeproj 修改為 -workspace APPNAME.xcworkspace 即可羡微。
3.1.6 scheme錯誤
????????打開Xcode->manageSchema谷饿,把share勾上
3.1.7 error: Couldn't load -exportOptionsPlist: The file “ad-hocExport.plist” couldn’t be opened because there is no such file.
????????其原因在于自動打包腳本中設置的文件路徑不對,導致plist文件找不到妈倔。
3.1.8?安裝了jenkins之后:8080卻訪問不了
????????此原因在于java SDK版本不對博投,需要安裝java 8
3.1.9?CodeSign error: code signing is required for product type?Application in SDK
????????Jenkins打包如如題錯誤時,有可能是provisioning profile文件不是最新版本盯蝴,導致引用的與工程指定的不一致毅哗。
3.1.10 打包報錯unknown error-1=ffffffffffffffff
????????此問題為證書簽名問題,但是可能的原因有兩個:
????1. jekins用戶訪問login.keychain的權(quán)限問題捧挺;
????2. shell腳本放在一行虑绵,字符串超長問題;
3.1.10.1 問題一解決方案一unlockkeychain文件
????1闽烙、采用腳本unlock翅睛;
security list-keychains
????然后會輸出
/Users/caijin/Library/Keychains/login.keychain-db
/Library/Keychains/System.keychain
然后執(zhí)行
security unlock-keychain -p "password" /Users/hjdev/Library/Keychains/login.keychain-db
security unlock-keychain -p "hjdev" /Users/Shared/Jenkins/Library/Keychains/login.keychain-db
security unlock-keychain -p "hjdev" /Users/Shared/Jenkins/Home/workspace/IOS_Ent_Pre/login.keychain
// 路徑要填寫你自己login.keychin-db的這個路徑? "password"就是你自己電腦鑰匙串的密碼
3.1.10.2 問題一解決方案二忽略授權(quán)提示框
????然后還可以執(zhí)行:
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k password ${KEYCHAIN}
正式命令:
sudo security set-key-partition-list -Sapple-tool:,apple:,codesign: -s -k hjdev /Users/Shared/Jenkins/Library/Keychains/login.keychain-db
sudo security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k hjdev /Users/hjdev/Library/Keychains/login.keychain-db
sudo security set-keychain-settings~/Library/Keychains/login.keychain
sudo security set-keychain-settings /Users/hjdev/Library/Keychains/login.keychain
問題原因:
????????unlock keychain,這是個坑黑竞,當你在自己的命令行里直接執(zhí)行xcodebuild的時候捕发,就像沒我們第一次使用xcode簽名一樣,會迸出keychain的提示很魂,問你是否允許xcode使用keychain里的證書來簽名扎酷,點了一次始終允許以后下次便不會再提示,直接在命令行使用xcodebuild也一樣莫换,但是放在編譯腳本不管你點沒點過“始終允許”都會報“unknown error -1=ffffffffffffffff Command
/usr/bin/codesign failed with exit code 1” 的奇怪錯誤,解決方法是:
securityset-key-partition-list -S apple-tool:,apple:,codesign: -s -k “YOUR_PASSWORD“ /Users/Shared/Jenkins/Library/Keychains/login.keychain-db
3.1.10.3 問題一解決方案三加入admin組
????????將jekins用戶加入admin用戶組骤铃,獲取最高權(quán)限拉岁。然后重啟Jenkins。
3.1.10.4 問題一解決方案四清理緩存
清理緩存文件:
cd /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData
xattr –rc *
cd /Users/hjdev/Library/Developer/Xcode/DerivedData
xattr –rc *
3.1.10.5 問題一解決方案五補齊ExportOptions.plist文件
????????也有可能是導出用的plist文件缺失惰爬,因為里面包含了provisioning profile的關聯(lián)關系喊暖。
HJEntDisExportOptions.plist
3.1.10.6 問題二解決方案
????????將shell腳本加入換行連接符、分行輸入撕瞧,例如:
xcodebuild -archivePath "/Users/Shared/Jenkins/Home/workspace/IOS_Adhoc/build/EntDis-iphoneos/hjdev.xcarchive"\
-workspace "/Users/Shared/Jenkins/Home/workspace/IOS_Adhoc/hjdev.xcworkspace" -sdkiphoneos -scheme "hjdev" -configuration "Release" archive
3.1.11 Code Signing Error: No profile for team'G3D7634K6P' matching 'adhoc_dis' found:?Xcode couldn't find any provisioning profiles matching'G3D7634K6P/adhoc_dis'
構(gòu)建時報錯:
Code Signing Error: No profile for team 'G3D7634K6P' matching 'adhoc_dis' found:? Xcodecouldn't find any provisioning profiles matching 'G3D7634K6P/adhoc_dis'
原因:
????????沒有將管理員賬號下的provisioning profile文件拷貝至Jenkins用戶目錄下去陵叽。
3.1.12 Code Signing Error: Provisioning profile"HJ_Ent_Dis" doesn't include signing certificate "iPhoneDistribution: China dev Co., Ltd.".
構(gòu)建報錯:
Code Signing Error: Provisioning profile "HJ_Ent_Dis" doesn't include signing certificate"iPhone Distribution: China dev Co., Ltd.".
原因分析:
????????原因在于Provisioning profile與簽名證書沒對應上,鑰匙串中存在兩個同名證書丛版,應該只保留真正使用的那個巩掺。
? ? ? ? 另外,還有一個原因是Mac OS賬號jenkins名下其實并沒有安裝該證書页畦,只是系統(tǒng)登錄賬號下安裝了胖替,而jenkins構(gòu)建時是使用Jenkins帳號進行的,其名下找不到證書自然就報錯了。
3.1.13 error: Couldn't load -exportOptionsPlist: Thefile “${BuildType}ExportOptions.plist” couldn’t be opened because there is nosuch file.
參數(shù)化構(gòu)建時報錯:
+ xcodebuild -exportArchive-archivePath ./build/HJ_EntPre-iphoneos/hjdev.xcarchive -exportPath./build/HJ_EntPre -exportOptionsPlist '../${BuildType}ExportOptions.plist'-allowProvisioningUpdates
error: Couldn't load-exportOptionsPlist: The file “${BuildType}ExportOptions.plist” couldn’t beopened because there is no such file.
原因:
????????對于帶參數(shù)的命令独令,參數(shù)不能用在單引號(‘)字符串中端朵,只能用在雙引號(“)字符串中,一定要注意H技3迥亍!
4 參考鏈接
(Very Good)最全Jenkins+SVN+iOS+cocoapods環(huán)境搭建及其錯誤匯總
https://www.cnblogs.com/weiming4219/p/7778699.html
詳解Shell腳本實現(xiàn)iOS自動化編譯打包提交
http://www.reibang.com/p/bd4c22952e01
Jenkins配置節(jié)點(解決Linux上iOS打包)
http://www.reibang.com/p/f445983512b7
(Good)?IOS使用Jenkins持續(xù)集成
http://www.cnblogs.com/bhlsheji/p/5032723.html
iOS 中使用Jenkins進行持續(xù)集成
http://www.cocoachina.com/ios/20170607/19464.html
手把手教你利用Jenkins持續(xù)集成iOS項目
http://www.reibang.com/p/41ecb06ae95f
搭建iOS自動化打包平臺(利用Jenkins持續(xù)集成iOS項目)
http://blog.csdn.net/u013602835/article/details/54632843
Jenkins整合XCode詳解
http://blog.csdn.net/youtk21ai/article/details/48719807
(Good)iOS 通過Jenkins 自動構(gòu)建ipa
http://www.reibang.com/p/ce36997919b4
(Good)jenkins xcodebuild命令行打包iOS項目問題匯總
http://blog.csdn.net/offbye/article/details/51506256
Jenkins構(gòu)建ios包常見問題解決
http://www.reibang.com/p/b6433cad6ad1
Xcode 9 在 Jenkins 自動打包腳本 中使用 Xcode integration 插件打包失敗的原因
http://blog.csdn.net/hou_manager/article/details/78201221?locationNum=10&fps=1
jenkins打包一直報unknown error -1=ffffffffffffffff解決 (注意 別忘了重啟電腦)
http://www.reibang.com/p/cda327047524
【Mac】解決jenkins執(zhí)行shell腳本等場景中遇見的權(quán)限不足問題
http://blog.csdn.net/hszxd479946/article/details/78831909
iOS 通過Jenkins 自動構(gòu)建ipa
http://www.reibang.com/p/ce36997919b4
XCode8.2 Jenkins 集成遇到的問題No profile matching招狸,/codesign failed withexit code 1
http://www.reibang.com/p/5591fe0c6770
MAC Jenkins搭建過程和遇到的問題敬拓!
http://blog.csdn.net/goodai007/article/details/51684303
Execute shell failure
http://jenkins-ci.361315.n4.nabble.com/Execute-shell-failure-td4645353.html
Jenkins加Shell實現(xiàn)最簡單的持續(xù)部署
http://blog.csdn.net/neutrojan/article/details/41854883
Codesign returned unknown error
-1=ffffffffffffffff
https://stackoverflow.com/questions/44173831/codesign-returned-unknown-error-1-ffffffffffffffff
xcodebuild命令行編譯問題匯總
http://blog.csdn.net/dongwuming/article/details/77061885
jenkins打包一直報unknownerror -1=ffffffffffffffff解決 (注意 別忘了重啟電腦)
http://www.reibang.com/p/cda327047524
Jenkins Xcode build works but aichive
failed with Command /usr/bin/codesign failed with exit code 1
codesigning fails with
"unknown error -1=ffffffffffffffff"?#8797
https://github.com/fastlane/fastlane/issues/8797
【Jenkins常見問題解決】01. Mac上使用Jenkins持續(xù)集成報錯Can’t connect to window server – not enoughpermissions.
http://blog.csdn.net/wirelessqa/article/details/8647771
8 can't archive “Command /usr/bin/codesign failed with exit code 1”
xcodebuild命令官方說明
http://www.reibang.com/p/4f4d16326152
returned: -25308
https://stackoverflow.com/questions/41451502/xcodebuild-error-seckey-api-returned-25308
security / codesign in Sierra:
Keychain ignores access control settings and UI-prompts for permission