0% found this document useful (0 votes)
73 views

Continuous Integration For iOS

Here are a few tips for deploying your iOS app from a continuous integration build: 1. Use TestFlight or HockeyApp for over-the-air distribution to testers. Both have Jenkins plugins that make it easy to automatically upload your signed IPA file from a build. 2. Store sensitive credentials like API keys out of your scripts, either as environment variables or global properties in Jenkins. 3. Create different "build configurations" in Jenkins - e.g. nightly, beta, release. Trigger different deployment steps based on the config. 4. Consider deploying to both the App Store and internal testers in parallel. This allows testing the App Store submission process without disrupting your main

Uploaded by

Kevin Munc
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
73 views

Continuous Integration For iOS

Here are a few tips for deploying your iOS app from a continuous integration build: 1. Use TestFlight or HockeyApp for over-the-air distribution to testers. Both have Jenkins plugins that make it easy to automatically upload your signed IPA file from a build. 2. Store sensitive credentials like API keys out of your scripts, either as environment variables or global properties in Jenkins. 3. Create different "build configurations" in Jenkins - e.g. nightly, beta, release. Trigger different deployment steps based on the config. 4. Consider deploying to both the App Store and internal testers in parallel. This allows testing the App Store submission process without disrupting your main

Uploaded by

Kevin Munc
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 124

CI for iOS:

do more while you sleep


Kevin Munc – @muncman
Method Up LLC
[MU]
CI?
For iOS?
Pain
Pain & Suffering
It can be done

• Start with the basics


• Xcode and the command line
• Version control and CI server
• Script it, run it, schedule it
Tip #1
Jenkins

• http://jenkins-ci.org/
• Mac installer or via homebrew
• Many alternatives
• Many plugins
Tip #1.1
How many Simulators does
it take to break a build?
A CI server gives you:
A CI server gives you:

Automation
A CI server gives you:

Automation

Feedback
A CI server gives you:

!
Automation
f u l
de r
on
W
Feedback
A CI server gives you:

