給iOS工程增加Daily Build

來源:互聯網
上載者:User

標籤:

 

給iOS工程增加Daily Build 

前言

Daily Build 是一件非常有意義的事情,也是敏捷開發中關於 “持續整合” 的一個實踐。Daily Build 對於開發來說有如下好處:

  • 保證了每次 check in 的代碼可用,不會造成整個工程編譯失敗。
  • 進度跟進。產品經理可以每天看到最新的開發進度,並且試用產品,調整一些細節。很多時候,一個新功能,你真正用了一下才能有體會好或不好,所以 daily build 也給產品經理更多時間來調理他的設計。
  • 需求確認。產品經理可以確認開發的功能細節是他的預期。因為我們的開發比較緊湊,所以都沒有傳統的需求說明文檔,所以 daily build 也給產品經理用於儘早確認開發的功能細節是他的預期,我就遇到一次產品經理髮現開發出的一個功能細節和他的預期不一致,但是因為有 daily build,使得我可以儘早做修改,把修改的代價減小了。
  • 測試跟進。如果功能點是獨立的話,測試同事完全可以根據 daily build 來進行一些早期的測試。越早的 Bug 反饋可以使得修改 bug 所需的時間越短。
步驟xcodebuild 命令

如何做 daily build 呢?其實 Xcode 就提供了命令列 build 的命令,這個命令是 xcodebuild,用 xcodebuild -usage
可以查看到所有的可用參數,如下所示:

