蒲公英文檔中心
這篇文章將會給大家介紹如何在 iOS 項目中使用 Travis CI ,并將 App 簽名后發布到蒲公英。
Travis CI 是目前比較流行的持續集成工具之一,用來構建及測試在 Github 托管的代碼,使用它可以極大的簡化工作流程。Travis CI 產品分為:
注:本文中介紹的Demo是基于(Travis-ci.org)
需要在本地安裝 Travis CI 命令工具。
確保本地系統配置 Ruby 1.9 以上版本:
ruby -v
安裝Travis-CI (如果使用 Mac OS 最好先更新 Ruby 到最新版本,然后再安裝)
gem install travis --no-rdoc --no-ri
驗證 Travis 是否安裝成功 (有版本輸出則說明安裝成功)
travis -v
1.8.8
登錄 Travis。在命令行中,使用 GitHub 賬號登錄
travis login
登錄后,可以用
travis accounts
來驗證賬號是否成功登錄。
通過 Github 賬號登錄 Travis 平臺。Travis 會自動同步Github賬號上所有的開源項目。通過列表選擇需要啟動的項目。
.travis.yml
文件。這個文件用于說明 Travis CI 需要處理的構建。Travis CI 本身提供基本的構建和支持語言,同時開發者可以通過.travis.yml
文件設置自己的構建操作,同時需要遵從 Travis CI 自己規定的構建生命周期。具體可查閱這里
在完成 .travis.yml
定義后, 可以通過 travis lint [path to your .travis.yml]
命令驗證這個文件語法是否正確性。如果正確會出現以下的提示:
配置 iOS 工程基本模板,在 .travis.yml
中定義以下內容:
language: objective-c
osx_image: xcode9
如果你只是想使用 Travis CI 的構建功能,那么這兩行已經足夠了。在你把.travis.yml
Push 到 Github 上之后,Travis CI 就會自動開始 Build 流程,在 Build 完成之后,Github 綁定的郵箱就能收到通知。當然,對蒲公英的用戶來說,只是 Build 是不夠的,我們還希望能夠對 App 進行打包,簽名,并發布到蒲公英平臺上。
在使用 Travis CI 需要我們修改兩處項目配置,否則的話,會導致 Build 失敗。
為了對 App 進行簽名,我們必須得配置好證書和配置文件。
從蘋果官網下載證書,或者從鑰匙串中導出。并將其保存到項目的目錄 travis/certificates/AppleWWDRCA.cer
中。
在鑰匙串程序中選中證書分別導出證書和私鑰。
切記:不要上傳沒有加密的證書和描述文件到 GitHub 的公開倉庫(下文會講如何加密)
將證書和和 p12 文件放在 travis/certificates/sdk_demo.cer
,travis/certificates/sdk_demo.p12
。導出 p12 文件的時候要輸入密碼。
Travis CI 在使用 p12 文件的時候需要知道密碼,而我們又不能將密碼明文保存在某個地方,所以這個時候我們可以使用到 Travis CI 的安全環境變量功能。
打開終端,定位到.travis.yml
文件所在的目錄,用下列命令來保存 p12 文件的密碼。
travis encrypt "KEY_PASSWORD=123456" --add
這其中的123456
就是你導出 p12 文件時輸入的密碼。在輸入了這條命令之后我們就會發現.travis.yml
多了一行數據
- secure: xJz9E1EJdBDAIZcNaz86a7nrJpbdPHS3xiXU5L4Gj4rFR0TcxHsHuu2dcZR/yRJRHg6oum2zuMr0XBsSffMBYFHX5Kw2jb31Ci6uFbOTI/FGBrwdvfhQBL+h/7xe/j3l1bmbmfElYP02fiJvN5VSVyA0 3Iobp7u3vY0TW7yce+po23DmJCTYgnUdfuf4EBO3gpgbOTPdmIxqyhqqw5Ndwmvxpq9BqneqEc3pmNCC1FC6H4RmgjkWnMln5ffWIxNN+nwgPzSDqHDMUnQaYtVUU/CHLQCmNCgQmkrG/OWYvlo4RqpEX6VZv5BUa6gD 7d4lgcfXHONkmLKNbiWBGDRbbBQNNSbubTtGlyGtzCHwEe4KvHoM4n0yDZqtd9edgrxlOSuBgNlQK+/3C6BhZZi2rWNlnqBU7F/ZSmjBONWgRuFZJ2zJByHWLoTTOHvYbFdk4CTmT5qMQPQ7favMu1L9TUBpbX4qBX4D iXpEKNODtwOvdYjlfiZ+US6i637JeZF8OK9bBtUf4oKjvl1Oz5ly56snTBknF3V+if6VoHlG1Cfroqhy2F7ahS2K3Aq0u4O2gMIVqTRd1juBLo6QkzV/F+go4KvYDwOFpAX05AYrJNOQgAHae5a8Px2YIct1QcRTL++r Enqx1QzQWXIEXpezm8m1pR8TcB8d2WbLGtwTd/8=
這行數據就是通過上述命令安裝到.tarvis.yml
文件中的環境變量KEY_PASSWORD
,在后續打包的過程中,Travis 就可以通過引用KEY_PASSWORD
來使用 p12 文件對應的密碼。
簽名打包的時候,我們還需要用到 .mobileprovison 描述文件。描述文件可以在在蘋果開發者網站上創建和下載(Provisioning Profiles > Distribution > Add > Ad Hoc or In House
)。將下載后的文件保存在travis/certificates/sdk_demo.mobileprovision
。
同時,我們還需要將對應的,描述文件的文件名,App 名稱,開發者名稱都保存在 .travis.yml
文件中:
env:
global:
- APPNAME="PgySDKDemo"
- 'DEVELOPER_NAME="iPhone Distribution: your developer name (your developer code)"'
- PROFILE_NAME="sdk_demo"
如果使用的是 GitHub 的公開倉庫,我們還需要對證書,配置文件,私鑰這些敏感文件進行加密。加密了之后,我們還需要告訴 Travis CI 如何去解密這些文件。
Travis 在解密時只支持單文件,所以,我們還需要在加密前把證書和配置文件打包成一個壓縮包。
tar cvf certificates.tar sdk_demo.cer sdk_demo.p12 sdk_demo.mobileprovison
運行完命令之后,就會發現,文件目錄中多了一個 certificates.tar
的文件,我們把這個文件放到項目的根目錄下。然后在項目的根目錄下運行命令:
travis encrypt-file certificates.tar -a
對壓縮后的證書和配置文件進行加密。-a
參數的作用是自動的把解密文件的指令添加到.travis.yml
文件中。運行完指令后,我們會得到一個名為 certificates.tar.enc
的加密文件。這個時候,就可以把未加密的 certificates.tar
和 travis/certificates
文件夾目錄下的 sdk_demo.cer sdk_demo.p12 sdk_demo.mobileprovison
這四個文件刪除掉。
運行完加密命令后,我們還會發現 .travis.yml
文件中多了一行:
- openssl aes-256-cbc -K $encrypted_2838d02a56a6_key -iv $encrypted_2838d02a56a6_iv
-in certificates.tar.enc -out certificates.tar -d
這一行的作用就是解密證書文件。需要注意的是,解密之后的文件仍然是一個壓縮包,我們需要將壓縮包解壓縮。
在before_install:
中添加下列代碼:
- tar xvf certificates.tar -C ./travis/certificates
為了進行簽名打包,我們還需要將證書導入到 Travis CI 運行環境的鑰匙串中。為了導入鑰匙串我們在 scripts
文件夾中添加一個名為add-key.sh
的文件。下面是add-key.sh
的全部內容:
#!/bin/sh
# Create a custom keychain
security create-keychain -p travis ios-build.keychain
security default-keychain -d user -s ios-build.keychain
security unlock-keychain -p travis ios-build.keychain
security set-keychain-settings -t 3600 -l ~/Library/Keychains/ios-build.keychain
security import ./scripts/travis/AppleWWDRCA.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign
security import ./scripts/travis/sdk_demo.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign
security import ./scripts/certs/sdk_demo.p12 -k ~/Library/Keychains/ios-build.keychain -P $KEY_PASSWORD -A
echo "list keychains: "
security list-keychains
echo " ****** "
echo "find indentities keychains: "
security find-identity -p codesigning ~/Library/Keychains/ios-build.keychain
echo " ****** "
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp "./scripts/profile/sdk_demo.mobileprovision" ~/Library/MobileDevice/Provisioning\ Profiles/
通過add-key.sh
這個腳本,我們創建了一個名為 ios-build 的臨時鑰匙串。臨時鑰匙串里包含了所有的證書信息。其中 $KEY_PASSWORD
就是在引用 p12 文件的密碼。通過這個腳本創建的臨時鑰匙串,還需要在我們完成了簽名打包之后刪除掉。
為了保證腳本能夠正常運行,我們還需要給腳本設置可執行權限:
before_install:
- chmod +x scripts/travis/add-key.sh
在 Xcode 8.2 以前廣泛使用的打包工具 xctool 現在已經不能使用了,我們只能通過 xcodebuild 來打包,打包分為兩步:Archive 和 簽名。打包腳本如下:
#!/bin/sh
xcrun xcodebuild -project PgySDKDemo.xcodeproj -scheme PgySDKDemo \
-archivePath PgySDKDemo.xcarchive archive
xcrun xcodebuild -exportArchive -archivePath PgySDKDemo.xcarchive \
-exportPath ./build -exportOptionsPlist ExportOptions.plist
這其中需要一個-exportOptionsPlist
文件,獲取這個文件最簡單的方式就是通過使用 Xcode 導出一個 ipa ,在導出的 ipa 所在的文件夾中就有一個 ExportOptions.list。我們把這個文件放在項目的根目錄中就可以了。
運行完打包腳本之后,我們就可以在項目的 ./build
目錄下找到簽名好的 ipa 文件了。
我們已經寫好了一個上傳 ipa 文件的 shell 腳本。你只需要在 before_install:
中下載該腳本,并給與該腳本執行權限,并在打包完成之后調用該上傳腳本。
- wget -c https://raw.githubusercontent.com/Pgyer/TravisFile/master/pgyer_upload.sh
-O pgyer_upload.s
#!/bin/sh
./pgyer_upload.sh "./build/$APPNAME.ipa" $PGYER_APIKEY
上傳的時候,需要用到蒲公英的 API_KEY, 你可以在這里找到你的 API_KEY。由于 API_KEY 不能明文保存,所以我們通過使用和保存密碼一樣的方式,把它安裝到 .travis.yml
文件中。打開終端,定位至項目的根目錄,在命令行中輸入:
travis encrypt "PGYER_APIKEY=655b39fe4bad7a701bd44dfbcafdcc2f" --add
在所有環節都結束后,我們還需要刪除掉導入的鑰匙串信息。我們在 /scripts/travis 文件夾下添加一個新的文件 remove-key.sh
:
#!/bin/sh
security delete-keychain ios-build.keychain
rm -f ~/Library/MobileDevice/Provisioning\ Profiles/$PROFILE_NAME.mobileprovision
rm -f ~/Library/MobileDevice/Provisioning\ Profiles/team.mobileprovision
完成上述工作之后,每次我們新上新代碼到 GitHub 都會觸發 Travis CI 的持續集成,并將打包簽名后的 App 發布到蒲公英上。
一個完整版的 .travis.yml
文件如下所示:
language: objective-c
osx_image: xcode9.2
env:
global:
- APPNAME=PgySDKDemo
- PROFILE_NAME=sdk_demo
- 'DEVELOPER_NAME="iPhone Distribution: shengtao lei (DG37YK9PRK)"'
- secure: iL2KhNdYKzWLTtvaXmmQ3/ci66b0Z5c8VCTmpaoMIotdtwyTOgMnpzH+Vyrof3QBH/nV2oF6puT/b5Y6S6lrCY5b4nZSfhy8xL6FEPDboVzpq2qIAS4gn6qCGUkIkAxpcnKG9sbcxDsI5aLVOqxoevuHKB2Rkw925TWrg6+bfagtWQzVvkByIHT2jm2+7bkmNUx7UiIggNYN+H2ACpfdf/d9g7lC7w2hLb6hO0Mt5pK5eGbzlh8kn/1CnX7jSWw3SyEABEJ3CQOZX5x/yNP4oIJLgdEGW3sy1ErAi2uO+i89VDu1SaRcDLbNuAmlxb95dLVBVU7uWILdWTh6+o6FVL2Eoj1YPrNBJdcRykTvaCSR1eXPs6uCoq9tcWz0zinamSBzemOjdK+G+lOC6IpT9lTimt5Ln0lGQoVYERXnvJMEhR/2rFLvsTIqd+Wt8Agfqr9EeU0ah8agWiTIE6EuA0xdTyC0EyKVYKzXBy4wI6R2fknfn6uHyeFeIN9zpWY8tcwz8pRLDD+xiyoHgSybS1DK+Xr21llOopXkC/aacnoeslciNN28In9QRDwsiDUSlAb6dQ3pRCS/cDoRJBm759xcZ7kdMnwVAcSX7aZ9p8HT0uGvyuJdYNDr4vp0r98RtPI/7JonPXqXuWzsAzZdq5AAzchwNFAbTCrASw6qqHY=
- secure: KuD0JYZqJEtezCBkJ6Zkfw7I+0VGiv6E7GOa34KUzYsJWpLnzPYB08+NsYZYMh6Yjc8pkC8+MixgXLOHupWm5v3iRthWqD/tdmuF5bdQqIdrWkmQSl0cK9M+rMgc+vaPajguC0/yf+BoPWL6CJXouLLzj3D6IXUwZEVYhmPB4nBv/YHVk/FNwNS4aqP9SSp98VQoYrAGAvUSY3jm5L1qSNwCjPMBcX4QnlbX5mjl0mEf0pEbJ3ZZAz9AzpALfCYR4pPsS7/eSHxVAPNboD5JVQAK6NhaFCTUw0/UlGHW9m9eY3AezMpZo1M8kHXZXsC0BWoP8R4H6WYTybILxz6Aramb8N12R+ntLfAawnFnG5kV4mtUHFY7BqNu+tyBkba4axkclaY90fETekHUcCIqTlVmMjlKq6dzWkq4hGmDtEajajZHqMPBUMy5o8n8lXKww/ZkpvgEhrJjbxbmFcoP4oS2u9Vxi/Q18t+mRoQhGfan2cVQXdpQhk0S8scisVVnUSFHSglt79KjgKwNuVKtIpW89bG8HHQaqIgPFycvIbDRxSM6Xd+I7AIzz25XFdE/ao03ULrnDaIZLbgUa+IGjDknkRJmG9hFQKO2grkZ/JqNXQDSMEIXZrH46CocD1+j39k6wvYler5fdcIStf+wAW4hXmiO0en2hl2+qEFtJds=
- secure: YecGZLdjxnbJuIyJOywDan2lJ4sToYx2iq8ficMEzODXUxEGHRL6s6XFOPltsm6CnyUZKfT9bzAEWuGWnnES8fcPvMUAKvyNhcRW/D9JtMm/fboIdSjb2Ht8f/dY1IfgB241pMU7SkPifVIL08yxeMYZfwgFxbDQn60aXCiUKWuEcqMgxX2yLX9uHR+T/xuY6E+NX6UEB/6imx3rQ047nVfefMgh9YMGGl0ZH/N9beZgMrwlZn1lAfKMrkbJ3vw1go2RzxnDwa/Noy+6eKfbC8R4RgCvwQ6oXBEXG1IUjHbiNhR5pXajz/5jbum9T64fHUrx8e2aPKrYRWWjooQ5Q7+AER7PnAhTgFymHhDwUm7wEXoMuh5Ltp7jCNZiaKDxUoONw4Hz+oEXKbm4nYJCMFczjW4bQKH0gqNytPhl/y/08u0fuQxTP3wu6Zi0q0qo6e3eqCTGv3Q9YzEm7JWAb6RSO09aRRVvz7HwdZFwbHy07T9//YMUsX/chhw7fziso1wkutWOsVCfBVjMGO6Nve/B8xdCVV4sqiex/Wk3c/cNHB7dTVe9SC6nelrkuyvEqKtxk87/IDBo0sAHxounw9phwtXg+RM8fN+rvBqd9rY4H8hrRaZKdFqikMt3yexoFKcrAqbQuHEDVlz2dxDxZhgjOPyVaejsOHI2jt1bB58=
before_install:
- openssl aes-256-cbc -K $encrypted_2838d02a56a6_key -iv $encrypted_2838d02a56a6_iv
-in certificates.tar.enc -out certificates.tar -d
- cd $TRAVIS_BUILD_DIR
- wget -c https://raw.githubusercontent.com/Pgyer/TravisFile/master/pgyer_upload.sh
-O pgyer_upload.sh
- tar xvf certificates.tar -C ./travis/certificates
- chmod +x pgyer_upload.sh
- chmod +x travis/scripts/add-key.sh
- chmod +x travis/scripts/build.sh
- chmod +x travis/scripts/upload.sh
- chmod +x travis/scripts/remove-key.sh
before_script:
- "./travis/scripts/add-key.sh"
script:
- "./travis/scripts/build.sh"
after_success:
- "./travis/scripts/upload.sh"
after_script:
- "./travis/scripts/remove-key.sh"
本文介紹了如何使用 Travis CI 對 iOS 項目進行持續集成,并把打包簽名后的 App 上傳到蒲公英。希望對你能有所幫助。對應的 Demo 項目你可以在GitHub上找到。