在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ iOS/ 為 iOS 建立 Travis CI
與四軸無人機的通訊
在沙盒中編寫腳本
結構體和值類型
深入理解 CocoaPods
UICollectionView + UIKit 力學
NSString 與 Unicode
代碼簽名探析
測試
架構
第二期-并發(fā)編程
Metal
自定義控件
iOS 中的行為
行為驅動開發(fā)
Collection View 動畫
截圖測試
MVVM 介紹
使 Mac 應用數(shù)據(jù)腳本化
一個完整的 Core Data 應用
插件
字符串
為 iOS 建立 Travis CI
先進的自動布局工具箱
動畫
為 iOS 7 重新設計 App
XPC
從 NSURLConnection 到 NSURLSession
Core Data 網(wǎng)絡應用實例
GPU 加速下的圖像處理
自定義 Core Data 遷移
子類
與調(diào)試器共舞 - LLDB 的華爾茲
圖片格式
并發(fā)編程:API 及挑戰(zhàn)
IP,TCP 和 HTTP
動畫解釋
響應式 Android 應用
初識 TextKit
客戶端
View-Layer 協(xié)作
回到 Mac
Android
Core Image 介紹
自定義 Formatters
Scene Kit
調(diào)試
項目介紹
Swift 的強大之處
測試并發(fā)程序
Android 通知中心
調(diào)試:案例學習
從 UIKit 到 AppKit
iOS 7 : 隱藏技巧和變通之道
安全
底層并發(fā) API
消息傳遞機制
更輕量的 View Controllers
用 SQLite 和 FMDB 替代 Core Data
字符串解析
終身學習的一代人
視頻
Playground 快速原型制作
Omni 內(nèi)部
同步數(shù)據(jù)
設計優(yōu)雅的移動游戲
繪制像素到屏幕上
相機與照片
音頻 API 一覽
交互式動畫
常見的后臺實踐
糟糕的測試
避免濫用單例
數(shù)據(jù)模型和模型對象
Core Data
字符串本地化
View Controller 轉場
照片框架
響應式視圖
Square Register 中的擴張
DTrace
基礎集合類
視頻工具箱和硬件加速
字符串渲染
讓東西變得不那么糟
游戲中的多點互聯(lián)
iCloud 和 Core Data
Views
虛擬音域 - 聲音設計的藝術
導航應用
線程安全類的設計
置換測試: Mock, Stub 和其他
Build 工具
KVC 和 KVO
Core Image 和視頻
Android Intents
在 iOS 上捕獲視頻
四軸無人機項目
Mach-O 可執(zhí)行文件
UI 測試
值對象
活動追蹤
依賴注入
Swift
項目管理
整潔的 Table View 代碼
Swift 方法的多面性
為什么今天安全仍然重要
Core Data 概述
Foundation
Swift 的函數(shù)式 API
iOS 7 的多任務
自定義 Collection View 布局
測試 View Controllers
訪談
收據(jù)驗證
數(shù)據(jù)同步
自定義 ViewController 容器轉場
游戲
調(diào)試核對清單
View Controller 容器
學無止境
XCTest 測試實戰(zhàn)
iOS 7
Layer 中自定義屬性的動畫
第一期-更輕量的 View Controllers
精通 iCloud 文檔存儲
代碼審查的藝術:Dropbox 的故事
GPU 加速下的圖像視覺
Artsy
照片擴展
理解 Scroll Views
使用 VIPER 構建 iOS 應用
Android 中的 SQLite 數(shù)據(jù)庫支持
Fetch 請求
導入大數(shù)據(jù)集
iOS 開發(fā)者的 Android 第一課
iOS 上的相機捕捉
語言標簽
同步案例學習
依賴注入和注解,為什么 Java 比你想象的要好
編譯器
基于 OpenCV 的人臉識別
玩轉字符串
相機工作原理
Build 過程

為 iOS 建立 Travis CI

你是否曾經(jīng)試著為 iOS 項目搭建一臺支持持續(xù)集成的服務器,從我的個人經(jīng)驗而言,這可不是一個輕松的活。首先需要準備一臺 Mac 電腦,并安裝好全部所需的軟件和插件。你要負責管理所有的用戶賬戶,并提供安全保護。你需要授予訪問倉庫的權限,并配置所有的編譯步驟和證書。在項目運行時期,你需要保持服務器的穩(wěn)健和最新。

