Slide 1

Slide 1 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Continuous Integration for Android Applications 1

Slide 2

Slide 2 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 What is Continuous Integration? (and what can it do for me?) 2

Slide 3

Slide 3 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Continuous Integration • Refers to a suite of tools that enable: • Automated building and deployment of applications • Automated testing of code changes • Code health reports (test pass %, code coverage) • Build artifact storage 3

Slide 4

Slide 4 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Why would we want to use Continuous Integration (CI) on Android? 4

Slide 5

Slide 5 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 – Someone Probably This “Good developers are lazy” 5

Slide 6

Slide 6 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 The manual release process 1. Ensure version control is on latest commit 2. Open IDE -> Build -> Generate Signed APK 3. Select Keystore and enter usernames/passwords 4. Select destination path, build type and flavor 5. Navigate to Play Store Developer console 6

Slide 7

Slide 7 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Manual release (cont.) 6. Open application on Dev console and navigate to APK upload 7. Browse to APK on filesystem 8. Upload… 9. Update release notes (try to be clever?) 10. Publish 7

Slide 8

Slide 8 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Manual release (cont.) • What about tagging the release in version control? pushing tags? branch cleanup? • Saving the APK to Dropbox/Github? • Emailing the APK to QA? Teammates? • Did you run your tests? • What if you forget any of these steps? 8

Slide 9

Slide 9 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Why would we want to use CI on Android? Besides being a good, efficient developer who doesn’t want to manually do everything 9

Slide 10

Slide 10 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 CI for Android • Assemble APK’s/AAR’s • Deploy to Play Store/maven/s3/storage • Create version control tags, merge branches, and more • Run unit/UI tests • With a little elbow grease: on-device instrumentation tests 10

Slide 11

Slide 11 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Kevin Schultz told us to • Last year, Kevin Schultz (Gilt Group) presented on Building Maintainable Android Applications • https://goo.gl/2Ar4jh 11

Slide 12

Slide 12 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 What did Kevin tell us? • Need to build a maintainable ecosystem around our Application • Unit tests, functional tests, UI tests, build, and CI 12

Slide 13

Slide 13 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 What did Kevin tell us? • Need to build a maintainable ecosystem around our Application • Unit tests, functional tests, UI tests, build, and CI 13

Slide 14

Slide 14 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 I want CI, what are my options? 14

Slide 15

Slide 15 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Write it yourself! • git hooks on your self-hosted git server • Trigger various builds based on branch names/tags • curl APK’s to API’s • cron for nightly builds 15

Slide 16

Slide 16 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Don’t reinvent the wheel • Common/popular options for CI tools: • Jenkins (OSS), Travis CI (OSS, Hosted), Circle CI (Hosted), TeamCity (JetBrains), Bamboo (Atlassian) • But there are many more! 16

Slide 17

Slide 17 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Popular CI Tools compared 17 Jenkins Travis CI Circle CI Bamboo TeamCity Creator OSS Travis CI Circle CI Atlassian JetBrains OSS Yes Yes No No No Free To Use Yes Yes (for oss, otherwise 1 builder) Yes (for 1 build container) No Yes (up to 3 build agents) Requires Hosting Yes No No No Yes

Slide 18

Slide 18 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Jenkins • Free and Open Source • Highly configurable (but also complex) • Can deploy yourself or choose a cloud provider • Written in Java (contribute back!) • Vast selection of plugins for accomplishing various tasks 18

Slide 19

Slide 19 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Deployment • Local Deployment • Advantages • Can be a Mac mini/pro (OSX) • Can connect test devices to your build box • Disadvantages • Manage own hardware • Manage own backups 19 • Cloud Deployment • Advantages • Don’t have to manage own hardware • Docker image available • Disadvantages • Slightly more challenging to access a local device lab • OSX?

Slide 20

Slide 20 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 CloudBees • Cloud hosted Jenkins platform • Founder originated the Jenkins project • Various paid tiers available 20

Slide 21

Slide 21 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 CloudBees (cont.) • Advantages • Don’t have to manage hardware • Don’t have to manage deployment • Don’t have to manage Android SDK versions 21 • Disadvantages • Generally beholden to Android SDK currently installed on platform (can work around) • Same with JDK versions • General cloud issue: cannot connect to local physical devices

Slide 22

