How we integrate & deploy Mobile Apps with Travis CI
-
Upload
marcio-klepacz -
Category
Technology
-
view
839 -
download
4
Transcript of How we integrate & deploy Mobile Apps with Travis CI
How we integrate & deploy Mobile Apps with Travis CI Marcio Klepacz, iOS Engineering @ GetYourGuide CocoaHeads Berlin 2015
Overview
Who we are
The Problem
The Requirements
The Solution
Conclusion
Marcio Klepacz, GetYourGuide
Who we are
GetYourGuide Offers the Largest Travel Activities Inventory Worldwide
Marcio Klepacz, GetYourGuide
800+
10,600+ 5,300+
800+
4,000+
2,000+
Marcio Klepacz, GetYourGuide
The Problem
Repetitive
Manual
We want to automate that
Fit our workflow
Developer Happiness
Marcio Klepacz, GetYourGuide
😄Develop
😊 Run
Tests
😐Configure
😒 Build
😠 Write
release notes
😤 Upload, notify users, etc.
The Requirements
Requirements
Marcio Klepacz, GetYourGuide
Automatically build and test on push
Fit into gitflow workflow (feature, develop and
release) branch
Produce binaries that can be tested (downloaded)
Requirements / Gitflow
Marcio Klepacz, GetYourGuide
Requirements / Gitflow
Marcio Klepacz, GetYourGuide
Requirements / Gitflow
Marcio Klepacz, GetYourGuide
Requirements / Summary
Marcio Klepacz, GetYourGuide
Build an Alpha App for Test Environment
able to book with fake CC
Build a Beta App for the Live Environment
real content
Build and test on every push
Distribute app to testers from release and develop branches
Relieve developers from repetitive manual tasks
Marcio Klepacz, GetYourGuide
Xcode Server Jenkins Ship.io Travis CI
iOS and Android
❌ ✅ ✅
✅
Ac,ons specific to branches
✅
✅
✅
✅
Build on push
✅
✅
✅
✅
Big community
✅
✅
❌
✅
Hosted ❌
❌
✅
✅
The Solution
Travis
Marcio Klepacz, GetYourGuide
Hosted Continuous Integration service
Configuration file in your project (.travis.yml)
Define SDK, build env and output
custom scripts
Connected to Github
Triggers in every push and pull request
Available for many platforms
Travis Setup (.travis.yml)
Marcio Klepacz, GetYourGuide
It’s not using the iPhone SDK
code signing is needed
Doesn’t differentiate between branches
Doesn’t archive
Doesn’t distribute
language: objective-cxcode_project: MyNewProject.xcodeproj xcode_scheme: MyNewProjectSharedScheme
iPhone SDK
custom build per branch
generate .ipa
distribute
Import keys (import-keys.sh)
# 1. Create keychainsecurity create-keychain -p travis ios-build.keychain
# 2. Make as defaultsecurity default-keychain -s ios-build.keychain
# 3. Unlock keychainsecurity unlock-keychain -p travis ios-build.keychain
# 4. Add certificates to keychainsecurity import ./ios-travis-ci/certificates/dist.cer -k ios-build.keychain -T /usr/bin/codesignsecurity import ./ios-travis-ci/certificates/dist.p12 -k ios-build.keychain -P $KEY_DIST_PASSWORD -T /usr/bin/codesign
# 5. Copying provisioning profile to Travismkdir -p ~/Library/MobileDevice/Provisioning\ Profilescp ./ios-travis-ci/profiles/*.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
Marcio Klepacz, GetYourGuide
iPhone SDK
custom build per branch
generate .ipa
distribute
Import keys (import-keys.sh)
# 1. Create keychainsecurity create-keychain -p travis ios-build.keychain
# 2. Make as defaultsecurity default-keychain -s ios-build.keychain
# 3. Unlock keychainsecurity unlock-keychain -p travis ios-build.keychain
# 4. Add certificates to keychainsecurity import ./ios-travis-ci/certificates/dist.cer -k ios-build.keychain -T /usr/bin/codesignsecurity import ./ios-travis-ci/certificates/dist.p12 -k ios-build.keychain -P $KEY_DIST_PASSWORD -T /usr/bin/codesign
# 5. Copying provisioning profile to Travismkdir -p ~/Library/MobileDevice/Provisioning\ Profilescp ./ios-travis-ci/profiles/*.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
⛔️️
Marcio Klepacz, GetYourGuide
iPhone SDK
custom build per branch
generate .ipa
distribute
Security
Marcio Klepacz, GetYourGuide
You can encrypt environment variables using Travis command line tool on your terminal:
~ $ travis ecrypt ‘KEY_DIST_PASSWORD=abc123’ –add
Passing the option “--add” will automatically add the secure key to your .travis.yml env: global: - secure: Pz3cxDffsdafasf34324fdsf232fdsfdsf3fdsf
iPhone SDK
custom build per branch
generate .ipa
distribute
Travis Setup (.travis.yml)
Marcio Klepacz, GetYourGuide
Use iPhone SDK ✅
Doesn’t differentiate between branches
Doesn’t archive
Doesn’t distribute
language: objective-cenv: global: - secure: Pz3cxDffsdafasf34324fdsf232fdsfdsf3fdsf
before_script: - ./scripts/import-key.shscript: - xctool -workspace MyNewProject.xcworkspace -scheme MySharedScheme -sdk iphoneos -configuration Beta
iPhone SDK
custom build per branch
generate .ipa
distribute
Building (build_app.sh)
# 1.xctool -workspace ${APP_NAME}.xcworkspace \ -scheme ${APP_NAME} \ -sdk iphonesimulator test…# 2. export RELEASE_SUFFIX=".release”# Bundle Identifier:# com.getyourguide.mobile.$(PRODUCT_NAME:rfc1034identifier)${BUNDLE_ID_SUFFIX}${RELEASE_SUFFIX}…# 3xctool -workspace ${APP_NAME}.xcworkspace -scheme ${APP_NAME} \ -sdk iphoneos \ -configuration Debug \ OBJROOT=$PWD/build \ SYMROOT=$PWD/buildxctool -workspace ${APP_NAME}.xcworkspace -scheme ${APP_NAME} \ -sdk iphoneos \ -configuration Beta \ OBJROOT=$PWD/build \ SYMROOT=$PWD/build
Marcio Klepacz, GetYourGuide
iPhone SDK
custom build per branch
generate .ipa
distribute
Travis Setup (.travis.yml)
Marcio Klepacz, GetYourGuide
Use iPhone SDK ✅
Differentiate between branches ✅
Doesn’t archive
Doesn’t distribute
language: objective-cenv: global: - secure: Pz3cxDffsdafasf34324fdsf232fdsfdsf3fdsf
before_script: - ./scripts/import-key.shscript: - ./scripts/build-app.sh
iPhone SDK
custom build per branch
generate .ipa
distribute
# 1. xcrun -sdk iphoneos PackageApplication \ -v ”$BUILD_DIR/$APP_NAME.app" \ -o ”$BUILD_DIR/$APP_NAME.ipa" \ --sign "$DEVELOPER_NAME" \ --embed ”$PROVISIONING_PROFILE"…# 2. release_notes=`git log --since=1.week --pretty=format:"%an - %s"`curl \ -F status="2" \ -F notify="0" \ -F release_type="2" \ -F notes="$release_notes" \ -F notes_type="0" \ -F "ipa=@$outputdir/$APP_NAME.ipa" \ -F "mobileprovision=@$provisioning_profile" \ -H "X-HockeyAppToken: ${HOCKEY_APP_TOKEN}" \ https://rink.hockeyapp.net/api/2/apps/upload # Uploading to HockeyApp
Archiving and uploading (archive_and_upload.sh)
Marcio Klepacz, GetYourGuide
iPhone SDK
custom build per branch
generate .ipa
distribute
Travis Setup (.travis.yml)
Marcio Klepacz, GetYourGuide
Use iPhone SDK ✅
Differentiate between branches ✅
Archive ✅
Doesn’t distribute ✅
language: objective-cenv: global: - secure: Pz3cxDffsdafasf34324fdsf232fdsfdsf3fdsf
before_script: - ./scripts/import-key.shscript: - ./scripts/build-app.shafter_success: - ./scripts/archive_and_upload.sh
iPhone SDK
custom build per branch
generate .ipa
distribute
Move the scripts away from the app repository (Optional)
Marcio Klepacz, GetYourGuide
Maintenance 👍
Reusable 👍
Slower builds 👎
…git: submodules: false
before_install:- git submodule init ios-travis-ci- git submodule update --remote --merge ios-travis-ci
(Bonus) Overlaying Icons
Marcio Klepacz, GetYourGuide
Add icon overlay script on the Build Phase of your target
IconOverlaying (by: Krzysztof Zabłocki)
…before_install:…- brew install imagemagick && brew install ghostscript
Conclusion
Marcio Klepacz, GetYourGuide
Automate tasks
App is distributed
No manual configuration
Different actions between branches
5 different apps to test concurrently
(@banaslee’s phone)
Thanks for your time @marciok and [email protected]
References
Marcio Klepacz, GetYourGuide
Travis CI for iOS (Mattes Groeger)
johanneswuerbach / .travis.yml (Johannes Würbach)
The OS X Build Environment (Travis CI)