最后,原本你想節(jié)省的時間,會發(fā)現(xiàn)你花費了大量的時間去維護這臺服務器。不過如果你的項目托管在 GitHub) 上,現(xiàn)在有了新的希望:Travis CI。該服務可以為你的項目提供持續(xù)集成的支持,也就意味著它會負責好托管一個項目的所有細節(jié)。在 Ruby 的世界中,Travis CI 已久負盛名。從 2013 年 4 月起,Travis 也開始支持 iOS 和 Mac 平臺。

在這篇文章中,我將向你展示如何一步步的在項目中集成 Travis。不僅包括項目的編譯和單元測試的運行,還包括將應用部署到你所有的測試設備上。為了演示,我在 GitHub 上放了一個示例項目。在這篇文章的最后,我會教你一些提示:如何用 Travis 去定位程序中的錯誤。

GitHub 集成

我最喜歡 Travis 的一點就是它與 GitHub 的 Web UI 集成的非常好。例如 pull 請求。Travis 會為每次請求都執(zhí)行編譯操作。如果一切正常,pull 請求在 GitHub 上看起來就像這樣:

http://wiki.jikexueyuan.com/project/objc/images/6-5.jpg" alt="" />

萬一編譯不成功,GitHub 頁面會修改相應的顏色,給予提醒:

http://wiki.jikexueyuan.com/project/objc/images/6-6.jpg" alt="" />

鏈接 Travis 和 GitHub

讓我們看一下如何將 GitHub 項目與 Travis 鏈接上。使用 GitHub 賬號登錄 Travis 站點。對于私有倉庫,需要注冊一個 Travis 專業(yè)版賬號。

登錄成功后,需要為項目開啟 Travis 支持。導航到屬性頁面,該頁面列出了所有 GitHub 項目。不過要注意,如果你此后創(chuàng)建了一個新的倉庫,要使用 Sync now 按鈕進行同步。Travis 只會偶爾更新你的項目列表。

http://wiki.jikexueyuan.com/project/objc/images/6-7.jpg" alt="" />

現(xiàn)在只需要打開這個開關就可以為你的項目添加 Travis 服務。之后你會看到 Travis 會和 GitHub 項目設置相關聯(lián)。下一步就是告訴 Travis, 當它收到項目改動通知之后該做什么。

最簡單的項目配置

Travis CI 需要項目的一些基本信息。在項目的根目錄創(chuàng)建一個名叫 .travis.yml 的文件,文件中的內(nèi)容如下:

language: objective-c

Travis 編譯器運行在虛擬機環(huán)境下。該編譯器已經(jīng)利用 RubyHomebrew,CocoaPods一些默認的編譯腳本進行過預配置。上述的配置項已經(jīng)足夠編譯你的項目了。

預裝的編譯腳本會分析你的 Xcode 項目,并對每個 target 進行編譯。如果所有文件都沒有編譯錯誤,并且測試也沒有被打斷,那么項目就編譯成功了。現(xiàn)在可以將相關改動 Push 到 GitHub 中看看能否成功編譯。

雖然上述配置過程真的很簡單,不過對你的項目不一定適用。這里幾乎沒有什么文檔來指導用戶如何配置默認的編譯行為。例如,有一次我沒有用 iphonesimulator SDK 導致代碼簽名錯誤。如果剛剛那個最簡單的配置對你的項目不適用的話,讓我們來看一下如何對 Travis 使用自定義的編譯命令。

自定義編譯命令

Travis 使用命令行對項目進行編譯。因此,第一步就是使項目能夠在本地編譯。作為 Xcode 命令行工具的一部分,Apple 提供了 xcodebuild 命令。

打開終端并輸入:

xcodebuild --help

上述命令會列出 xcodebuild 所有可用的參數(shù)。如果命令執(zhí)行失敗了,確保命令行工具已經(jīng)成功安裝。一個常見的編譯命令看起來是這樣的:

xcodebuild -project {project}.xcodeproj -target {target} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO

使用 iphonesimulator SDK 是為了避免簽名錯誤。直到我們稍后引入證書之前,這一步是必須的。通過設置 ONLY_ACTIVE_ARCH=NO 我們可以確保利用模擬器架構編譯工程。你也可以設置額外的屬性,例如 configuration,輸入 man xcodebuild 查看相關文檔。