Slide 22 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 So which should I pick? • Balance the amount of effort settings up vs time saved • Small team (1-3): local machine or CloudBees • Medium team (3-6): local machine, unless operations can manage for you • Large team (6+): CloudBees or self-deployed cloud 22

Slide 23

Slide 23 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Setting up our Mac • Install homebrew • Create a jenkins user • Then, brew install git android jenkins • Run jenkins • Navigate to http://localhost:8080 23

Slide 24

Slide 24 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 First things first • Get in, and get familiar 24

Slide 25

Slide 25 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 First things first • Let’s get some plugins! 25

Slide 26

Slide 26 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Plugins you must install • Gradle • For executing gradle scripts during build • Git SCM • For interfacing with git repos 26

Slide 27

Slide 27 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Environment configuration • Jenkins -> Manage -> Configure System • Check Env Vars box • Add our $ANDROID_HOME 27

Slide 28

Slide 28 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Adding some credentials • In case you need to git over ssh • Or you want to store some http credentials • Useful to set up an email on your domain for jenkins so that he can have read-only access to source control, etc. 28

Slide 29

Slide 29 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Create a job • From the main screen, “New Item” on the left • Name it appropriately 29

Slide 30

Slide 30 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Configuring the build • Set your build description and build name if you’d like • Scroll to SCM • Select git • Add your repository url • Select appropriate credentials (if needed) 30

Slide 31

Slide 31 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Configuring the build (cont.) • Select what branches should build when this job is triggered • Can have separate jobs for separate branches • e.g. Beta APK builder for branches that start with release-** 31

Slide 32

Slide 32 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Configuring the build (cont.) • Many different actions can be taken during the build process • Plugins can add steps to the menu of options • For Android, you may want to execute a few different gradle tasks 32

Slide 33

Slide 33 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Configuring the build • Many different actions can be taken during the build process • Plugins can add steps to the menu of options • For Android, you may want to execute a few different gradle tasks 33

Slide 34

Slide 34 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Running the build • Save you configuration and then “Build Now” • Should trigger a build • Open the build view to examine the console output 34

Slide 35

Slide 35 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Running the build • Watch console output whiz on by, whoo! • Useful to print out env vars and other debugging information • Every command executed is echo’d to console by default 35

Slide 36

Slide 36 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Post build • Can view our workspace to see outputs 36

Slide 37

Slide 37 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Great, now I have builds… what’s next? Making a house a home! 37 LET ME EXPLAIN YOU BUILD CUSTOMIZATION

Slide 38

Slide 38 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Github PR Builder plugin • Build your PR’s when they’re submitted • Update github checks API • Run tests • Get health reports 38

Slide 39

Slide 39 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Google Play Publisher plugin • After build completes, upload APK • Can also publish to Beta or promote APKs 39

Slide 40

Slide 40 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Amazon EC2 plugin • Take advantage of Amazon’s cloud to scale-up • Maybe that Mac mini isn’t powerful enough • Easily start build slaves in the cloud 40

Slide 41

Slide 41 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 HockeyApp/S3 upload plugins • Available as plugins • Easy saving build artifacts • Easily distribute builds to teammates/QA/whomever 41

Slide 42

Slide 42 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Other plugins of interest • Android Emulator • Android Lint • JUnit • Slack/Hipchat/IRC 42

Slide 43

Slide 43 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Keystore • Install them on the jenkins user’s home dir • Reference them from gradle • Easy enough to to an .exists() check to fallback • Store username and password in a .properties file so its not in gradle and vcs • No more emailing keys 43

Slide 44

Slide 44 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Gradle • Jenkins just executes your grade scripts • Gradle scripts are written in groovy • Anything you can write in groovy, you can have Jenkins do 44

Slide 45

Slide 45 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Gradle performance • Disable pre-dex for CI builds • dexOptions { preDexLibraries = !isJenkinsBuild() } • Don’t use daemon • Only build what you need to 45

Slide 46

Slide 46 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Useful things to remember • When in doubt, log it • Use Jenkins’ Script Console • Jenkins also has server logs 46

Slide 47

Slide 47 text

CI for Android Apps - Stephen D’Amico - Droidcon NYC 2015 Thank you! • Resources and more: • Kevin’s talk on Maintainable Android Apps: https://goo.gl/2Ar4jh • http://jenkins-ci.org/ • Twitter: @sddamico • Github: sddamico 47