[tangqiao ~]$xcodebuild -usage
Usage: xcodebuild [-project <projectname>] [[-target <targetname>]...|-alltargets] [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [<buildsetting>=<value>]... [<buildaction>]...
xcodebuild [-project <projectname>] -scheme <schemeName> [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [<buildsetting>=<value>]... [<buildaction>]...
xcodebuild -workspace <workspacename> -scheme <schemeName> [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [<buildsetting>=<value>]... [<buildaction>]...
xcodebuild -version [-sdk [<sdkfullpath>|<sdkname>] [<infoitem>] ]
xcodebuild -list [[-project <projectname>]|[-workspace <workspacename>]]
xcodebuild -showsdks

一般情況下的命令使用如下:

xcodebuild -configuration Release -target "YourProduct"

但在 daily build 中,用 Release 用為 configuration 其實不是特別好。因為 Release 的認證可能會被經常修改。我們可以基於 Release 的 Configuation,建一個專門用於 daily build 的 configuration。方法是:在工程詳細頁面中,選擇 Info 一欄,在 Configurations 一欄的下方點擊 “+” 號,然後選擇 “Duplicate Release Configuration”, 建立名為 “DailyBuild” 的 Configuration, 如所示:

之後就可以用如下命令來做 daily build 了

xcodebuild -configuration DailyBuild -target "YourProduct"

執行完命令後,會在當前工程下的 build/DailyBuild-iphoneos/ 目錄下產生一個名為: YourProduct.app 的檔案。這個就是我們 Build 成功之後的程式檔案。

產生 ipa 檔案

接下來我們需要產生 ipa 檔案,在產生 ipa 檔案這件事情上,xcode 似乎沒有提供什麼工具,不過這個沒什麼影響,因為 ipa 檔案實際上就是一個 zip 檔案,我們使用系統的 zip 命令來產生 ipa 檔案即可。需要注意的是,ipa 檔案並不是簡單地將編輯好的 app 檔案打成 zip 檔案,它需要將 app 檔案放在一個名為 Payload 的檔案夾下,然後將整個 Payload 目錄打包成為 .ipa 檔案,命令如下:

cd $BUILD_PATH
mkdir -p ipa/Payload
cp -r ./DailyBuild-iphoneos/$PRODUCT_NAME ./ipa/Payload/
cd ipa
zip -r $FILE_NAME *
產生安裝檔案

蘋果允許用 itms-services 協議來直接在 iphone/ipad 上安裝應用程式,我們可以直接產生該協議需要的相關檔案,這樣產品經理和測試同學都可以直接在裝置上安裝新版的應用了。相關的參考資料可以見:這裡 和 這裡

具體來說,就是需要產生一個帶 itms-services 協議的連結的 html 檔案,以及一個 plist 檔案。

產生 html 的範例程式碼如下:

cat << EOF > install.html
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title> 安裝此軟體 </title>
</head>
<body>
<ul>
<li> 安裝此軟體:<a href="itms-services://?action=download-manifest&url=http%3A%2F%2Fwww.yourdomain.com%2Fynote.plist">$FILE_NAME</a></li>
</ul>
</div>
</body>
</html>
EOF

產生 plist 檔案的代碼如下,注意,需要將下面的涉及 www.yourdomain.com 的地方換成你線上伺服器的地址,將 ProductName 換成你的 app 安裝後的名字。

cat << EOF > ynote.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>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>http://www.yourdomain.com/$FILE_NAME</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>http://www.yourdomain.com/icon.png</string>
</dict>
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>http://www.yourdomain.com/icon.png</string>
</dict>
</array><key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.yourdomain.productname</string>
<key>bundle-version</key>
<string>1.0.0</string>
<key>kind</key>
<string>software</string>
<key>subtitle</key>
<string>ProductName</string>
<key>title</key>
<string>ProductName</string>
</dict>
</dict>
</array>
</dict>
</plist>


EOF
定時運行

這一點非常簡單,使用 crontab -e 命令即可。大家可以隨意 google 一下 crontab 命令,可以找到很多相關文檔。假如我們要每周 1-5 的早上 9 點鐘執行 daily build,則 crontab 的配置如下:

0 9 * * * 1-5 /Users/tangqiao/dailybuild.sh >> /Users/tangqiao/dailybuild.log 2>&1
失敗警示

在 daily build 指令碼運行失敗時,最好能發警示郵件或者簡訊,以便能夠儘早發現。發郵件可以用 python 的 smtplib 來寫,樣本如下:

import smtplib

sender = ‘[email protected]‘
receivers = [‘[email protected]‘]

message = """From: Alert <[email protected]>
To: Some one <[email protected]>
Subject: SMTP email sample

Hope you can get it.
"""

try:
obj = smtplib.SMTP(‘server.mail.devtang.com‘)
obj.sendmail(sender, receivers, message)
print ‘OK: send mail succeed‘
except Exception:
print ‘Error: unable to send mail‘
上傳

daily build 編譯出來如果需要單獨上傳到另外一台 web 機器上,可以用 ftp 或者 scp 協議。如果 web 機器悲劇的是 windows 機器的話,可以在 windows 機器上開一個共用,然後用 mount -t smbfs 來將這個共用 mount 到本地,相關的範例程式碼如下:

mkdir upload
mount -t smbfs //$SMB_USERNAME:[email protected]$SMB_TARGET ./upload
if [ "$?" -ne 0 ]; then
echo "Failed to mount smb directory"
exit 1
fi
mkdir ./upload/$FOLDER
cp $FILE_NAME ./upload/$FOLDER/
if [ "$?" -eq 0 ]; then
echo "[OK] $FILE_NAME is uploaded to $SMB_TARGET"
else
echo "[ERROR] $FILE_NAME is FAILED to uploaded to $SMB_TARGET"
fi
umount ./upload

 

遇到的問題

本來我寫的自動化指令碼在 Mac OS X 10.6 下運行得很好。但是升級到 lion 後,指令碼在手動執行時很正常,但是在用 crontab 啟動時就會出現找不到開發人員認證的錯誤。在網上搜了很久也沒有找到解決辦法。最後我試了一下在 “鑰匙串訪問” 中把開發人員認證從 “登入” 那欄拖動到 “系統” 那欄,居然就解決了,如所示:

另外我搜到 2 個類似的問題的解決方案,雖然對我這個沒起作用,也一併放在這兒,或許對遇到類似問題的人有協助:

  • http://stackoverflow.com/questions/7635143/cannot-build-xcode-project-from-command-line-but-can-from-xcode
  • http://shappy1978.iteye.com/blog/765842
總結

將以上各點結合起來,就可以用 bash 寫出一個 daily build 指令碼了。每天這一切都會自動完成,心情相當好。

給iOS工程增加Daily Build

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.