對于使用 CocoaPods 的項目,需要用下面的命令來指定 workspacescheme

xcodebuild -workspace {workspace}.xcworkspace -scheme {scheme} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO

schemes 是由 Xcode 自動生成的,但這在服務器上不會發(fā)生。確保所有的 scheme 都被設為 shared 并加入到倉庫中。否則它只會在本地工作而不會被 Travis CI 識別。

http://wiki.jikexueyuan.com/project/objc/images/6-8.jpg" alt="" />

我們示例項目下的 .travis.yml 文件現(xiàn)在看起來應該像這樣:

language: objective-c
script: xcodebuild -workspace TravisExample.xcworkspace -scheme TravisExample -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO

運行測試

對于測試來說,通常使用如下這個命令 (注意 test 屬性):

xcodebuild test -workspace {workspace}.xcworkspace -scheme {test_scheme} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO

不幸的是,xcodebuild 對于 iOS 來說,并不能正確支持 target 和應用程序的測試。這里有一些解決方案,不過我建議使用 Xctool。

Xctool

Xctool 是來自 Facebook 的命令行工具,它可以簡化程序的編譯和測試。它的彩色輸出信息比 xcodebuild 更加簡潔直觀。同時還添加了對邏輯測試,應用測試的支持。

Travis 中已經(jīng)預裝了 xctool。要在本地測試的話,需要用 Homebrew 安裝 xctool:

brew update
brew install xctool

xctool 用法非常簡單,它使用的參數(shù)跟 xcodebuild 相同:

xctool test -workspace TravisExample.xcworkspace -scheme TravisExampleTests -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO

一旦相關命令在本地能正常工作,那么就是時候把它們添加到 .travis.yml 中了:

language: objective-c
script:
  - xctool -workspace TravisExample.xcworkspace -scheme TravisExample -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO
  - xctool test -workspace TravisExample.xcworkspace -scheme TravisExampleTests -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO

到此為止,介紹的內(nèi)容對于使用 Travis 的 library 工程來說,已經(jīng)足夠了。我們可以確保項目正常編譯并測試通過。但對于 iOS 應用來說,我們希望能在真實的物理設備上進行測試。也就是說我們需要將應用部署到我們的所有測試設備上。當然,我們希望 Travis 能自動完成這項任務。首先,我們需要給程序簽名。

應用程序的簽名

為了在 Travis 中能給程序簽名,我們需要準備好所有必須的證書和配置文件。就像每個 iOS 開發(fā)人員知道的那樣,這可能是最困難的一步。后面,我將寫一些腳本在服務器上給應用程序簽名。

證書和配置文件

1. 蘋果全球開發(fā)者關系認證

蘋果官網(wǎng)下載證書,或者從鑰匙串中導出。并將其保存到項目的目錄 scripts/certs/apple.cer 中。

2. iPhone 發(fā)布證書 + 私鑰

如果還沒有發(fā)布證書的話,先創(chuàng)建一個。登錄蘋果開發(fā)者賬號,按照步驟,創(chuàng)建一個新的生產(chǎn)環(huán)境證書 (Certificates > Production > Add > App Store and Ad Hoc)。然后下載并安裝證書。之后,可以在鑰匙串中找到它。打開 Mac 中的 鑰匙串 應用程序:

http://wiki.jikexueyuan.com/project/objc/images/6-9.jpg" alt="" />

右鍵單擊證書,選擇 Export... 將證書導出至 scripts/certs/dist.cer。然后導出私鑰并保存至 scripts/certs/dist.p12。記得輸入私鑰的密碼。

由于 Travis 需要知道私鑰密碼,因此我們要把這個密碼存儲在某個地方。當然,我們不希望以明文的形式存儲。我們可以用 Travis 的安全環(huán)境變量。打開終端,并定位到包含 .travis.yml 文件所在目錄。首先用 gem install travis 命令安裝 Travis gem。之后,用下面的命令添加密鑰密碼:

travis encrypt "KEY_PASSWORD={password}" --add

上面的命令會安裝一個叫做 KEY_PASSWORD 的加密環(huán)境變量到 .travis.yml 配置文件中。這樣就可以在被 Travis CI 執(zhí)行的腳本中使用這個變量。

