一說到自動(dòng)打包很多人想到的就是jenkins,正好這段時(shí)間比較閑,我也研究了一下利用jenkins來自動(dòng)打包上傳蒲公英炸卑。
我看到網(wǎng)上有很多寫Jenkins的文章辑舷,但是我發(fā)現(xiàn)我按照網(wǎng)上的文章步驟一步一步去弄還是踩了不少坑悔叽,費(fèi)了不少勁疾宏,可能是每個(gè)人的項(xiàng)目情況背景不一樣碟案,所以碰到的問題物臂,處理問題的方法也不一樣吧壮啊。Jenkins安裝網(wǎng)上有很多教程這里我就不說的嫉鲸,我就說說我自己的項(xiàng)目情況,及我在配置的過程中所遇到的問題及如何解決的。
所以說這篇文章就建立在你已經(jīng)裝好了jenkins環(huán)境的基礎(chǔ)上的歹啼。
項(xiàng)目情況:
- cocopods代碼管理
- 碼云源碼管理
- 上傳蒲公英
- Xcode9.2
- 打包用的手動(dòng)簽名
1.新建配置流程
瀏覽器輸入:http://localhost:8080 打開jenkins 輸入jenkins賬號(hào)密碼
輸入你的項(xiàng)目名稱玄渗,選擇構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目座菠,然后確認(rèn),你就會(huì)來到這個(gè)頁(yè)面:
這里我想特別提一下
general->源碼管理->構(gòu)建觸發(fā)器->構(gòu)建環(huán)境->構(gòu)建->構(gòu)建后操作 我們?cè)趫?zhí)行構(gòu)建的時(shí)候
是按這個(gè)順序去執(zhí)行的藤树,所以當(dāng)我們?cè)跇?gòu)建的過程中只要前面的有錯(cuò)浴滴,后面的就不會(huì)再執(zhí)行了,比
如我在源碼管理這一塊配置錯(cuò)了岁钓,那么我在構(gòu)建的時(shí)候源碼管理后面的就都不會(huì)再執(zhí)行了升略,你解決
錯(cuò)誤的時(shí)候就看源碼管理的這塊就行,執(zhí)行到哪里有錯(cuò)我們就解決哪里的問題
一.General配置
到這里General配置基本就這么多翰撑。
二.源碼管理
源碼我們先項(xiàng)目用的是碼云的git管理,配置如下:
選Git->git倉(cāng)庫(kù)地址(URL)->驗(yàn)證(Credentials)->需要拉取的分支帶啦(這里我拉取的是master代碼)拓型,一般我們git管理有兩種url地址额嘿,一種是git@*****.git格式的,一種是https://****.git劣挫。這里我選擇的是git@的,這種需要ssh驗(yàn)證东帅,需要添加公鑰压固,私鑰。而https則需要我在add那里添加賬號(hào)密碼靠闭,但是親測(cè)https的即便添加了賬號(hào)密碼也還是沒有克隆下來帐我,一直停留在checking那一步?jīng)]有動(dòng)了,后面查資料說https的還要做其它操作愧膀,因而我放棄了采用了git ssh驗(yàn)證的方式添加公鑰私鑰拦键。具體操作如下:
-
打開終端, 輸入命令 cd ~/.ssh 進(jìn)入.ssh文件下檩淋,然后輸入:ssh-keygen -t rsa -C "賬號(hào)"芬为,按下來按回車會(huì)出現(xiàn)給公鑰起名,起過名之后再給公鑰設(shè)置密碼(如果不需要設(shè)置密碼直接按回車)蟀悦,結(jié)果如下:
C8F46B07-3F9A-4C56-86FC-EAD3427BF877.png
然后ls ,我們就可以看到.ssh 問價(jià)夾下多了test跟test.pub兩個(gè)文件
屏幕快照 2018-01-11 上午10.03.09.png -
碼云配置,登錄碼云媚朦,點(diǎn)設(shè)置->SSH公鑰,添加標(biāo)題日戈,然后把剛剛生成的test.pub文件內(nèi)容粘貼到公鑰哪里询张,確認(rèn),到此碼云配置就OK了
B0C39F48-D55A-47EA-A641-768B25DD614D.png -
jenkins配置浙炼》菅酰回到j(luò)enkins源碼管理唯袄,為Git添加Credentials。點(diǎn)擊Add:
屏幕快照 2018-01-11 上午10.15.07.pngKind選擇SSH Username with PrivateKey ,用戶名可以自己看著填蜗帜,將剛剛生成的test 文件內(nèi)容(即私鑰)粘貼到Key里面確認(rèn)添加恋拷。源碼管理到目前為止就差不多了,我們從git上下載源碼的時(shí)候由于網(wǎng)速及其它因素钮糖,可能時(shí)間會(huì)比較長(zhǎng)梅掠,但是Jenkins默認(rèn)的克隆過期時(shí)間為10分鐘,所以我們可以設(shè)置長(zhǎng)一點(diǎn)店归,我這里設(shè)置了50分鐘
屏幕快照 2018-01-11 上午10.22.02.png
三.構(gòu)建觸發(fā)器
我這里設(shè)置的是每天6點(diǎn)到18點(diǎn)阎抒,每隔一小時(shí)檢查有沒有源碼更新構(gòu)建一次,具體的你可以自己定義消痛,網(wǎng)上有很多相關(guān)教程
jenkins構(gòu)建觸發(fā)器定時(shí)任務(wù)Build periodically和Poll SCM【轉(zhuǎn)載】
四.構(gòu)建環(huán)境
這塊我都是默認(rèn)的沒有做選擇且叁,因?yàn)槲业膞code配置,證書配置都是根據(jù)后面的腳本來完成的
四.構(gòu)建
點(diǎn)擊增加構(gòu)建步驟秩伞,執(zhí)行腳本
為了方便說明我這里建了兩個(gè)shell逞带,第一個(gè)shell是做pod操作,因?yàn)槲业拇a是cocopods管理的纱新,所以在下載完源碼后先要執(zhí)行pod install ,才能繼續(xù)后續(xù)的打包上傳
先cd到項(xiàng)目響應(yīng)目錄下展氓,這個(gè)目錄是Jenkins克隆源代碼后的目錄,然后執(zhí)行pod install
cd "${WORKSPACE}/XZXSchool"
export LANG=en_US.UTF-8
/usr/local/bin/pod install
第二個(gè)shell是打包上傳相關(guān)的腳本了
#鑰匙串路徑 這幾句的意思是允許訪問鑰匙串脸爱,因?yàn)槲覀冊(cè)诖虬臅r(shí)候需要訪問鑰匙串 用里面的證書文件
KEY_PATH="/Users/Shared/Jenkins/Library/Keychains/login.keychain"
/usr/bin/security unlock-keychain -p ***(密碼) ${KEY_PATH}
/usr/bin/security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k ***(密碼) ${KEY_PATH}
/usr/bin/security set-keychain-settings ${KEY_PATH}
#工程名
APP_NAME="XZXSchool"
#目標(biāo)名
##
CONFIGURATION="Release"
#證書
CODE_SIGN_DEVELOPER="iPhone Developer: **** (****)"
#info.plist路徑
project_infoplist_path="${WORKSPACE}/XZXSchool/XZXSchool/Info.plist"
#取版本號(hào)
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" ${project_infoplist_path})
DATE="$(date +%Y%m%d)"
IPANAME="${APP_NAME}_V${bundleShortVersion}_${DATE}.ipa"
#要上傳的ipa文件路徑
IPA_PATH="${WORKSPACE}/ipa"
#rm -rf $IPAPATH
#mkdir -pv $IPAPATH
ARCHIVE_NAME="${APP_NAME}.xcarchive"
#workspace路徑
WORKSPACE_PATH="${WORKSPACE}/XZXSchool/XZXSchool.xcworkspace"
#echo "+++++++++++++++++clean+++++++++++++++++"
#ExportOptions.plist文件生成遇汞,我們可以在Xcode中選好證書,按平時(shí)的流程手動(dòng)打包簿废,打包成功后會(huì)有一個(gè)ExportOptions.plist文件空入,我們將這個(gè)文件復(fù)制到下面這個(gè)相應(yīng)目錄下就行,然后我們的jenkins 就會(huì)自動(dòng)打包一個(gè)跟我們手動(dòng)打包的流程一樣的IPA包
ExportOptionsPlistPath="${WORKSPACE}/ExportOptions/ExportOptions.plist"
xcodebuild -workspace ${WORKSPACE_PATH} -scheme "${APP_NAME}" clean
#echo "+++++++++++++++++Build+++++++++++++++++"
xcodebuild -workspace ${WORKSPACE_PATH} -scheme "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DEVELOPER}"
#echo "+++++++++++++++++Run+++++++++++++++++"
xcodebuild archive -workspace ${WORKSPACE_PATH} \
-scheme ${APP_NAME} \
CFBundleVersion=${bundleShortVersion} \
-destination generic/platform=ios \
-archivePath ${IPA_PATH}/${ARCHIVE_NAME}\
xcodebuild -exportArchive -archivePath ${IPA_PATH}/${ARCHIVE_NAME}\
-exportPath ${IPA_PATH}\
-destination generic/platform=ios\
-exportOptionsPlist ${ExportOptionsPlistPath}\
-allowProvisioningUpdates
#蒲公英上的User Key
uKey="*****************"
#蒲公英上的API Key
apiKey="*******************"
#蒲公英密碼
PASSWORD="********"
#MSG=git log -1 —pretty=%B
#執(zhí)行上傳至蒲公英的命令
echo "++++++++++++++upload+++++++++++++"
curl -F "file=@${IPA_PATH}/XZXSchool.ipa" -F "uKey=${uKey}" -F "_api_key=${apiKey}" -F "updateDescription=${MSG}" -F "password=${PASSWORD}" http://www.pgyer.com/apiv1/app/upload
記住里面所有的路徑都是jenkins目錄下的項(xiàng)目路徑族檬。打包上傳腳本大致就是這些歪赢。但我們寫完后還是發(fā)現(xiàn)會(huì)報(bào)錯(cuò)
- 問題1
iOS編譯簽名文件找不到
Check dependencies
Code Sign error: No codesigning identities found: No codesigning identities (i.e. certificate and private key pairs) that match the provisioning profile specified in your build settings
(“testxxxxx_Distribution_inhouse_01”) were found.
原因是jenkins以jenkins用戶身份運(yùn)行,iOS項(xiàng)目編譯用的簽名文件要從安裝證書時(shí)的用戶目錄
~/Library/MobileDevice/Provisioning Profiles
拷貝到
/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles
- 問題2
iOS編譯證書找不到
Check dependencies
Code Sign error: No codesigning identities found: No codesigning identities (i.e. certificate and private key pairs) that match the provisioning profile specified in your build settings
(“testxxxxx_Distribution_inhouse_01”) were found.
沒找到證書单料,打開“鑰匙串訪問”埋凯,從“登錄”拷貝安裝的證書到“系統(tǒng)”下
- 問題3
User interaction is not allowed.
Signing Identity: "iPhone Distribution: ****************** Co., Ltd."
Provisioning Profile: "************"
/usr/bin/codesign --force --sign ************************************ --entitlements /Users/Shared/Jenkins/Home/workspace/****/build/**************.build/Release-iphoneos/*************.build/****.***.****--timestamp=none /Users/Shared/Jenkins/Home/workspace/********/build/Release-iphoneos/****.app
/Users/Shared/Jenkins/Home/workspace/*****/build/Release-iphoneos/****.app: User interaction is not allowed.
Command /usr/bin/codesign failed with exit code。
拷貝~/Library/Keychains/login.keychain到
Users/Shared/Jenkins/Library/Keychains/login.keychain
暫時(shí)先總結(jié)這么多看尼,如果按照步驟還有啥不懂的递鹉,有問題的,留言看到我會(huì)回復(fù)的