$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Travis and Fastlane
Search
Steven Shen
July 10, 2015
Technology
3
960
Travis and Fastlane
A brief introduction of travis and fastlane setup for iOS project in Cocoaheads Taipei
Steven Shen
July 10, 2015
Tweet
Share
More Decks by Steven Shen
See All by Steven Shen
From Taiwan to Silicon Valley
syshen
0
73
Xing's shareing in Evernote Taiwan Meetup
syshen
0
49
簡單學會 iOS 開發
syshen
3
370
A lightning talk about UICollectionView
syshen
1
97
Other Decks in Technology
See All in Technology
GitHub Copilotを使いこなす 実例に学ぶAIコーディング活用術
74th
3
3k
RAG/Agent開発のアップデートまとめ
taka0709
0
170
寫了幾年 Code,然後呢?軟體工程師必須重新認識的 DevOps
cheng_wei_chen
1
1.4k
20251209_WAKECareer_生成AIを活用した設計・開発プロセス
syobochim
7
1.5k
日本Rubyの会の構造と実行とあと何か / hokurikurk01
takahashim
4
1.1k
エンジニアリングマネージャー はじめての目標設定と評価
halkt
0
280
意外とあった SQL Server 関連アップデート + Database Savings Plans
stknohg
PRO
0
310
ログ管理の新たな可能性?CloudWatchの新機能をご紹介
ikumi_ono
1
690
Kiro Autonomous AgentとKiro Powers の紹介 / kiro-autonomous-agent-and-powers
tomoki10
0
460
AIと二人三脚で育てた、個人開発アプリグロース術
zozotech
PRO
1
720
新 Security HubがついにGA!仕組みや料金を深堀り #AWSreInvent #regrowth / AWS Security Hub Advanced GA
masahirokawahara
1
1.9k
Edge AI Performance on Zephyr Pico vs. Pico 2
iotengineer22
0
140
Featured
See All Featured
A better future with KSS
kneath
240
18k
Thoughts on Productivity
jonyablonski
73
5k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
How to train your dragon (web standard)
notwaldorf
97
6.4k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
13k
YesSQL, Process and Tooling at Scale
rocio
174
15k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
What's in a price? How to price your products and services
michaelherold
246
13k
Visualization
eitanlees
150
16k
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