3. iOS 配置文件 (發(fā)布)

如果還沒有用于發(fā)布的配置文件,那么也創(chuàng)建一個新的。根據(jù)開發(fā)者賬號類型,可以選擇創(chuàng)建 Ad HocIn House 配置文件 (Provisioning Profiles > Distribution > Add > Ad Hoc or In House)。然后將其下載保存至 scripts/profile/ 目錄。

由于 Travis 需要訪問這個配置文件,所以我們需要將這個文件的名字存儲為一個全局環(huán)境變量。并將其添加至 .travis.yml 文件的全局環(huán)境變量 section 中。例如,如果配置文件的名字是 TravisExample_Ad_Hoc.mobileprovision,那么按照如下進行添加:

env:
  global:
  - APP_NAME="TravisExample"
  - 'DEVELOPER_NAME="iPhone Distribution: {your_name} ({code})"'
  - PROFILE_NAME="TravisExample_Ad_Hoc"

上面還聲明了兩個環(huán)境變量。第三行中的 APP_NAME 通常為項目默認 target 的名字。第四行的 DEVELOPER_NAME 是 Xcode 中,默認 target 里面 Build SettingsCode Signing Identity > Release 對應的名字。然后搜索程序的 Ad HocIn House 配置文件,將其中黑體文字取出。根據(jù)設置的不同,括弧中可能不會有任何信息。

加密證書和配置文件

如果你的 GitHub 倉庫是公開的,你可能希望對證書和配置文件 (里面包含了敏感數(shù)據(jù)) 進行加密。如果你用的是私有倉庫,可以跳至下一節(jié)。

首先,我們需要一個密碼來對所有的文件進行加密。在我們的示例中,密碼為 “foo”,記住在你的工程中設置的密碼應該更加復雜。在命令行中,我們使用 openssl 加密所有的敏感文件:

openssl aes-256-cbc -k "foo" -in scripts/profile/TravisExample_Ad_Hoc.mobileprovision -out scripts/profile/TravisExample_Ad_Hoc.mobileprovision.enc -a
openssl aes-256-cbc -k "foo" -in scripts/certs/dist.cer -out scripts/certs/dist.cer.enc -a
openssl aes-256-cbc -k "foo" -in scripts/certs/dist.p12 -out scripts/certs/dist.cer.p12 -a

通過上面的命令,可以創(chuàng)建出以 .enc 結尾的加密文件。之后可以把原始文件忽略或者移除掉。至少不要把原始文件提交到 GitHub 中,否則原始文件會顯示在 GitHub 中。如果你不小心把原始文件提交上去了,那么請看這里如何解決

現(xiàn)在,我們的文件已經(jīng)被加密了,接下來需要告訴 Travis 對文件進行解密。解密過程,需要用到密碼。具體使用方法跟之前創(chuàng)建的 KEY_PASSWORD 變量一樣:

travis encrypt "ENCRYPTION_SECRET=foo" --add

最后,我們需要告訴 Travis 哪些文件需要進行解密。將下面的命令添加到 .travis.yml 文件中的 before-script 部分:

before_script:
- openssl aes-256-cbc -k "$ENCRYPTION_SECRET" -in scripts/profile/TravisExample_Ad_Hoc.mobileprovision.enc -d -a -out scripts/profile/TravisExample_Ad_Hoc.mobileprovision
- openssl aes-256-cbc -k "$ENCRYPTION_SECRET" -in scripts/certs/dist.p12.enc -d -a -out scripts/certs/dist.p12
- openssl aes-256-cbc -k "$ENCRYPTION_SECRET" -in scripts/certs/dist.p12.enc -d -a -out scripts/certs/dist.p12

就這樣,在 GitHub 上面的文件就安全了,并且 Travis 依舊能讀取并使用這些加密后的文件。但是有一個安全問題你需要知道:在 Travis 的編譯日志中可能會顯示出解密環(huán)境變量。不過對 pull 請求來說不會出現(xiàn)。

添加腳本

現(xiàn)在我們需要確保證書都導入至 Travis CI 的鑰匙串中。為此,我們需要在 scripts 文件夾中添加一個名為 add-key.sh 的文件:

