Travis-CI持續(xù)構(gòu)建生產(chǎn)實(shí)踐

前文


持續(xù)構(gòu)建一直是比較熱門(mén)的話題董瞻,通過(guò)持續(xù)集成可以自動(dòng)編譯、打包田巴、簽名項(xiàng)目钠糊,配合單元測(cè)試可以實(shí)現(xiàn)持續(xù)集成+自動(dòng)化測(cè)試。本文在結(jié)合CI的基礎(chǔ)上壹哺,通過(guò)fir-cli的發(fā)布命令抄伍,完成了持續(xù)集成+自動(dòng)化部署。讓工程師從重復(fù)而又枯燥的手動(dòng)打包完全解放出來(lái)管宵,讓工程師能更加專注于代碼本身截珍,最大限度的減少誤操作風(fēng)險(xiǎn)攀甚,降低修復(fù)錯(cuò)誤代碼的成本,大幅提高工作效率岗喉。

圍繞Travis-CI持續(xù)構(gòu)建的核心文件.travis.yml云稚,根據(jù)實(shí)操所需,涉及到每個(gè)具體的點(diǎn)時(shí)再進(jìn)一步講解相關(guān)配置沈堡,避免前期做一些零散、關(guān)聯(lián)性不強(qiáng)的操作產(chǎn)生混亂燕雁,基于操作流程再進(jìn)一步細(xì)分到對(duì)應(yīng)的配置點(diǎn)诞丽,由上而下,由里到外的了解Travis-CI的運(yùn)行步驟及可能遇到的問(wèn)題的解決辦法拐格。

Travis-CI


如果你的項(xiàng)目是托管在Github上僧免,那么Travis-CI是做持續(xù)集成非常好的選擇。在Ruby的世界里捏浊,Travis-CI已久負(fù)盛名懂衩,從2013年4月起,Travis-CI也相繼支持iOS金踪、Android浊洞、Java平臺(tái)。

本文主要講解在iOS線上實(shí)際項(xiàng)目中集成Travis-CI胡岔,不僅包括項(xiàng)目的編譯法希、打包、簽名靶瘸,還包括將應(yīng)用部署到fir.im測(cè)試平臺(tái)上苫亦。

與Github集成


對(duì)于公有Github倉(cāng)庫(kù),注冊(cè)一個(gè)Travis公有賬號(hào)怨咪,對(duì)于私有Github倉(cāng)庫(kù)屋剑,需要注冊(cè)一個(gè)Travis專業(yè)版賬號(hào)

登錄成功后诗眨,需要為項(xiàng)目開(kāi)啟Travis支持唉匾,導(dǎo)航到屬性頁(yè)面,該頁(yè)面列出來(lái)所有Github項(xiàng)目匠楚,如果github賬號(hào)有加入到其它組織肄鸽,該組織授權(quán)的項(xiàng)目也能看到。注意油啤,如果伺候創(chuàng)建了一個(gè)新的倉(cāng)庫(kù)典徘,要使用Sync按鈕進(jìn)行同步,Travis只會(huì)偶爾更新你的項(xiàng)目列表。


打開(kāi)上圖開(kāi)關(guān)就可以為你的項(xiàng)目添加Travis服務(wù)初澎,把按鈕置為綠色就行,這樣Travis這邊的配置就完成了序仙。然后去 Github 關(guān)聯(lián)的 Repo 中梅鹦,找到 Settings - Webhooks&Services 中添加 Webhook 即可裆甩,不需要填信息,直接 test 就能通過(guò)齐唆,如下圖所示:?

按照上述步驟嗤栓,就成功將Travis-CI和Github關(guān)聯(lián)起來(lái)了。

配置Travis-CI


