1. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Hands-On iOS Developments with
Jenkins
Arnaud Héritier
eXo Platform
http://www.exoplatform.com
Mathieu Hausherr
Octo Technology
http://www.octo.com
http://goo.gl/XWGDy 1
2. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Polls
• English or french ?
• Who is already doing iOS developments ?
• Who is already using JenkinsCI ?
• Who is already using JenkinsCI to manage
iOS developments ?
http://goo.gl/XWGDy 2
3. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Arnaud Héritier
" Jenkins " eXo platform
– Committer since 2010 – Software Factory
– Maven integration Manager
– Xcode, Appaloosa plugins … – In charge of tools
and methods
" Apache Maven " Contact me
– Committer since 2004 and
– http://aheritier.net
member of the Project
Management Committee – Twitter : @aheritier
– Coauthor of « Apache – Skype : aheritier
Maven »
• published by Pearson (in
French)
http://goo.gl/XWGDy 3
4. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Mathieu Hausherr
" iOS " Octo Technology
– Developer since 2008 – Mobile Expert
– Installation of software
factories for customers
" Other mobile platforms
– Android, Bada, Blackberry,
Windows Phone 7... " Contact me
– Mail: mha@octo.com
– Twitter : @mhausherr
http://goo.gl/XWGDy 4
5. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Slide legend
" If you have a mac with XCode,
follow us.
" In this slide you have something to
do.
" In this slide we explain a
workaround. Don’t be afraid by this
explanation. You only need it
tomorrow at home for your own
Software factory.
" Find these slides here
http://goo.gl/XWGDy 5
6. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Hands-On iOS Developments with Jenkins
" Concepts
– iOS specificities
– Continuous integration
– Continuous deployment
" How to
– Step by step Jenkins server setup
– Tips & Tricks to deals with Apple’s bug
" Hands on
– Prepare the Sample App
– Setup your Jenkins jobs
– Deploy your app on your device
http://goo.gl/XWGDy 6
7. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Goals of Jenkins-CI on iOS
CONCEPTS
http://goo.gl/XWGDy 7
8. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Reminder: Apple application
provisioning strategy
Limite of Apple
Validity Availability
devices validation
Ad Hoc 1 year 100 NO Everybody
Only for
In House 1 year ∞ NO
companies
App Store For life ∞ YES Everybody
http://goo.gl/XWGDy 8
9. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Certificate management pitfalls
• Certificate with the same name doesn’t
work
• Create specific keychains per project
– Never use default keychain
• “security set-default” command isn’t thread
safe
– Allow only one executor per server
http://goo.gl/XWGDy 9
10. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Why automatic distribution is useful for?
• Speedup the feedback loop with early
adopters and QA Teams
• Improve time to market
– Spend time to develop instead of distribute
• Resign apps for certificates expiration
– Ad Hoc and In House certificates expire after one
year
– Rebuild all your app safely
http://goo.gl/XWGDy 10
12. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Continuous deployment concepts
Apple doc
Software
Factory
Documentation
generation App Store
Submit
2 5
Git Jenkins
4 Archive Public
store
1 Archive
Building
6 Download
Code
versionning application
Appaloosa
Push
4
Publish
5
6
Private Download
store
User
devices
http://goo.gl/XWGDy 12
13. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Appaloosa concept
http://goo.gl/XWGDy 13
14. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Getting your device
UDID
We need your device UDID to
be able to push apps to your
device
1. Download “UDID sender” on
the App Store
2. Send UDID via E-Mail to
mha@octo.com
http://goo.gl/XWGDy 14
15. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Step by step guide for Jenkins-CI on iOS
HOW TO
http://goo.gl/XWGDy 15
16. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Plugins installation
Ø Home
Ø Manage Jenkins
Ø Manage Plugins
Ø Install these plugins
• Appaloosa
• Clang Scan-Build
• Git
• Xcode
http://goo.gl/XWGDy 16
17. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Plugins configuration
• By default Xcode plugin
settings should be good for a
standard installation
• Clang Static Analyzer
binaries have to be
downloaded from
http://clang-
analyzer.llvm.org/ and
extracted on the server or
agent where they’ll be used
• In “System settings” (Clang
Scan-Build Plugin part) you
need to add at least one
installation.
http://goo.gl/XWGDy 17
18. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
What if I soon have a Jenkins on a non
Mac server? Git
• Why use a non Mac
Jenkins?
– Regroup all your jobs Code
versionning
– Maintain only one
instance of Jenkins
Master Node
– Create dependencies Jenkins
between mobile and not
mobile projects
Scheduling
build
• How use a non Mac
Jenkins?
MacOS Node
– Create Mac OS node XCode
– Only need a SSH
connection
Building
application
http://goo.gl/XWGDy 18
19. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Node creation
• To create an agent
dedicated for xcode builds
you need to create a node
with :
• A label to select jobs for
which you’ll use it
• A SSH connection with a
password less private key
• The path for Clang checker
binaries
http://goo.gl/XWGDy 19
20. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Affect job to a node
• Create a “MacOSX” label
• Force job to run on
“MacOSX”-labeled nodes
http://goo.gl/XWGDy 20
21. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
sudo vim `xcode-select -print-path`/
Platforms/iPhoneSimulator.platform/
Developer/Tools/RunPlatformUnitTests
Xcode bug for iOS unit
testing Replace
Warning ${LINENO} "Skipping tests; the
Source: http:// iPhoneSimulator platform does not currently
www.raingrove.com/ support application-hosted tests (TEST_HOST
2012/03/28/running-ocunit-and- set)."
specta-tests-from-command- By:
line.html export CFFIXED_USER_HOME="$
{BUILT_PRODUCTS_DIR}/UserHome/"
• Edit your RunPlatformUnitTests mkdir -p "${CFFIXED_USER_HOME}"
mkdir -p "${CFFIXED_USER_HOME}/Library/
Caches"
mkdir "${CFFIXED_USER_HOME}/Library/
Preferences"
mkdir "${CFFIXED_USER_HOME}/Documents"
export OTHER_TEST_FLAGS="$
{OTHER_TEST_FLAGS} -
RegisterForSystemEvents"
RunTestsForApplication "${TEST_HOST}" "$
{TEST_BUNDLE_PATH}"
http://goo.gl/XWGDy 21
22. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Configure your project
for Unit Tests
• Check run action for your
Test target
• Share your Scheme
http://goo.gl/XWGDy 22
23. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Add Xcode unit testing
build phase
• Commit your scheme on GIT
• Use Scheme instead of target
for testing. Use target only for
building.
• Set SDK to iphonesimulator
• Set Configuration to Debug
• Add TEST_AFTER_BUILD=YES in
Custom xcodebuild
arguments
http://goo.gl/XWGDy 23
24. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
- (void)test_parseRoomsFromDictionary_!
returnObjectsArrayForCorrectDictionnary!
{!
Write a test // Given!
• Use SenTestKit Framework NSDictionary *dictionnary =
[NSDictionary dictionaryWithObject:
• Add Mock With OCMock [NSArray array] forKey:KEY_ROOMS];!
!
// When!
NSArray* rooms = [JUCEventsService
parseRoomsFromDictionary:dictionnary];!
!
// Then!
STAssertTrue([rooms isKindOfClass:
[NSArray class]],nil);!
}
http://goo.gl/XWGDy 24
25. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Add clang static
analysis build phase
• Configure your target
http://goo.gl/XWGDy 25
26. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Appaloosa jenkins’
integration
• Check IPA generation
• Add Appaloosa step to your
project
• Receive Push Notification
Token: igjrz4w701ynrkzd2zwh2u450ilg00dg
http://goo.gl/XWGDy 26
27. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Publish to the App Store
• Apple doesn’t provide API
• Need manual actions
– On a Mac
– Without proxy
http://goo.gl/XWGDy 27
28. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Generate Apple Doc
• Install Apple Doc
https://github.com/tomaz/
appledoc
• Command line
appledoc conf.plist
<outfile>
• Add an “aggregate” target
to the project
Perform automatic doc
generation locally
http://goo.gl/XWGDy 28
29. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Jenkins set-up, from GitHub to your device
HANDS ON … LET’S GO
http://goo.gl/XWGDy 29
30. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Fork on github the
sample project
http://goo.gl/alKgW
And then clone your
fork
git clone git://
github.com/XXXX/
JenkinsSample.git
http://goo.gl/XWGDy 30
31. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Setup a continuous
integration job
Setup Git
http://goo.gl/XWGDy 31
32. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Setup a continuous
integration job
Add a Clang Scan-Build Phase
http://goo.gl/XWGDy 32
33. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Setup a continuous
integration job
Add an Xcode build step to
execute tests
• Use a schema (JUC Paris)
• SDK = iphonesimulator
• Config = Debug
• Args = TEST_AFTER_BUILD=YES
• Clean test reports
http://goo.gl/XWGDy 33
34. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Setup a continuous
integration job
Activate Clang and unit tests
reports
http://goo.gl/XWGDy 34
35. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Fix the test
In
JUC ParisTests/JUC_ParisTests.m
Comment the failling test
Commit and push on github
git add .
git commit
git push
Relaunch your build
http://goo.gl/XWGDy 35
36. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Change your Bundle
Id
In
Project Properties > JUC Paris
Target > Summary
Change
Bundle identifier to
com.jenkins.juc-
paris.app.yourname
Commit and push on github
git add .
git commit
git push
http://goo.gl/XWGDy 36
37. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Add a deployment
Job
Same github settings
Create an Xcode build step
• Target = JUC Paris
• Config = Release
• Setup versions
• Build IPA
• Embedded profile
http://goo.gl/XWGDy 37
38. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Appaloosa installation
on your device
http://goo.gl/hQ2Ue
http://goo.gl/XWGDy 38
39. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Appaloosa installation
on your device
Account information
• Login:
mha+juc@octo.com
• Password:
jenkins
http://goo.gl/XWGDy 39
40. Jenkins User Conference Paris, 17 April 2012 #jenkinsconf
Add a deployment
Job
Setup Appaloosa with this token :
igjrz4w701ynrkzd2zwh2u450ilg00dg
http://goo.gl/XWGDy 40