how we integrate & deploy mobile apps with travis ci

30
How we integrate & deploy Mobile Apps with Travis CI Marcio Klepacz, iOS Engineering @ GetYourGuide CocoaHeads Berlin 2015

Upload: marcio-klepacz

Post on 17-Jul-2015

841 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: 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

Page 2: How we integrate & deploy Mobile Apps with Travis CI

Overview

 Who we are

  The Problem

  The Requirements

  The Solution

  Conclusion

Marcio Klepacz, GetYourGuide

Page 3: How we integrate & deploy Mobile Apps with Travis CI

Who we are

Page 4: How we integrate & deploy Mobile Apps with Travis CI

GetYourGuide Offers the Largest Travel Activities Inventory Worldwide

Marcio Klepacz, GetYourGuide

800+

10,600+ 5,300+

800+

4,000+

2,000+

Page 5: How we integrate & deploy Mobile Apps with Travis CI

Marcio Klepacz, GetYourGuide

Page 6: How we integrate & deploy Mobile Apps with Travis CI

The Problem

Page 7: How we integrate & deploy Mobile Apps with Travis CI

 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.

Page 8: How we integrate & deploy Mobile Apps with Travis CI

The Requirements

Page 9: How we integrate & deploy Mobile Apps with Travis CI

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)

Page 10: How we integrate & deploy Mobile Apps with Travis CI

Requirements / Gitflow

Marcio Klepacz, GetYourGuide

Page 11: How we integrate & deploy Mobile Apps with Travis CI

Requirements / Gitflow

Marcio Klepacz, GetYourGuide

Page 12: How we integrate & deploy Mobile Apps with Travis CI

Requirements / Gitflow

Marcio Klepacz, GetYourGuide

Page 13: How we integrate & deploy Mobile Apps with Travis CI

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

Page 14: How we integrate & deploy Mobile Apps with Travis CI

Marcio Klepacz, GetYourGuide

Xcode  Server   Jenkins   Ship.io   Travis  CI  

iOS  and  Android  

❌   ✅   ✅    

✅    

Ac,ons  specific  to  branches  

 ✅    

 ✅    

 ✅    

 ✅    

Build  on  push  

✅    

✅    

✅    

✅    

Big  community  

✅    

✅    

❌    

✅    

Hosted   ❌    

❌    

✅    

✅    

Page 15: How we integrate & deploy Mobile Apps with Travis CI

The Solution

Page 16: How we integrate & deploy Mobile Apps with Travis CI

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

Page 17: How we integrate & deploy Mobile Apps with Travis CI

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

Page 18: How we integrate & deploy Mobile Apps with Travis CI

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

Page 19: How we integrate & deploy Mobile Apps with Travis CI

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

Page 20: How we integrate & deploy Mobile Apps with Travis CI

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

Page 21: How we integrate & deploy Mobile Apps with Travis CI

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

Page 22: How we integrate & deploy Mobile Apps with Travis CI

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

Page 23: How we integrate & deploy Mobile Apps with Travis CI

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

Page 24: How we integrate & deploy Mobile Apps with Travis CI

# 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

Page 25: How we integrate & deploy Mobile Apps with Travis CI

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

Page 26: How we integrate & deploy Mobile Apps with Travis CI

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

Page 27: How we integrate & deploy Mobile Apps with 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

Page 28: How we integrate & deploy Mobile Apps with Travis CI

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)

Page 29: How we integrate & deploy Mobile Apps with Travis CI

Thanks for your time @marciok and [email protected]

Page 30: How we integrate & deploy Mobile Apps with Travis CI

References

Marcio Klepacz, GetYourGuide

Travis CI for iOS (Mattes Groeger)

johanneswuerbach / .travis.yml (Johannes Würbach)

The OS X Build Environment (Travis CI)