Travis-CI通過(guò)配置文件.travis.yml來(lái)工作箍邮,文件存放在項(xiàng)目的根目錄下茉帅,下面我們開(kāi)始配置這個(gè)文件。注意锭弊,文件名前面有個(gè)點(diǎn)堪澎,在mac系統(tǒng)里會(huì)如果沒(méi)顯示隱藏文件在建完該文件后找不到該文件,命令行執(zhí)行如下命令即可顯示所有隱藏文件味滞,將命令中true改為false執(zhí)行即隱藏樱蛤。

defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder

簡(jiǎn)單配置


對(duì)于iOS項(xiàng)目,Travis CI支持Objective-C剑鞍、Swift語(yǔ)言進(jìn)行部署昨凡。Travis 編譯器運(yùn)行在虛擬機(jī)環(huán)境下。該編譯器已經(jīng)利用 Ruby蚁署,Homebrew土匀,CocoaPods,xctool 和一些默認(rèn)的編譯腳本進(jìn)行過(guò)預(yù)配置形用。如本地調(diào)試時(shí)出現(xiàn)相關(guān)command not found就轧,下載對(duì)應(yīng)的環(huán)境即可,此處不做介紹田度。

本文默認(rèn)所有密碼為123456妒御, 防止密碼過(guò)多導(dǎo)致讀者操作出現(xiàn)失誤,密碼也不通過(guò) travis encrypt"KEY_PASSWORD={password}"--add 命令進(jìn)行加密镇饺,涉及到密碼相關(guān)的都當(dāng)做環(huán)境變量放在Travis里當(dāng)前項(xiàng)目的setting --?Environment Variables中乎莉,讀者后續(xù)根據(jù)自己實(shí)際情況進(jìn)行調(diào)整。

Travis-CI構(gòu)建流程


Travis手動(dòng)構(gòu)建命令流程如下奸笤,詞如其意惋啃,如下所有命令都是在debug調(diào)試模式下手動(dòng)執(zhí)行調(diào)用的,在yml文件里執(zhí)行的流程命令全部要去除命令前面的“travis_run_”监右,如before_install边灭、before_script等,命令解釋如下:

1.travis_run_before_install:極早的流程步驟健盒,安裝一些需要的環(huán)境绒瘦,如fir平臺(tái)的fir-cli插件等

2.travis_run_before_script:在編譯称簿、打包前需要執(zhí)行的一些操作,如導(dǎo)入相關(guān)證書(shū)惰帽、描述文件等

3.travis_run_script:編譯憨降、打包、簽名等操作執(zhí)行的階段该酗,其中簽名是最耗時(shí)的步驟

4.travis_run_after_success:將打包好的ipa上傳到三方平臺(tái)等操作授药,如pgy、fir等

5.travis_run_after_script:清理操作呜魄,刪除臨時(shí)keychain悔叽、描述文件等

6.travis_run_after_deploy:收尾的一些操作,暫未用到

一個(gè)完整的.travis.yml文件如下耕赘,圖中的命令與上面手動(dòng)構(gòu)建命令對(duì)應(yīng),其中注釋了的腳本自動(dòng)忽略:

scripts目錄結(jié)構(gòu)


Travis涉及到的根路徑下的文件就兩個(gè)膳殷,一個(gè)是yml文件操骡,另一個(gè)就是scripts文件夾,scripts也是手動(dòng)創(chuàng)建的赚窃,除yml文件以外的所有Travis相關(guān)配置都放在這個(gè)文件里面册招,該文件夾包括兩個(gè)子文件夾,certs勒极、profile是掰、四個(gè)shell腳本(evn.sh腳本沒(méi)用,忽略)辱匿、兩個(gè)plist文件键痛,script文件夾結(jié)構(gòu)如下圖:

配置詳解