#!/bin/sh
security create-keychain -p travis ios-build.keychain
security import ./scripts/certs/apple.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign
security import ./scripts/certs/dist.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign
security import ./scripts/certs/dist.p12 -k ~/Library/Keychains/ios-build.keychain -P $KEY_PASSWORD -T /usr/bin/codesign
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp ./scripts/profile/$PROFILE_NAME.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/

通過上面的命令創(chuàng)建了一個名為 ios-build 的臨時鑰匙串,里面包含了所有證書。注意,這里我們使用了 $KEY_PASSWORD 來導入私鑰。最后一步是將配置文件拷貝至 Library 文件夾。

創(chuàng)建好文件之后,確保給其授予了可執(zhí)行的權限:在命令行輸入:chmod a+x scripts/add-key.sh 即可。為了正常使用腳本,必須要這樣處理一下。

至此,已經(jīng)導入了所有的證書和配置文件,我們可以開始給應用程序簽名了。注意,在給程序簽名之前必須對程序進行編譯。由于我們需要知道編譯結果存儲在磁盤的具體位置,我建議在編譯命令中使用 OBJROOTSYMROOT 來指定輸出目錄。另外,為了創(chuàng)建 release 版本,還需要把 SDK 設置為 iphoneos,以及將 configuration 修改為 Release

xctool -workspace TravisExample.xcworkspace -scheme TravisExample -sdk iphoneos -configuration Release OBJROOT=$PWD/build SYMROOT=$PWD/build ONLY_ACTIVE_ARCH=NO 'CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist'

如果運行了上面的命令,那么編譯完成之后,可以在 build/Release-iphoneos 目錄找到應用程序的二進制文件。接下來,就可以對其簽名,并創(chuàng)建 IPA 文件了。為此,我們創(chuàng)建一個新的腳本:

#!/bin/sh
if [[ "$TRAVIS_PULL_REQUEST" != "false" ]]; then
  echo "This is a pull request. No deployment will be done."
  exit 0
fi
if [[ "$TRAVIS_BRANCH" != "master" ]]; then
  echo "Testing on a branch other than master. No deployment will be done."
  exit 0
fi

PROVISIONING_PROFILE="$HOME/Library/MobileDevice/Provisioning Profiles/$PROFILE_NAME.mobileprovision"
OUTPUTDIR="$PWD/build/Release-iphoneos"

xcrun -log -sdk iphoneos PackageApplication "$OUTPUTDIR/$APPNAME.app" -o "$OUTPUTDIR/$APPNAME.ipa" -sign "$DEVELOPER_NAME" -embed "$PROVISIONING_PROFILE"

第二行至第九行非常重要。我們并不希望在某個特性分支上創(chuàng)建新的 release。對 pull 請求也一樣的。由于安全環(huán)境變量被禁用,所以 pull 請求也不會編譯。

第十四行,才是真正的簽名操作。這個命令會在 build/Release-iphoneos 目錄生成 2 個文件:TravisExample.ipaTravisExample.app.dsym。第一個文件包含了分發(fā)至手機上的應用程序。dsym 文件包含了二進制文件的調(diào)試信息。這個文件對于記錄設備上的 crash 信息非常重要。之后當我們部署應用程序的時候,會用到這兩個文件。

最后一個腳本是移除之前創(chuàng)建的臨時鑰匙串,并刪除配置文件。雖然這不是必須的,不過這有助于進行本地測試。

#!/bin/sh
security delete-keychain ios-build.keychain
rm -f ~/Library/MobileDevice/Provisioning\ Profiles/$PROFILE_NAME.mobileprovision

最后一步,我們必須告訴 Travis 什么時候執(zhí)行這三個腳本。在應用程序編譯、簽名和清除等之前,需要先添加私鑰。在 .travis.yml 文件中添加如下內(nèi)容:

before_script:
- ./scripts/add-key.sh
- ./scripts/update-bundle.sh
script:
- xctool -workspace TravisExample.xcworkspace -scheme TravisExample -sdk iphoneos -configuration Release OBJROOT=$PWD/build SYMROOT=$PWD/build ONLY_ACTIVE_ARCH=NO
after_success:
- ./scripts/sign-and-upload.sh
after_script:
- ./scripts/remove-key.sh

