Xcode Server持續集成

做者 : iOS Team 高祥git


1、爲何要持續集成

在App開發週期中, 須要不斷的對develop上面的代碼進行build、Test、Analyze等一些列的操做, 保證在主幹分支上的代碼永遠是在一種可發佈的狀態,可是這些操做是簡單可是很耗時的一個操做,所以採用持續集成的方案。 所謂持續集成,就是把編譯、測試、分析、打包、報告結果的過程交給持續集成服務器來完成,這樣能大量省去了開發的時間。shell

iOS的集成方案有不少,有最原始的利用Xcodebuild來打包工具,也有利用Jenkins來作持續集成。而咱們採用的是Apple 一直支持的 Xcode server來處理。 它由以下優勢:json

  • 方便集成,在Xcode9中,Apple直接將其嵌入Xcode之中,集成很是簡單;
  • 提供了用於監視機器人的Web儀表板;
  • 能建立可安裝的IPA,並能經過Web儀表板安裝;
  • 能都很好的繼續分析測試等;
  • 愈加詳細的log信息,若是出現錯誤,能夠根據log信息來處理;(PS:實際上,我調試問題,都是根據log信息來處理的。)

2、怎麼作

網上一搜Xcode build 持續集成,總能搜到不少不少的版本,有的甚至是Xcode5 甚至Xcode6的,可是面對跟如今有很大的區別。所以提供以下兩中教程。(PS: 在實際處理中,實際官方文檔纔是最全面的)api

教程一: Xcode 8 或者 Xcode8如下xcode

教程二: Xcode9bash

也許你會說,這算是嘛事啊,讓看官方文檔。由於官方文檔對各類配置有很詳細的解釋。 我看了不少關於Xcode Server 持續集成的文檔,步驟基本如出一轍,沒有詳細說明。看完後 你仍是一臉懵逼。甚至於,有不少仍是是錯的,看完更懵逼。所以強烈推薦官方的。服務器


3、踩的各類坑

由於教程步驟等,官方很詳細,推薦你們去閱讀如下。可是坑可就是千奇百怪的。這纔是重點。app

坑1: 跑着跑着就歇火了

問題描述: 當一切設置好以後,取運行ezbuy項目,發現跑着跑着就被cancel了(非人爲) 解決方式 在Xcode9 -> Prefrences -> Server & Bots 運維

image_1blp6d2tfgloq20neqkm8mu19.png-71.7kB

坑2:名字的坑

問題描述 咱們集成Xcode Server最終爲了是將最後生成的iPA上傳到咱們的運維服務去,在最後執行所寫的腳本的時候,須要取到對應的iPA路徑,其路徑是IPA Name來肯定的,可是若是IPA名稱中帶了「空格",處理起來相對會麻煩一點。 解決方式 方式1: 修改iPA的名字,將 ezbuy EnterPrise UAT.ipa修改成ezbuy_EnterPrise_UAT.ipa。 對應的腳本以下ssh

#!/bin/sh
 # 找到iPA的名稱
IPA_NAME=$(basename "${XCS_ARCHIVE%.*}".ipa)
 # 找到iPA路徑
IPA_PATH="${XCS_OUTPUT_DIR}/ExportedProduct/Apps/${IPA_NAME}"
 # 講iPA路徑底下的文件空改爲下劃線,例如ezbuy Enterprise UAT.ipa 改成 ezbuy_Enterprise_UAT.ipa
NEW_NAME="$(ls ${IPA_PATH}  | grep "$IPA_NAME" | sed 's/ /_/g')"
echo $NEW_NAME
 # 修改iPA名稱
mv $IPA_PATH/"$IPA_NAME" $IPA_PATH/$NEW_NAME
複製代碼

由於對shell 腳本不熟,寫出這個小腳本仍是挺自豪的,可是最終發現存在一個問題 若是你將名字修改了,那麼對於系統生成的 Server local 的iPA 你將沒法看見。這個解決方式也很簡單,就會將文件複製出來,到自定義的目錄中,而後更名字,處理。 相應腳本以下:

 #!/bin/sh
 # 找到iPA的名稱
IPA_NAME=$(basename "${XCS_ARCHIVE%.*}".ipa)
 # 找到對應的目錄文件
OUTPUT_DIR_PATH="${XCS_OUTPUT_DIR}"
echo $OUTPUT_DIR_PATH
 # 移動的最終的文件夾名稱(指定)
DES_DIR_PATH=/Users/server/XcodeServer/ezbuy_Enterprise_UAT
 # 新建一個文件夾,按照時間排序,方便之後找
FILE_NAME=$(date +%Y%m%d%H%M)
cd $DES_DIR_PATH
mkdir $FILE_NAME
echo $DES_DIR_PATH/$FILE_NAME
echo "1-------\n"
 # 移動操做
cp -r $OUTPUT_DIR_PATH $DES_DIR_PATH/$FILE_NAME
 # 拼接iPA路徑