yml文件里,before_install里執(zhí)行一些所需要的環(huán)境的安裝匾七,接下來(lái)到before_script絮短,里面執(zhí)行了一個(gè)add_key.sh的腳本,腳本里ENCRYPTION_SECRET昨忆、KEY_PASSWORD倆個(gè)是環(huán)境變量丁频,在Travis里當(dāng)前項(xiàng)目的setting --?Environment Variables下配置,SCHEME_SANDBOX是當(dāng)前scheme名稱邑贴,可以運(yùn)行xcodebuild -list命令查看當(dāng)前的scheme席里、target、configurations拢驾,TRAVIS_BRANCH是Travis的常量奖磁,用于獲取當(dāng)前所在的git分支。

add_key.sh腳本大致邏輯是繁疤,解密cer署穗、p12文件 -- 創(chuàng)建臨時(shí)keychain -- 解鎖臨時(shí)keychain -- 設(shè)置keychain失效時(shí)間 -- 將解密后的cer寥裂、p12導(dǎo)進(jìn)keychain -- 遍歷profile下所有的文件解密,并重命名為該文件的UUID -- 將解密后重命名為UUID后的名字移動(dòng)到Travis虛擬機(jī)環(huán)境的描述文件目錄 -- 指定codesigning的臨時(shí)keychain案疲。

add_key.sh內(nèi)容如下:

#!/usr/bin/env bash

SHELL_DIR=$(cd"$(dirname "$0")"; pwd)

pushd ${SHELL_DIR}

SCHEME_SANDBOX=Sandbox

KEYCHAIN_PASSWORD=travis

#echo "*** $TRAVIS_BRANCH"

openssl aes-256-cbc -k $ENCRYPTION_SECRET -incerts/${SCHEME_SANDBOX}.cer.enc -d -a -out certs/${SCHEME_SANDBOX}.cer

openssl aes-256-cbc -k $ENCRYPTION_SECRET -incerts/${SCHEME_SANDBOX}.p12.enc -d -a -out certs/${SCHEME_SANDBOX}.p12

security -v create-keychain -p ${KEYCHAIN_PASSWORD} ios-build.keychain

security -v default-keychain -s ios-build.keychain

security -v unlock-keychain -p ${KEYCHAIN_PASSWORD} ios-build.keychain

security -v set-keychain-settings -t864000-lu ~/Library/Keychains/ios-build.keychain

security -v import certs/${SCHEME_SANDBOX}.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign

security -v import certs/${SCHEME_SANDBOX}.p12 -k ~/Library/Keychains/ios-build.keychain -P"${KEY_PASSWORD}"-T /usr/bin/codesign

security -v set-key-partition-list -S apple-tool:,apple:,codesign: -s -k ${KEYCHAIN_PASSWORD} ios-build.keychain

mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles

forfileinprofile/*.mobileprovision.enc;do

? ? provision_file=${file/.enc/}

? ? openssl aes-256-cbc -k $ENCRYPTION_SECRET -in$file -d -a -out ${provision_file}

? ? final_file=`grep UUID -A1 -a "$provision_file" | grep -io "[-A-F0-9]\{36\}"`

? ? echo"$file -> $final_file"

? ? mv -f $provision_file ~/Library/MobileDevice/Provisioning\ Profiles/${final_file}.mobileprovision

done

security -v find-identity -p codesigning ~/Library/Keychains/ios-build.keychain

security -v list-keychains

popd

上面腳本涉及到需要的文件有:開(kāi)發(fā)者賬號(hào)的cer文件封恰,p12文件,開(kāi)發(fā)賬號(hào)的profile描述文件褐啡。

證書(shū)和描述文件


如果xcode是自動(dòng)管理證書(shū)诺舔,需要讀者手動(dòng)去創(chuàng)建證書(shū)和profile描述文件,如果有用到推送备畦,需要再創(chuàng)建推送的證書(shū)和描述文件低飒,后續(xù)的配置里用到的描述文件只能是手動(dòng)創(chuàng)建的,用自動(dòng)創(chuàng)建的會(huì)報(bào)錯(cuò)懂盐。

創(chuàng)建完證書(shū)和描述文件后分別安裝褥赊,雙擊即可,然后去系統(tǒng)搜索里輸入keychain打開(kāi)鑰匙串莉恼,找到剛才導(dǎo)入的開(kāi)發(fā)者證書(shū)拌喉,分別導(dǎo)出cer文件和p12文件,p12文件的密碼跟Travis上setting里環(huán)境變量里的KEY_PASSWORD的切記保持一致俐银。push證書(shū)不用導(dǎo)出尿背,生成push描述文件時(shí)繼續(xù)選擇push的證書(shū)就行。

接著將cer捶惜、p12文件放在scripts目錄下的certs自目錄下田藐,兩個(gè)描述文件文件放在script目錄下的profile目錄下,單擊其中一個(gè)描述文件吱七,按space空格鍵預(yù)覽該描述文件汽久,在預(yù)覽里的第一組信息里有一個(gè)UUID,將該描述文件的名字改為UUID的值踊餐,當(dāng)然此處手動(dòng)輸入容易出錯(cuò)回窘,我們也可以打開(kāi)一個(gè)文件夾,command+shift+G前往文件夾市袖,輸入/Users/YOURUSERNAME/Library/MobileDevice/Provisioning Profiles前往啡直,其中YOURUSERNAME為你的用戶名,進(jìn)去后可以暫時(shí)移除所有描述文件苍碟,再雙擊手動(dòng)創(chuàng)建的描述文件酒觅,雙擊后Provisioning Profiles文件夾會(huì)出現(xiàn)已經(jīng)命名成UUID的描述文件,另外一個(gè)描述文件亦如此微峰,到此舷丹,兩個(gè)描述文件的UUID名都改好,再將之前暫時(shí)移除的描述文件放Provisioning Profiles里蜓肆。

加密證書(shū)與描述文件


命令行到項(xiàng)目根目錄下颜凯,執(zhí)行如下命令分別加密上面說(shuō)的四個(gè)文件(其中加密的密碼跟setting --?Environment Variables下配置的解密時(shí)的密碼切記一致谋币,很容易被忽視),如加密cer文件症概,命令如下(注意:如下是一整條命令蕾额,簡(jiǎn)書(shū)會(huì)自動(dòng)換成兩行):

openssl aes-256-cbc -k "123456" -in scripts/certs/Debug.cer -out scripts/certs/Debug.cer.enc?-a

四個(gè)文件分別加密,記得改文件的父級(jí)目錄與文件名及后綴彼城,加密完后四個(gè)未加密的文件刪除即可诅蝶。

至此,add-key腳本相關(guān)設(shè)置全部完畢募壕。

script階段


before_script階段之后到script階段调炬,執(zhí)行一個(gè)travis.sh的腳本,主要就是打archive包和ipa包舱馅,在執(zhí)行travis腳本時(shí)會(huì)加上travis_wait的命令缰泡,是由于travis運(yùn)行時(shí)日志log不能超過(guò)4M,如果超過(guò)了會(huì)導(dǎo)致travis被迫停止代嗤,解決方案有兩個(gè)棘钞,第一個(gè)是每次輸出五百行日志,第二個(gè)方案是讓xcodebuild保持靜默運(yùn)行资溃,但是靜默運(yùn)行時(shí)如果十分鐘沒(méi)有任何日志輸出武翎,travis又會(huì)報(bào)錯(cuò)停止烈炭,所以用第二種方案解決travis日志log的4M限制時(shí)加上travis_wait的命令溶锭,放心,正常項(xiàng)目的運(yùn)行時(shí)間都會(huì)超過(guò)十分鐘符隙,所以4M限制基本上都需要解決趴捅,travis.sh內(nèi)容如下:

#!/usr/bin/env bash

SHELL_DIR=$(cd"$(dirname "$0")"; pwd)? ?

BUILD_PATH=${SHELL_DIR}/../build/

echo "*** $TRAVIS_BRANCH"

SANDBOX=Sandbox

SCHEME_SANDBOX=HOLLA-dev

SCHEME_RELEASE=HOLLA

SANDBOX_IPA_ARCHIVE_PATH=${BUILD_PATH}/${APPNAME}${SANDBOX}

RELEASE_IPA_ARCHIVE_PATH=${BUILD_PATH}/${APPNAME}${SCHEME_RELEASE}

xcodebuild archive -workspace? ${SHELL_DIR}/../${APPNAME}.xcworkspace -scheme ${SCHEME_SANDBOX} -configuration Debug -derivedDataPath ${BUILD_PATH} -archivePath ${SANDBOX_IPA_ARCHIVE_PATH}.xcarchive -quiet

xcodebuild -exportArchive -archivePath ${SANDBOX_IPA_ARCHIVE_PATH}.xcarchive -exportPath ${SANDBOX_IPA_ARCHIVE_PATH} -exportOptionsPlist ${SHELL_DIR}/exportOptions-developer.plist -quiet

xcodebuild archive -workspace? ${SHELL_DIR}/../${APPNAME}.xcworkspace -scheme ${SCHEME_RELEASE} -configuration Release -derivedDataPath ${BUILD_PATH} -archivePath ${RELEASE_IPA_ARCHIVE_PATH}.xcarchive -quiet

xcodebuild -exportArchive -archivePath ${RELEASE_IPA_ARCHIVE_PATH}.xcarchive -exportPath ${RELEASE_IPA_ARCHIVE_PATH} -exportOptionsPlist ${SHELL_DIR}/exportOptions-developer.plist -quiet

echo "*** end exportArchive"

控制臺(tái)log 4M限制解決方案


1.輸出五百行日志方案,將上面打包命令放在###################中間即可霹疫,此處優(yōu)點(diǎn)是能看到一些運(yùn)行時(shí)信息拱绑,缺點(diǎn)是腳本內(nèi)容顯得有些多,不太簡(jiǎn)潔丽蝎,代碼如下:

#!/bin/bash

# Abort on Error

## from http://stackoverflow.com/questions/26082444/how-to-work-around-travis-cis-4mb-output-limit

set -e

export PING_SLEEP=30s

export WORKDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

export BUILD_OUTPUT=$WORKDIR/build.out

touch $BUILD_OUTPUT

dump_output() {

echo Tailing the last 500 lines of output:

tail -500 $BUILD_OUTPUT

}

error_handler() {

echo ERROR: An error was encountered with the build.

dump_output

kill $PING_LOOP_PID

exit 1

}

# If an error occurs, run our error handler to output a tail of the build

trap 'error_handler' ERR

# Set up a repeating loop to send some output to Travis.

bash -c "while true; do echo \$(date) - building ...; sleep $PING_SLEEP; done" &

PING_LOOP_PID=$!

### 在此處放xcdoebuild打包及簽名命令 ###

### 在此處放xcdoebuild打包及簽名命令 ###

# The build finished without returning an error so dump a tail of the output

dump_output

# nicely terminate the ping output loop

kill $PING_LOOP_PID

2.運(yùn)行打包命令時(shí)加上-quiet參數(shù)即可猎拨,此處優(yōu)點(diǎn)是腳本非常簡(jiǎn)潔明了,弊端就是運(yùn)行時(shí)完全看不到輸出屠阻,不能實(shí)時(shí)查看當(dāng)前運(yùn)行信息红省。

travis.sh詳解


由于我實(shí)際需求是同時(shí)打debug、release包国觉,所以腳本內(nèi)會(huì)執(zhí)行兩邊打archive包和打ipa包的命令吧恃,此處特別注意坑點(diǎn),archive的輸出目錄麻诀,必須加上.xcarchive后綴痕寓,而ipa的輸出目錄就隨意傲醉,加不加.ipa都行,但是如果加了呻率,再后續(xù)的上傳ipa文件時(shí)切忌目錄上要加上.ipa硬毕。核心命令如下:

xcodebuild archive -workspace? ${SHELL_DIR}/../${APPNAME}.xcworkspace -scheme ${SCHEME_SANDBOX} -configuration Debug -derivedDataPath ${BUILD_PATH} -archivePath ${SANDBOX_IPA_ARCHIVE_PATH}.xcarchive -quiet

xcodebuild -exportArchive -archivePath ${SANDBOX_IPA_ARCHIVE_PATH}.xcarchive -exportPath ${SANDBOX_IPA_ARCHIVE_PATH} -exportOptionsPlist ${SHELL_DIR}/exportOptions-developer.plist -quiet

第一句是打archive包命令,第二句是打ipa包命令并簽名筷凤。

archive打包


項(xiàng)目里用的CocoaPods昭殉,所以編譯用的-workspace命令,如果讀者項(xiàng)目里沒(méi)用CocoaPods藐守,編譯用-project命令挪丢,不過(guò)都得注意目錄,找對(duì)xcodeproj或xcworkspace卢厂。如上乾蓬,APPNAME為項(xiàng)目名稱,作者定義成了環(huán)境變量在yml文件慎恒。

理論上x(chóng)codebuild可以指定target和scheme任内,但是通過(guò)實(shí)踐,指定target會(huì)報(bào)錯(cuò)融柬,通過(guò)xcodebuild -list命令可以查看當(dāng)前的scheme死嗦,打archive包時(shí)指定的scheme必須是xcodebuild -list里面存在的scheme,-configuration也必須是xcodebuild -list里存在的configurations粒氧,-archivePath后面跟的是archive包的存放目錄越除,path中必須包含.xcarchive,如果前面定義的path上沒(méi)有指定外盯,就一定加上此后綴摘盆。

ipa打包并簽名


此命令包括打包與簽名,-archivePath后的目錄與archive時(shí)路徑一直饱苟,-exportPath為ipa存放目錄孩擂,無(wú)特殊后綴要求,-exportOptionsPlist后跟導(dǎo)出包的相關(guān)配置箱熬。

exportOptions-developer.plist導(dǎo)出ipa參數(shù)詳解


導(dǎo)出ipa需要的一些配置类垦,主要是簽名相關(guān)的配置,配置文件如下:

貼不上x(chóng)ml城须,只能貼圖了蚤认,文本會(huì)貼在回復(fù)里,圖中teamID需要改成開(kāi)發(fā)證書(shū)的teamID酿傍,signingCertificate改成開(kāi)發(fā)者證書(shū)名字烙懦,provisioningProfiles下面配倆profile文件下已經(jīng)加密好的倆profile文件名和對(duì)應(yīng)的Bundle Identifier,至此,exportOptionsPlist配置完畢氯析,script階段結(jié)束亏较。

after_success階段


進(jìn)入after_success階段,執(zhí)行sign-and-upload.sh腳本掩缓,此腳本目前只有upload操作雪情,sign放在了script階段,該腳本代碼如下:

#!/bin/sh

SHELL_DIR=$(cd"$(dirname "$0")"; pwd)

BUILD_PATH=${SHELL_DIR}/../build/

msg=$(git log-1--pretty=%s)

SANDBOX=Sandbox

SCHEME_RELEASE=HOLLA

SCHEME_SANDBOX=HOLLA-dev

echo "commit msg: ${msg}"

if [ ! -z "$FIR_APP_TOKEN" ]; then

? ? echo""

? ? echo"***************************"

? ? echo"*? Uploading to Fir.im? *"

? ? echo"***************************"

? ? echo""

? ? fir p ${BUILD_PATH}/${APPNAME}${SANDBOX}/${SCHEME_SANDBOX}.ipa -T $FIR_APP_TOKEN -c"${SCHEME_SANDBOX} - $msg"

? ? fir p ${BUILD_PATH}/${APPNAME}${SCHEME_RELEASE}/${SCHEME_RELEASE}.ipa -T $FIR_APP_TOKEN -c"${SCHEME_RELEASE} - $msg"

fi

如上你辣,先判斷FIR_APP_TOKEN是不是空巡通,即在環(huán)境變量里有沒(méi)有設(shè)置該變量,如果沒(méi)有設(shè)置舍哄,沒(méi)設(shè)置宴凉?趕緊的、麻利的去設(shè)置撒表悬!設(shè)置了下一步就是上傳ipa包到fir.im平臺(tái)弥锄,fir后參數(shù)p表示ipa的路徑,切記與travis.sh里打ipa包的路徑一致蟆沫,文件名就是打包是設(shè)置的scheme名稱籽暇,-T參數(shù)后面是fir上的API TOKEN,在fir平臺(tái)的右上角的個(gè)人信息下面饭庞,-c是自定義發(fā)布時(shí)的changelog戒悠,項(xiàng)目需求是拿最后一次提交的commit信息當(dāng)做changelog,所以加上了msg舟山,即git log-1--pretty=%s绸狐,至此after_success階段結(jié)束。

after_script階段


進(jìn)入after_script階段捏顺,ipa包已經(jīng)上傳到fir平臺(tái)六孵,此階段執(zhí)行remove-key.sh腳本纬黎,做一些清理的操作幅骄,代碼如下:

#!/usr/bin/env bash

SHELL_DIR=$(cd"$(dirname "$0")"; pwd)

pushd ${SHELL_DIR}

SANDBOX=Sandbox

security delete-keychain ios-build.keychain

rm -f ~/Library/MobileDevice/Provisioning\ Profiles/${SANDBOX}.mobileprovision

popd

清除臨時(shí)keychain及描述文件。此步驟結(jié)束本今,Travis-CI持續(xù)構(gòu)建結(jié)束拆座。

關(guān)于debug


由于Travis配置相關(guān)的步驟及細(xì)節(jié)點(diǎn)稍多,所以難免出現(xiàn)運(yùn)行失敗的情況冠息,這時(shí)debug就該出場(chǎng)了挪凑,在項(xiàng)目右側(cè),Restart build下面:

debug后控制臺(tái)會(huì)和run一樣打印部分信息逛艰,直到出現(xiàn)ssh xxxxx躏碳,如下圖所示:

直接復(fù)制ssh 這行到命令行回車(chē),即進(jìn)入debug模式散怖,手動(dòng)輸入??上面travis_run_開(kāi)頭的命令進(jìn)行調(diào)試菇绵,注意每階段命令的執(zhí)行的順序肄渗,出問(wèn)題仔細(xì)查看錯(cuò)誤信息。

部分錯(cuò)誤及解決辦法


1.there are no accounts registered with Xcode....

xcode沒(méi)登錄Apple賬號(hào)咬最,登錄即可翎嫡,不過(guò)貌似會(huì)經(jīng)常出現(xiàn)賬號(hào)被擠掉的情況,只要提示該錯(cuò)永乌,去xcode登錄即可惑申。

2.no signing certification ios development found...

出現(xiàn)此錯(cuò)誤需確保teamID無(wú)誤,再此前提下就是導(dǎo)入的證書(shū)跟 === BUILD TARGET上面提示的Release不匹配翅雏,將archive后面的configuration設(shè)置為對(duì)應(yīng)的configuration 選項(xiàng)圈驼。

如果如上更改后,還是報(bào)no signing certification ios development found...望几,但是上面的=== BUILD TARGET沒(méi)有了碗脊,在teamID無(wú)誤的前提下說(shuō)明就是cer證書(shū)導(dǎo)入的有問(wèn)題,確認(rèn)本機(jī)keychain里的證書(shū)橄妆,重新導(dǎo)入+加密衙伶,操作流程在本文前部。

3.Code signing is required for product type 'App Extension' in SDK 'iOS 11.3'

第二個(gè)問(wèn)題解決了第三個(gè)問(wèn)題沒(méi)出現(xiàn)過(guò)害碾。



出現(xiàn)如上錯(cuò)誤首先確認(rèn)在此之前的log信息里無(wú)其他錯(cuò)誤矢劲,比如在add-key.sh腳本里沒(méi)有打印如下圖的信息,如果有慌随,說(shuō)明add-key.sh這步就有問(wèn)題芬沉,沒(méi)找到證書(shū),如果出現(xiàn)1 identites found阁猜,說(shuō)明add-key.sh里無(wú)誤丸逸,再提示archive not found ad path....那就說(shuō)明是路徑錯(cuò)誤,仔細(xì)檢查文件存放位置剃袍。



出現(xiàn)此錯(cuò)誤是因?yàn)榭刂婆_(tái)如果10min沒(méi)有日志輸出才出現(xiàn)黄刚,跟日志的4M限制相關(guān),在travis.sh腳本前叫上travis_wait命令即可民效,參考文章前面4M限制處理小節(jié)憔维。

相關(guān)總結(jié)


1.只要出現(xiàn)code signing相關(guān)的錯(cuò)誤信息,基本上就是證書(shū)配置問(wèn)題畏邢。

2.前面流程不報(bào)錯(cuò)业扒,當(dāng)前步驟出現(xiàn)file not found錯(cuò)誤,基本上就是路徑問(wèn)題舒萎。

3.xcodebuild打出來(lái)的包release包并不一定是release.ipa程储,是根據(jù)打包時(shí)設(shè)置的scheme名字命名的,可以debug到輸出目錄查看。

4.如果開(kāi)啟了代理章鲤,log日志有時(shí)不會(huì)自動(dòng)刷新致板,需要手動(dòng)刷新。

寫(xiě)在最后


Travis-CI持續(xù)構(gòu)建是一個(gè)綜合性較強(qiáng)的技術(shù)實(shí)踐咏窿,需要讀者掌握對(duì)應(yīng)平臺(tái)的相關(guān)概念斟或,如開(kāi)發(fā)證書(shū)、開(kāi)發(fā)描述文件集嵌、推送描述文件萝挤、xcode打包流程等,還需掌握shell腳本的基礎(chǔ)語(yǔ)法與操作根欧,vim的相關(guān)操作怜珍。

另,個(gè)人免費(fèi)賬號(hào)run是有次數(shù)限制的凤粗,單個(gè)項(xiàng)目滿100后就不能run了酥泛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嫌拣,隨后出現(xiàn)的幾起案子柔袁,更是在濱河造成了極大的恐慌,老刑警劉巖异逐,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捶索,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡灰瞻,警方通過(guò)查閱死者的電腦和手機(jī)腥例,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)酝润,“玉大人燎竖,你說(shuō)我怎么就攤上這事∫” “怎么了构回?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蕉陋。 經(jīng)常有香客問(wèn)我捐凭,道長(zhǎng)拨扶,這世上最難降的妖魔是什么凳鬓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮患民,結(jié)果婚禮上缩举,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好仅孩,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布托猩。 她就那樣靜靜地躺著,像睡著了一般辽慕。 火紅的嫁衣襯著肌膚如雪京腥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天溅蛉,我揣著相機(jī)與錄音公浪,去河邊找鬼。 笑死船侧,一個(gè)胖子當(dāng)著我的面吹牛欠气,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镜撩,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼预柒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了袁梗?” 一聲冷哼從身側(cè)響起宜鸯,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遮怜,沒(méi)想到半個(gè)月后顾翼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奈泪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年适贸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涝桅。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拜姿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冯遂,到底是詐尸還是另有隱情蕊肥,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布蛤肌,位于F島的核電站壁却,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏裸准。R本人自食惡果不足惜展东,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炒俱。 院中可真熱鬧盐肃,春花似錦爪膊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谦铃,卻和暖如春耘成,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驹闰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工凿跳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疮方。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓控嗜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親骡显。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疆栏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容