完成上面的所有操作之后,我們就可以將所有內(nèi)容 push 到 GitHub 上,等待 Travis 對應用程序進行簽名。我們可以在工程頁面下的 Travis 控制臺驗證是否一切正常。如果一切正常的話,下面來看看如何將簽好名的應用程序部署給測試人員。

部署應用程序

這里有兩個知名的服務可以幫助你發(fā)布應用程序:TestFlightHockeyApp。不管選擇哪個都能夠滿足需求。就我個人來說,推薦使用 HockeyApp,不過這里我會對這兩個服務都做介紹。

首先我們對 sign-and-build.sh 腳本做一個擴充 -- 在里面添加一些 release 記錄:

RELEASE_DATE=`date '+%Y-%m-%d %H:%M:%S'`
RELEASE_NOTES="Build: $TRAVIS_BUILD_NUMBER\nUploaded: $RELEASE_DATE"

注意這里使用了一個 Travis 的全局變量 TRAVIS_BUILD_NUMBER。

TestFlight

創(chuàng)建一個 TestFlight 賬號,并配置好應用程序。為了使用 TestFlight 的 API,首先需要獲得 api_tokenteam_token。再強調(diào)一下,我們需要確保它們是加密的。在命令行中執(zhí)行如下命令:

travis encrypt "TESTFLIGHT_API_TOKEN={api_token}" --add
travis encrypt "TESTFLIGHT_TEAM_TOKEN={team_token}" --add

現(xiàn)在我們可以調(diào)用相應的 API 了。并將下面的內(nèi)容添加到 sign-and-build.sh:

curl http://testflightapp.com/api/builds.json \
  -F file="@$OUTPUTDIR/$APPNAME.ipa" \
  -F dsym="@$OUTPUTDIR/$APPNAME.app.dSYM.zip" \
  -F api_token="$TESTFLIGHT_API_TOKEN" \
  -F team_token="$TESTFLIGHT_TEAM_TOKEN" \
  -F distribution_lists='Internal' \
  -F notes="$RELEASE_NOTES"

千萬不要使用 verbose 標記 (-v) -- 這會暴露加密 tokens。

HockeyApp

注冊一個 HockeyApp 賬號,并創(chuàng)建一個新的應用程序。然后在概述頁面獲取一個 App ID。接下來,我們必須創(chuàng)建一個 API token。打開這個頁面,并創(chuàng)建一個。如果你希望自動的將新版本部署給所有的測試人員,那么請選擇 Full Access 版本。

對 App ID 和 token 進行加密:

travis encrypt "HOCKEY_APP_ID={app_id}" --add
travis encrypt "HOCKEY_APP_TOKEN={api_token}" --add

然后在 sign-and-build.sh 文件中調(diào)用相關的 API:

curl https://rink.hockeyapp.net/api/2/apps/$HOCKEY_APP_ID/app_versions \
  -F status="2" \
  -F notify="0" \
  -F notes="$RELEASE_NOTES" \
  -F notes_type="0" \
  -F ipa="@$OUTPUTDIR/$APPNAME.ipa" \
  -F dsym="@$OUTPUTDIR/$APPNAME.app.dSYM.zip" \
  -H "X-HockeyAppToken: $HOCKEY_APP_TOKEN"

注意我們還上傳了 dsym 文件。如果集成了 TestFlightHockeyApp SDK,可以立即收集到易讀的 crash 報告。

Travis 故障排除

使用 Travis 一個月以來,并不總是那么順暢。知道如何不通過直接訪問編譯環(huán)境就能找出問題是非常重要的。

在寫本文的時候,還沒有可以下載的虛擬機映像 (VM images) 。如果 Travis 不能正常編譯,首先試著在本地重現(xiàn)問題。在本地執(zhí)行跟 Travis 相同的編譯命令:

xctool ...

為了調(diào)試 shell 腳本,首先需要定義環(huán)境變量。我的做法是創(chuàng)建一個新的 shell 腳本來設置所有的環(huán)境變量。記得將這個腳本添加到 .gitignore 文件中 -- 因為我們并不希望將該文件公開暴露出去。針對示例工程來說, config.sh 腳本文件看起來是這樣的:

#!/bin/bash