IPA_PATH="${DES_DIR_PATH}/${FILE_NAME}/Integration-${XCS_INTEGRATION_ID}/ExportedProduct/Apps"

echo $IPA_PATH
echo $IPA_NAME
 # 講iPA路徑底下的文件空改爲下劃線,例如ezbuy Enterprise UAT.ipa 改成 ezbuy_Enterprise_UAT.ipa
NEW_NAME="$(ls ${IPA_PATH}  | grep "$IPA_NAME" | sed 's/ /_/g')"
echo $NEW_NAME

mv $IPA_PATH/"$IPA_NAME" $IPA_PATH/$NEW_NAME

echo $IPA_PATH/$NEW_NAME
 # ssh 上傳到本身服務器
scp -P 22 $IPA_PATH/$NEW_NAME xxxxxxxxxx(字符服務器路徑)

複製代碼

可是這個方式,在最後一個,我也放棄了。採用了方式2

方式2: (推薦這種解決方式) 選中項目,而後選擇 Edit Scheme -> Archive -> Archive Name,修改爲不帶空格名稱便可。

image_1blp7eqdbvn4k6g1f281sso1dca9.png-48.3kB

坑3: ipa去哪裏了

在編寫程序中,須要一步步來驗證,爲了獲取到最後的iPA,我打印其路徑

# 找到iPA的名稱
IPA_NAME=$(basename "${XCS_ARCHIVE%.*}".ipa)
 # 找到iPA路徑
IPA_PATH="${XCS_OUTPUT_DIR}/ExportedProduct/Apps/${IPA_NAME}"

echo $IPA_PATH
複製代碼

but: 每次我根據打印的log信息的時候,根據其顯示的Path 取找對應的iPA,文件夾空空. 後來找到半天,找到了答案 在Xcode Server 執行完畢以後,會自動刪除掉生成iPA的文件夾. What????

StackOverFlow上面找到最終iPA地址

TARGET_NAME=`basename "${XCS_ARCHIVE}" .xcarchive`
IPA_PATH=${INTEGRATION_ASSETS}/${XCS_BOT_ID}-${XCS_BOT_NAME}/${XCS_INTEGRATION_NUMBER}/${TARGET_NAME}.ipa
複製代碼

But,這個地址也沒用啊,在執行 POST - Integration Scripts時候,此文件夾還未生成. 最終發現,在集成的過程當中, 在IPA_PATH會生成ipa,存在其文件夾中,而後執行完全部的程序後自動刪除。 我所驗證的操做是,將其複製出來(按照上面的shell腳本),而後檢查,上傳到咱們的服務器。

坑4 一個我至今沒法爬出的坑

現象: 這個問題,很難復現,若是你出現了,恭喜你。

Xcode Server setup failed (starting api server) Try clicking Choose Xcode and selecting a newer version of Xcode
複製代碼

Snip20170714_8.png-96.6kB

針對這個問題,StackOverFlow和 蘋果社區都沒有找到答案,卸載Xcode與Server從新安裝都不能夠,最後系統重裝,才解決了。

若是你碰到了 有對應的解決辦法,還但願反饋一下.

網上有看處處理方式,可是無效,若是你出現了這個問題,能夠在終端執行試試 sudo xcrun xcscontrol --reset sudo /Applications/Xcode.app/Contents/Developer/usr/bin/xcscontrol --reset

怎麼看log信息,怎麼看那些參數

只要在腳本之中,寫上下面代碼,就會將系統全部的參數顯示出來,so easy

set
複製代碼
爲什麼用Xcode9 Bata

由於咱們的 ezbuy Enterprise UAT 是企業版本,在Xcode8之中,配置至關複雜,在Xcode9之中,只要配置以下(這也是幾經折騰,選擇Xcode9的緣由)

image_1blp8nevn1eufmkv17fsad41pve1p.png-55.5kB

ExportOptins.plist內容格式以下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>method</key>
	<string>enterprise</string>
	<key>thinning</key>
	<string>&lt;none&gt;</string>
	<key>teamID</key>
    <string>你本身的TeamID</string>
    <key>uploadSymbols</key>
    <true/>
    <key>stripSwiftSymbols</key>
    <true/>
</dict>
</plist>
複製代碼

具體各類參數信息,可在mac 終端,輸入: xcodebuild --help便可看到詳細信息


3、最終效果以及各類配合信息截圖

Bot效果截圖

image_1blp9fdf7mkdfp13hj6m21u783d.png-239kB
image_1blp9b2ppqecn5o12kova0tt126.png-305kB

image_1blp9j71sa201paa4qckdt1kk46a.png-42.1kB

Bot after腳本

Snip20170725_18.png-345.7kB

若是對環境變量不熟悉的,推薦在腳本中打印 set,而後詳細瞭解一下。

相關文章
相關標籤/搜索