!
Automation i n d
f u l f m p s)
de r c e o n a
n a e r
Wo Pe bett
Feedback (fo r
Requirement: OS X
Requirement: OS X
• macminicolo.net

• hosted-ci.com

• cisimple.com

• macincloud.com

• hostmyapple.com

• macminivault.com

• xcloud.me
Requirement: OS X
• macminicolo.net

• hosted-ci.com
h t ,
n i g
• cisimple.com
C I t o r u n a
ac
t
,
u l e M
• macincloud.com
O r sch e d
o u
on y you slee
r o w n
p . . .
• hostmyapple.com w h i l e

• macminivault.com

• xcloud.me
Security
sudo /usr/sbin/DevToolsSecurity --enable
Security

sudo xcodebuild -license


Credentials
• The CI server needs access to your
repository
• SSH key
• The CI server needs Keychain credentials if
you want to sign your builds
• Developer certificate and profiles
Keychain
• Export and Import using Keychain Access app
• Keys and Certificates
• Or use the command line:
• sudo security import /path/to/distribution.cer -k /Library/Keychains/
System.keychain

• sudo security import /path/to/distribution.p12 -k /Library/Keychains/


System.keychain

• Don’t forget about provisioning profiles


• Troubleshooting: http://tinyurl.com/iOSDevToolTroubles
Tip #2
Avoid this error
from Xcode
RunPlatformUnitTests:
warning: Skipping tests;
the iPhoneSimulator platform does
not currently support application-
hosted tests (TEST_HOST set).
The culprit

/Applications/Xcode.app/
Contents/Developer/
Platforms/
iPhoneSimulator.platform/
Developer/Tools/
RunPlatformUnitTests
The workaround(s)
Xcode Plugin

• https://wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin

• Specify provisioning profile


• Keychain access
• Signed IPA
Xcode Plugin

• Recommended xcodebuild arguments:


• GCC_SYMBOLS_PRIVATE_EXTERN=NO
• COPY_PHASE_STRIP=NO
• Allows test bundle to link with Release
build symbols
Signing with the Plugin
Signing with the Plugin
Signing with the Plugin
Tip #3
Prefer Scripts
over CI Plugins
• More flexibility
• More resilient to Apple’s changes
• More power to adapt and expand (specificity)
• Less coupling to the specific CI server type
• You can version control the settings easier
xcodebuild

xcodebuild \
clean build
Tip #4
Be specific with
xcodebuild options
xcodebuild
xcodebuild \
-scheme SOLID \
-target SOLID \
-configuration Debug \
-arch i386 \
-sdk iphonesimulator \
clean build
xcodebuild
xcodebuild \
-scheme SOLID \
-target SOLID \
-configuration Debug \
-arch i386 \
-sdk iphonesimulator \
clean build
xcodebuild
xcodebuild \
-scheme SOLID \
-target SOLID \
-configuration Debug \
-arch i386 \
-sdk iphonesimulator \
clean build
xcodebuild
xcodebuild \
-scheme SOLID \
-target SOLID \
-configuration Debug \
-arch i386 \
-sdk iphonesimulator \
clean build
xcodebuild
xcodebuild \
-scheme SOLID \
-target SOLID \
-configuration Debug \
-arch i386 \
-sdk iphonesimulator \
clean build
xcodebuild
xcodebuild \
-scheme SOLID \
-target SOLID \
-configuration Debug \
-arch i386 \
-sdk iphonesimulator \
clean build
xcodebuild
xcodebuild \
-scheme SOLID \
-target SOLID \
-configuration Debug \
-arch i386 \
-sdk iphonesimulator \
clean build
xcodebuild
xcodebuild \
-scheme SOLID \
-target SOLID \
-configuration Debug \
-arch i386 \
-sdk iphonesimulator \
clean build
Tip #5
Specify Alternate
Output Locations

• Don’t rely on Xcode’s cryptic locations


• This will make your scripts easier to
manage
# Build location for Instruments test runs.
CI_BUILD_DIR=/tmp/SOLID_AUTOMATION
mkdir -p $CI_BUILD_DIR

xcodebuild \

... \

CONFIGURATION_BUILD_DIR=$CI_BUILD_DIR \

clean build
# Build location for Instruments test runs.
CI_BUILD_DIR=/tmp/SOLID_AUTOMATION
mkdir -p $CI_BUILD_DIR

xcodebuild \

... \

CONFIGURATION_BUILD_DIR=$CI_BUILD_DIR \

clean build
# Build location for CI test runs.
CI_BUILD_DIR=/tmp/SOLID_AUTOMATION
mkdir -p $CI_BUILD_DIR

xcodebuild \

... \

CONFIGURATION_BUILD_DIR=$CI_BUILD_DIR \

clean build
Demo
Tip #6
Ensure Return Codes

• If the tool you are invoking in your script


doesn’t return an exit code indicating
pass/fail, it’s up to you.
• Unix-friendly 0 (success) or 1 (failure)
Tip #7
Test against multiple
SDKs

-sdk iphonesimulator5.0
-sdk iphonesimulator5.1
-sdk iphonesimulator6.0
Other Tools
to Know About
• xcode-select (manage xcode path)
• Overridden by DEVELOPER_DIR

• xcrun (find and run dev tools)


• ibtool (for Interface Builder files)
• /Applications/Xcode.app/Contents/Developer/usr/bin/

• Variables in Xcode
• “Build Settings Reference”
OCUnit
Other Related Tools
Other Related Tools
• OCMock • XcodeTest
• OCMockito • AutoBuild
• OCHamcrest • xcodeproj (CocoaPods)
• Expecta • Circle?
• TinyMock • Simon?
• LRMocky • ios-maven-plugin
• OCUnit2JUnit • Ceedling
• OCUnitReport • XcodeCoverage
• Kicker • JMRTestTools
• xcodebuild-rb • Nocilla
• xcodearchive • OHHTTPStubs
OCUnit Alternatives
• Kiwi
• Cedar
• OCDSpec
• C++ Automated Test Cases in Headers
(CATCH)
• Objective-Shoulda
• Specta
Tip #8
OCUnit2JUnit for
Test Results

• ocunit2junit.rb
• https://github.com/ciryon/OCUnit2JUnit
• Converts output to JUnit format for easier
transformation to HTML
UIAutomation
Other UIAutomation
Tools
• tunup_js • ios-sim

• jasmine-iphone • ios-sim-locale

• uiautomation-jasmine- • iphonesim
iphone
• ui-auto-monkey
• Bwoken
• ui-screen-shooter
• Zucchini Framework
• uiautomation-rb?
• WaxSim
UIAutomation
Alternatives
• Frank • Objective C Slim
(ocslim)
• (iCuke)
• AutomationKit
• KIF
• Sikuli
• Calabash
• MonkeyTalk (formerly
• UISpec FoneMonkey)

• Bromine • Plus other commercial


tools, such as Telerik Test
Studio for iOS
Tip #9
PListBuddy
is Your Buddy

/usr/libexec/PlistBuddy
Tip #10
Always quit the
simulator
• killall
• killall -m -KILL "iPhone Simulator"
• AppleScript
• osascript -e 'tell app "iPhone Simulator"
to quit'
Tip #11
Use Jonathan Penn’s
AutomationExample

https://github.com/jonathanpenn/AutomationExample
Demo
More?
Code Coverage

“Risk coverage”
Coverage Tools
• gcov
• GCC’s coverage tool
• GUIs for gcov
• LCOV (HTML)
• CoverStory (Mac app)
• ocov?
Tip #12
gcovr for
Coverage Automation

Produces Cobertura-formatted output


from gcov data
Tip #12.1
Enable Test Coverage
Static Analysis

• Clang
• http://clang-analyzer.llvm.org/
• scan-build
Tip #13
Symbolic links
can be your ally
Avoid scan-build Pain
sudo ln -s \
/Applications/Xcode.app/Contents/Developer/Toolchains/
XcodeDefault.xctoolchain/usr/lib/arc/
libarclite_iphonesimulator.a \
/usr/lib/arc/libarclite_iphonesimulator.a
What about
test build deployment?
Tip #14
Use TestFlight

• testflightapp.com
• OTA deployment
• SDK for more features
• Free!!
TestFlight

• Web UI
• Desktop App
• REST API
• Jenkins Plugin
TestFlight Alternatives
• HockeyApp
• http://hockeyapp.net

• Also has a Jenkins plugin (forked)

• BetaBuilder for iOS


• http://www.hanchorllc.com/betabuilder-for-ios/

• More players in this space, esp. for enterprises...


TestFlight Config

• API Token and Team Token


• Need a signed IPA
• They get an email with a link for OTA
installation!
Tip #15
Protect Your Tokens
• API Token & Team Token
• Keep them out of scripts
• Instead, define them in Jenkins (and leverage
Jenkins security)

• 'Configure System'
• 'Global properties' section

• Or use the plugin (same parameters)


TestFlight Plugin
TestFlight Script
Deployment
Deployment
Q: Once you have a nightly job to build,
unit test, sign an IPA and deploy it to QA,
what’s next?
Q: Once you have a nightly job to build,
unit test, sign an IPA and deploy it to QA,
what’s next?

A: Sleeping easy.
Documentation

• Appledoc
• Doxygen
• HeaderDoc
DocSets
Appledoc
Doxygen
Tip #16
Don’t stop there!
Other Goodies
Other Goodies
• Ensure your site or API is up
• Scan your code for TODOs and FIXMEs
• Get trend reports for lines of code
(SLOCCount w/ sloc2html)
• Scan for duplicated blocks of code (CPD,
Simian, etc.)
• Use agvtool (Apple-Generic Versioning
Tool) to increment your build number
Still Missing
• Cyclomatic Complexity

• Coding convention/Style checker

• Code Formatter

• Uncrustify, UniversalIndentGUI

• UML Generation

• via CLI, as opposed to OmniGraffle (AppleScript?)

• ER Diagram from Core Data schema


Tip #n
Sources
• Slides: http://www.slideshare.net/muncman

• http://blog.carbonfive.com/category/mobile/

• http://www.stewgleadow.com/

• http://lifeandcode.net/

• http://longweekendmobile.com/blog/
• http://longweekendmobile.com/2011/04/17/xcode4-running-application-
tests-from-the-command-line-in-ios/

• http://qualitycoding.org

• et cetera
Thank you!
• CodeMash organizers
• CodeMash sponsors
• and YOU!

[MU]
Thank you!
• CodeMash organizers
• CodeMash sponsors
• and YOU!
Questions?
[MU]

You might also like