# Standard app config
export APP_NAME=TravisExample
export DEVELOPER_NAME=iPhone Distribution: Mattes Groeger
export PROFILE_NAME=TravisExample_Ad_Hoc
export INFO_PLIST=TravisExample/TravisExample-Info.plist
export BUNDLE_DISPLAY_NAME=Travis Example CI

# Edit this for local testing only, DON'T COMMIT it:
export ENCRYPTION_SECRET=...
export KEY_PASSWORD=...
export TESTFLIGHT_API_TOKEN=...
export TESTFLIGHT_TEAM_TOKEN=...
export HOCKEY_APP_ID=...
export HOCKEY_APP_TOKEN=...

# This just emulates Travis vars locally
export TRAVIS_PULL_REQUEST=false
export TRAVIS_BRANCH=master
export TRAVIS_BUILD_NUMBER=0

為了暴露出所有的環(huán)境變量,執(zhí)行如下命令(確保 config.sh 是可執(zhí)行的):

. ./config.sh

然后試著運行 echo $APP_NAME,以此檢查腳本是否正確。如果正確的話,那么現(xiàn)在我們不用做任何修改,就能在本地運行所有的 shell 腳本了。

如果在本地得到的是不同的編譯信息,那么可能是使用了不同的庫和 gems。盡量試著將配置信息設置為與 Travis VM 相同的信息。Travis 在這里列出了其所有安裝的軟件版本。你也可以在 Travis 的配置文件中添加調(diào)試信息得到所有庫文件的版本:

gem cocoapod --version
brew --version
xctool -version
xcodebuild -version -sdk

在本地安裝好與服務器完全相同的軟件之后,再重新編譯項目。

如果獲取到的編譯信息仍然不一樣,試著將項目 check out 到一個新的目錄。并確保所有的緩存都已清空。每次編譯程序時,Travis 都會創(chuàng)建一個全新的虛擬機,所以不存在緩存的問題,但在你的本地機器上可能會出現(xiàn)。

一旦在本地重現(xiàn)出和服務器上相同的錯誤,就可以開始調(diào)查具體問題了。當然導致問題的原因取決于具體問題。一般來說,通過 Google 都能找到引起問題的根源。

如果一個問題影響到了 Travis 上其它的項目,那么可能是 Travis 環(huán)境配置的原因。我曾經(jīng)遇到過幾次這樣的問題 (特別是剛開始時)。如果發(fā)生這樣的情況試著聯(lián)系 Travis,取得支持,以我的經(jīng)驗來說,他們的響應非常迅速。

點評

Travis CI 跟市面上同類產(chǎn)品相比還是有一些限制。因為 Travis 運行在一個預先配置好的虛擬機上,因此必須為每次編譯都安裝一遍所有的依賴。這會花費一些額外的時間。不過 Travis 團隊已經(jīng)在著手提供一種緩存機制解決這個問題了。

在一定程度上,你會依賴于 Travis 所提供的配置。比如你只能使用 Travis 內(nèi)置的 Xcode 版本進行編譯。如果你本地使用的 Xcode 版本較新,你的項目在服務器上可能無法編譯通過。如果 Travis 能夠為不同的 Xcode 版本都分別設置一個對應虛擬機會就好了。

對于復雜的項目來說,你可能希望把整個編譯任務分為編譯應用,運行集成測試等等。這樣你可以快速獲得編譯信息而不用等所有的測試都完成。目前 Travis 還沒有直接支持有依賴的編譯。

當項目被 push 到 GitHub 上時,Travis 會自動觸發(fā)。不過編譯動作不會立即觸發(fā),你的項目會被放到一個根據(jù)項目所用語言不同而不同的一個全局編譯隊列,不過專業(yè)版允許并發(fā)編譯。

總結

Travis CI 提供了一個功能完整的持續(xù)集成環(huán)境,以進行應用程序的編譯、測試和部署。對于開源項目來說,這項服務是完全免費的。很多社區(qū)項目都得益于 GitHub 強大的持續(xù)集成能力。你可能已經(jīng)看過如下這樣的按鈕

對于商業(yè)項目,Travis 專業(yè)版也能為私有倉庫提供快捷、簡便的持續(xù)集成支持。

如果你還沒有用過 Travis,趕緊去試試吧,它棒極了!

更多鏈接

上一篇:Collection View 動畫下一篇:插件