Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Travis and Fastlane
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Steven Shen
July 10, 2015
Technology
970
3
Share
Travis and Fastlane
A brief introduction of travis and fastlane setup for iOS project in Cocoaheads Taipei
Steven Shen
July 10, 2015
More Decks by Steven Shen
See All by Steven Shen
From Taiwan to Silicon Valley
syshen
0
84
Xing's shareing in Evernote Taiwan Meetup
syshen
0
68
簡單學會 iOS 開發
syshen
3
390
A lightning talk about UICollectionView
syshen
1
110
Other Decks in Technology
See All in Technology
ポスター発表&デモと総括 / Poster Presentations & Demonstrations and Summary
ks91
PRO
0
190
AI フレンドリーなエラー監視を TypeScript で実現する
shinyaigeek
2
250
Cloud Run のアップデート 触ってみる&紹介
gre212
0
300
データ基盤をDataformで整えた話 〜 開発環境を添えて 〜
takapy
0
100
「コーディング」しない人のための Claude Code 入門 ChatGPT の次の一歩 — 業務に組み込む 育成・共有・自動化
rfdnxbro
2
1.2k
【Gen-AX】20260530開催_JJUG CCC 2026 Spring
genax
0
410
Unlocking the Apps
pimterry
0
200
価格.comをAI駆動で全面刷新する ー 30年分の技術的負債を返し、次の30年の土台をつくる ー / AI Engineering Summit Tokyo 2026
tkyowa
46
49k
正解のないAIプロダクトをどう導くか?dodaが挑む、ユーザーの『本音』を構造化する評価設計と検証のリアル
techtekt
PRO
0
170
「嘘をつくテスト」の失敗例から学ぶ 良いテストコード #frontend_phpcon_do
asumikam
0
200
電子辞書Brainをネットに繋げてみた(自力編)
raspython3
0
430
Gradle×GitHub_ActionsでCI時間を約50%短縮 ジョブ分割の設計と落とし穴 / Cutting CI Time by ~50% with Gradle and GitHub Actions: Job-Splitting Design and Pitfalls
takatty
0
620
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
380
Into the Great Unknown - MozCon
thekraken
41
2.5k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
160
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
RailsConf 2023
tenderlove
30
1.5k
GitHub's CSS Performance
jonrohan
1033
470k
Designing Experiences People Love
moore
143
24k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
150
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
210
The Spectacular Lies of Maps
axbom
PRO
1
790
Transcript
TRAVIS CI
% git add % git commit % git push Service
hook Mac VM Xcode • Build • Test • Deploy • Notify
Setup Availability Speed Easy Manual Cloud Private network Depends Medium
Trouble shooting Hard Easy Cost Free for open source ….. $129/month for private repo
Setup % gem install travis % vim .travis.yml language: objective-c
script: - make notifications: email: false
all: xcodebuild -arch "i386" -configuration "Debug" -sdk "iphonesimulator" build |
xcpretty
Code Sign • Encrypt your keys, certificates, and provisioning profiles.
• Commit encrypted files to github • Decrypt and install before build
% openssl aes-256-cbc -k "foo" -in certs/dist.cer -out certs/dist.cer.enc -a
% openssl aes-256-cbc -k "foo" -in certs/dist.p12 -out certs/dist.p12.enc -a % openssl aes-256-cbc -k "foo" -in certs/dev.cer -out certs/dev.cer.enc -a % openssl aes-256-cbc -k "foo" -in certs/dev.p12 -out certs/dev.p12.enc -a % openssl aes-256-cbc -k “foo” -in certs/AppStore.mobileprovision -out certs/AppStore.mobileprovision.enc -a % openssl aes-256-cbc -k “foo” -in certs/AdHoc.mobileprovision -out certs/AdHoc.mobileprovision.enc -a before_script: - openssl aes-256-cbc -k "$SECRET" -in certs/AdHoc.mobileprovision.enc -d -a -out certs/AdHoc.mobileprovision - openssl aes-256-cbc -k "$SECRET" -in certs/AppStore.mobileprovision.enc -d -a -out certs/AppStore.mobileprovision - openssl aes-256-cbc -k "$SECRET" -in certs/dist.cer.enc -d -a -out certs/dist.cer - openssl aes-256-cbc -k "$SECRET" -in certs/dist.p12.enc -d -a -out certs/dist.p12 - openssl aes-256-cbc -k "$SECRET" -in certs/dist.cer.enc -d -a -out certs/dist.cer - openssl aes-256-cbc -k "$SECRET" -in certs/dist.p12.enc -d -a -out certs/dist.p12 Encrypt Decrypt Export
% travis encrypt “SECRET=foo” --add env: global: - secure: eLo92Sw8KejuadMDTgY
+bMAPow3D4zqkhBqXm8oUDctZn3qOJ5iJgMrNxfhSUx+AX/ jiT07+U0vicHWRjGtkIGBeZJ8FVJL7NZQbIbqa80g0+MT4CNk4bumUphY0 w+OOzsY8V4OKR90mUmzz3bVN8/ROFBZygeYBdiLnmhoQ93E= - secure: fGoTHN29GtCiux/ aGJ2wm3NYtbyIRh0vnfoJafYdzWC6lj0PWrv0KVF31rHA56f7wPVLFnLrx 2UhNzZHfMaavD9QSGVYNOcE2AVXuaRWnMrKmCjAkCW/7qnePwxcgcQTV +zQJTV523G4nDbWQMoQ9wugzTsxhj+Ob+ZF0cGEXUA= Use command line
#!/bin/sh # create keychain security create-keychain -p travis ios-build.keychain security
default-keychain -s ios-build.keychain security unlock-keychain -p travis ios-build.keychain security set-keychain-settings -t 3600 -l ~/Library/Keychains/ios- build.keychain # Certificate & Private key security import ./certs/cert.cer -k ~/Library/Keychains/ios- build.keychain -T /usr/bin/codesign security import ./certs/key.p12 -k ~/Library/Keychains/ios- build.keychain -P "$KEY_PASSWORD" -T /usr/bin/codesign # Provisioning profiles mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles cp "./certs/AppStore.mobileprovision" ~/Library/MobileDevice/ Provisioning\ Profiles/ cp "./certs/AdHoc.mobileprovision" ~/Library/MobileDevice/ Provisioning\ Profiles/
language: objective-c osx_image: xcode6.4 before_install: - gem install fastlane before_script:
- openssl aes-256-cbc -k "$SECRET" -in certs/EMQAppStore.mobileprovision.enc -d -a -out certs/ EMQAppStore.mobileprovision - openssl aes-256-cbc -k "$SECRET" -in certs/EMQDev.mobileprovision.enc -d -a -out certs/ EMQDev.mobileprovision - openssl aes-256-cbc -k "$SECRET" -in certs/cert.cer.enc -d -a -out certs/cert.cer - openssl aes-256-cbc -k "$SECRET" -in certs/dev-cert.cer.enc -d -a -out certs/dev-cert.cer - openssl aes-256-cbc -k "$SECRET" -in certs/key.p12.enc -d -a -out certs/key.p12 - openssl aes-256-cbc -k "$SECRET" -in certs/dev-key.p12.enc -d -a -out certs/dev-key.p12 - sh ./certs/install-keys.sh script: - make podfile: iOSApp/Podfile notifications: email: false slack: emq-inc:kPgGUXItHsgRsNtc77Fz3f3P env: global: - secure: OqyOY/I8QoucKb4uWY9xu9pkXgFoTahqiRl3BLOCJEbgKMKoUyDnk7N/ALktHp2S/NuB4zj5PNA50Lhb/ zAnI7cTgZT0qEDJv2yDIM/j0wQFEHbKQafEHDWj2vAnook8OBpXiiykqWIb1dKgXCjzcEDjxhSo5V6V5IsdFHVAAew= - secure: gAw0juDvfHolj0zg93f2qnCFBxetvFIBTsMCgHMzStk0DyKrsh4IV +1x2CCqSFWo5q4EbXmsKKeyQKqfreIbbQTmZkAmXjIiVg70LDVgsqk5COWUTRgn21pUGWUFosxAkSZZghEf0o3Z62jA6FgeJkCkP cSLszuE0Qlbiq0SFSw= - secure: eLo92Sw8KejuadMDTgY+bMAPow3D4zqkhBqXm8oUDctZn3qOJ5iJgMrNxfhSUx+AX/ jiT07+U0vicHWRjGtkIGBeZJ8FVJL7NZQbIbqa80g0+MT4CNk4bumUphY0w+OOzsY8V4OKR90mUmzz3bVN8/ ROFBZygeYBdiLnmhoQ93E= - secure: fGoTHN29GtCiux/ aGJ2wm3NYtbyIRh0vnfoJafYdzWC6lj0PWrv0KVF31rHA56f7wPVLFnLrx2UhNzZHfMaavD9QSGVYNOcE2AVXuaRWnMrKmCjAkCW /7qnePwxcgcQTV+zQJTV523G4nDbWQMoQ9wugzTsxhj+Ob+ZF0cGEXUA=
None
None
xcodebuild -arch "i386" -configuration "Debug" - sdk "iphonesimulator" build |
xcpretty fastlane build
Setup % sudo gem install fastlane % fastlane init %
vim fastlane/Appfile % vim fastlane/Fastfile
def unit_test xctest( workspace: 'EMQ.xcworkspace', scheme: 'EMQ-Demo', configuration: 'Demo', sdk:
"iphonesimulator", arch: "i386", reports:[{ report: 'html', output: './test-report.html' }] ) slack( message: 'EMQ iOS App Unit Test', channel: '#dev-ios', default_payloads: [:test_result, :git_branch, :git_author, :last_git_commit], ) end before_all do ENV["SLACK_URL"] = "https://hooks.slack.com/services/ABCDEFG/ABCDEFG/ABCDEFG" clean_build_artifacts cocoapods end
lane :deliver_demo do #increment_build_number sigh xcodebuild( workspace: 'EMQ.xcworkspace', configuration: 'Demo',
scheme: 'EMQ-Demo', identity: 'iPhone Distribution: EMQ Limited (28HUT34N52)', clean: true ) unit_test xcarchive( workspace: 'EMQ.xcworkspace', configuration: 'Demo', scheme: 'EMQ-Demo', embed: '../certs/EMQAppStore.mobileprovision', identity: 'iPhone Distribution: EMQ Limited (28HUT34N52)' ) xcexport resign( ipa: 'EMQ-Demo.ipa', signing_identity: 'iPhone Distribution: EMQ Limited (28HUT34N52)', provisioning_profile: '../certs/EMQAppStore.mobileprovision', ) testflight(skip_deploy: true) end
None
all: ifeq ($(TRAVIS_PULL_REQUEST), false) fastlane test else agvtool new-version -all
$(TRAVIS_BUILD_NUMBER) fastlane deliver_demo endif
xcodebuild -arch "i386" -configuration "Debug" -sdk "iphonesimulator" build | xcpretty
fastlane build Trouble shooting
None
• Easy setup • No maintenance • Github integration •
Bad for trouble shooting • Automate your flows • Flexible, customizable • Life saver • Great for CI