├── .gitignore ├── README.asciidoc ├── ci-intro-android.html └── src ├── ci-intro-android.asciidoc ├── generate.sh ├── images ├── bamboo.png ├── cfengine.png ├── chef.png ├── hudson.png ├── icons │ ├── caution.png │ ├── example.png │ ├── home.png │ ├── important.png │ ├── next.png │ ├── note.png │ ├── prev.png │ ├── tip.png │ ├── up.png │ └── warning.png ├── jenkins.png ├── puppet.png ├── teamcity.png └── travis.png └── simpligility-slidy.css /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | .classpath 3 | .project 4 | .settings 5 | .DS_Store 6 | .idea/ 7 | *.iml 8 | -------------------------------------------------------------------------------- /README.asciidoc: -------------------------------------------------------------------------------- 1 | == Introduction to Continuous Integration Server Usage Focusing on Android Development 2 | 3 | Created by Manfred Moser of http://www.simpligility.com[simpligility 4 | technologies inc] 5 | 6 | Presented at AnDevCon 5 in Boston, May 2013 7 | 8 | === Abstract 9 | 10 | Never heard of Continuous Integration Servers like Hudson, Jenkins, 11 | CruiseControl or Bamboo? Already using one? Great. You will learn what 12 | CI servers are out there for you to use and how easy it is to start 13 | using them. We will look at available services as well as how to run 14 | your own CI server cluster locally or in the cloud. 15 | 16 | With a CI server, you essentially get another team member on your 17 | development team who never stops working. We will demo how to set up a 18 | new instance of a CI server on a machine and configure it for your 19 | usage. Learn how easy it is to build your application, whether you are 20 | using Ant, Gradle or Maven. We will explore what sort of scheduling 21 | options are typically available to run your builds, and how it all 22 | integrates with your version-control system. Once we have a build 23 | running, we will add some other projects to the mix and build up a 24 | full pipeline of builds. 25 | 26 | Adding executions of unit test runs into the mix will make it more 27 | interesting. Really cool things start happening when you add devices 28 | and emulators and run Android instrumentation tests. And maybe you 29 | will want to take screenshots automatically, or capture logs and test 30 | results for each build. 31 | 32 | With all this happening, we will tie it back to your team by looking 33 | at notification options and further automations for release and 34 | distribution of your application. During the whole class, we will 35 | ensure that you learn many of the best practices of CI server usage in 36 | general and specifically related to Android application development, 37 | and walk away with a firm conviction to add a CI server to your team. 38 | 39 | === Slides and Source 40 | 41 | Source and slides:: 42 | 43 | https://github.com/simpligility/introduction-to-continuous-integration-for-android-developers 44 | 45 | Slides only:: 46 | 47 | http://www.simpligility.com/document/ci-intro-android.html 48 | 49 | 50 | === Modifications 51 | 52 | If you need to modify and rebuild the slides, modify the 53 | 54 | ---- 55 | src/ci-intro-android.asciidoc 56 | ---- 57 | 58 | and run 59 | 60 | ---- 61 | cd src 62 | ./generate.sh 63 | ---- 64 | 65 | asciidoc with slidy backend install required. 66 | -------------------------------------------------------------------------------- /src/ci-intro-android.asciidoc: -------------------------------------------------------------------------------- 1 | = Introduction to Continuous Integration Server Usage Focusing on Android Development 2 | :author: Manfred Moser, simpligility technologies inc. 3 | :backend: slidy 4 | :max-width: 45em 5 | :data-uri: 6 | :icons: 7 | :toc!: 8 | :slidetitleindentcar: 9 | :imagesdir: images 10 | :copyright: 2013, simpligility technologies inc., CreativeCommons Attribution-ShareAlike 3.0 Unported(http://creativecommons.org/licenses/by-sa/3.0/) 11 | 12 | == About Manfred Moser 13 | 14 | * Long time CI user and administrator 15 | 16 | * Author of http://wiki.eclipse.org/The_Hudson_Book[The Hudson Book] 17 | 18 | * Open source project lead https://code.google.com/p/ksoap2-android/[ksoap2-android], https://code.google.com/p/maven-android-plugin/[Android Maven Plugin] 19 | 20 | * Presenter at various conferences AnDevCon, OSCON, JUC, ... 21 | 22 | * Founder of http://www.mosabuam.com/vijug/blog/[VIJUG] and https://plus.google.com/112826376355061333205/posts[GDG Victoria BC] 23 | 24 | * Owner http://www.simpligility.com[simpligility technologies inc.] 25 | 26 | == Slides and Source 27 | 28 | Source and slides:: 29 | 30 | https://github.com/simpligility/introduction-to-continuous-integration-for-android-developers 31 | 32 | Slides only:: 33 | 34 | http://www.simpligility.com/document/ci-intro-android.html 35 | 36 | == Objectives 37 | 38 | * Understand the benefits of using a continuous integration 39 | 40 | * Consider the options for deployment 41 | 42 | * Glance at different available CI servers and services 43 | 44 | * Get started 45 | 46 | * Android specific considerations 47 | 48 | TIP: Please interrupt me and ask questions - this should be an open conversation! 49 | 50 | == What is a CI server? 51 | 52 | [quote, Anonymous System Administrator] 53 | A CI server is nothing special - it is just CRON with a user interface. 54 | 55 | == What is a CI server? 56 | 57 | [quote, Anonymous Developer] 58 | A relentless worker - another member of my team, that works for ME! 59 | 60 | == What is a CI server? 61 | 62 | [quote, Anonymous System Administrator] 63 | Just a server running your builds. 64 | 65 | == What is a CI server? 66 | 67 | [quote, Anonymous QA developer] 68 | A great tool saving me from having to run all the tests manually. 69 | 70 | == What is a CI server? 71 | 72 | [quote, Anonymous QA Manager] 73 | A communication tool for the development and QA teams and beyond. 74 | 75 | == What is a CI server? - really now! 76 | 77 | [quote, Manfred Moser] 78 | Everything mentioned so far and more! A CI 79 | server/cluster is a central piece of your development 80 | infrastructure. Once you got used to having a CI server, you will never look back. 81 | 82 | 83 | == What is Continuous Integration? 84 | 85 | A *software development* practice 86 | 87 | that evolved in the 88 | http://www.extremeprogramming.org/[Extreme Programming (XP)] 89 | community 90 | 91 | starting *about 1999* 92 | 93 | and first mentioned by Martin Fowler and Kent Beck. 94 | 95 | 96 | == What is Continuous Integration? 97 | 98 | [quote, Martin Fowler] 99 | Continuous Integration is a software development practice where 100 | members of a team integrate their work frequently, usually each person 101 | integrates at least daily - leading to multiple integrations 102 | per day. Each integration is verified by an automated build (including 103 | test) to detect integration errors as quickly as possible. Many teams 104 | find that this approach leads to significantly reduced integration 105 | problems and allows a team to develop cohesive software more rapidly. 106 | 107 | Full article is on 108 | http://www.martinfowler.com/articles/continuousIntegration.html[Martin 109 | Fowlers web site] 110 | 111 | == Practices of Continuous Integration - Part 1 112 | 113 | According to Martin Fowler... 114 | 115 | * Maintain a Single Source Repository 116 | 117 | * Automate the Build 118 | 119 | * Make Your Build Self-Testing 120 | 121 | * Everyone Commits to the Mainline Every Day 122 | 123 | * Every Commit Should Build the Mainline on an Integration Machine 124 | 125 | == Practices of Continuous Integration - Part 1 126 | 127 | * Keep the Build Fast 128 | 129 | * Test in a Clone of the Production Environment 130 | 131 | * Make it Easy for Anyone to Get the Latest Executable 132 | 133 | * Everyone can see what's happening 134 | 135 | * Automate Deployment 136 | 137 | IMPORTANT: This should give you a good idea about what to AIM for! Let's discuss 138 | this in detail... 139 | 140 | == Continuous Delivery 141 | 142 | Continuous integration taken to the next level:: 143 | 144 | * software is always in a state suitable for production deployment 145 | 146 | * and is deployed to production regularly (e.g. daily or more often) 147 | 148 | == Core Features of Continuous Integration Platforms 149 | 150 | * Version control system integration 151 | 152 | * Scheduling 153 | 154 | * Build tool and script integration 155 | 156 | * Communication features 157 | 158 | * Ideally expandability 159 | 160 | == Benefits 161 | 162 | * Reduces the need for developers and others to manually build 163 | software 164 | 165 | * Reduces the risk of integrating features, since it is done all the 166 | time (no more release deadline crunch!) 167 | 168 | * Automates and codifies how software is built 169 | 170 | * Enhances visibility and communication in development, QA and beyond 171 | 172 | * Reduces the number of defects and raises quality of your software 173 | 174 | == Use Cases Beyond Software Builds 175 | 176 | 177 | There are a *lot* of different use cases -> expandability is key! 178 | 179 | * building and publishing a book or a website 180 | 181 | * orchestrating home automation 182 | 183 | * running backups 184 | 185 | * analysis runs of e.g. log files 186 | 187 | * batch runs on some server backend or database 188 | 189 | == Deployment Options - Operating Systems? 190 | 191 | For Android development you have many options, but .. 192 | 193 | * Are you also building iOS apps? 194 | 195 | * Is the production environment for e.g. the backend servers running on Linux? 196 | 197 | * Do you need to verify it works on Windows? 198 | 199 | -> you might have to use different ones 200 | 201 | == Deployment Options - One or Many? 202 | 203 | - One large server 204 | 205 | - Cluster of one server with multiple smaller slaves 206 | 207 | -> In most enterprises one server will not be sufficient 208 | 209 | == Deployment Options - Hardware or VM? 210 | 211 | Hardware:: 212 | 213 | * more hazzle to look after and get started 214 | 215 | * allows you to attache physical devices 216 | 217 | * sort of required for some build (e.g. iOS) 218 | 219 | Virtual Machines:: 220 | 221 | * easy to start and stop 222 | 223 | * possible with different OS 224 | 225 | * easier to scale 226 | 227 | 228 | == Deployment Options - Provisioning? 229 | 230 | How do I get all the tools needed to all the CI servers? 231 | 232 | * Tools built into CI servers (e.g. Maven download/install in Hudson) 233 | 234 | * VM's and VM snapshots 235 | 236 | * Provisioning systems like https://puppetlabs.com/[puppet] , 237 | http://www.opscode.com/chef/[Chef] or http://cfengine.com/[CFEngine] 238 | 239 | * Package management system of operating system directly (apt-get, yum...) 240 | 241 | - Manual install on each machine .. painful after a while 242 | 243 | [width="100%",frame="none",grid="none",halign="center",valign="center"] 244 | |======= 245 | | image:puppet.png[scale=100] | image:chef.png[scale=100] | image:cfengine.png[scale=100] 246 | |======= 247 | 248 | == Deployment Options - Scalability? 249 | 250 | You can just throw more hardware at it... 251 | 252 | Or do things dynamically: 253 | 254 | * using desktop computers as slaves at night when not used 255 | 256 | * on demand start up of VM 257 | 258 | * automatic provisioning of new VM 259 | 260 | == Deployment Options 261 | 262 | * computer under the desk in local network 263 | 264 | * hardware in datacenter 265 | 266 | * VM 267 | 268 | * VM in Cloud 269 | 270 | * Mixture of it all 271 | 272 | 273 | == Different CI Servers 274 | 275 | Lots of them available 276 | 277 | * open source 278 | 279 | * commercial 280 | 281 | * SAAS 282 | 283 | * and combinations of the above 284 | 285 | == Eclipse Hudson 286 | 287 | [width="100%",frame="none",grid="none",halign="left",valign="center",cols="1,3"] 288 | |======= 289 | | image:hudson.png[scale=100] | http://www.hudson-ci.org 290 | |======= 291 | 292 | * Top level project of the Eclipse Foundation 293 | 294 | * Backed by Oracle and used in their cloud offering 295 | 296 | * Open source under the Eclipse Public License 297 | 298 | 299 | == Jenkins 300 | 301 | 302 | [width="100%",frame="none",grid="none",halign="left",valign="center",cols="1,3"] 303 | |======= 304 | | image:jenkins.png[scale=100] | http://www.jenkins-ci.org 305 | |======= 306 | 307 | * Open source and commercial version 308 | 309 | * Backed by Cloudbees 310 | 311 | * Open source, commercial and Saas 312 | 313 | * Large, active community 314 | 315 | * Lots of plugins 316 | 317 | == Travis CI 318 | 319 | [width="100%",frame="none",grid="none",halign="left",valign="center",cols="1,3"] 320 | |======= 321 | | image:travis.png[scale="70"] | http://www.travis-ci.org 322 | |======= 323 | 324 | * Saas 325 | 326 | * Great github integraton 327 | 328 | * Free for open source projects 329 | 330 | * Pro version for private repositories 331 | 332 | == Atlassian Bamboo 333 | 334 | [width="100%",frame="none",grid="none",halign="left",valign="center",cols="1,3"] 335 | |======= 336 | | image:bamboo.png[scale=100] | http://www.atlassian.com/software/bamboo 337 | |======= 338 | 339 | * great integration with other Atlassian products like JIRA 340 | 341 | * good Amazon EC 2 support 342 | 343 | * self hosted or SAAS available 344 | 345 | == JetBrains TeamCity 346 | 347 | [width="100%",frame="none",grid="none",halign="left",valign="center",cols="1,3"] 348 | |======= 349 | | image:teamcity.png[scale=100] | http://www.jetbrains.com/teamcity 350 | |======= 351 | 352 | * from the makers of IntelliJ IDEA/Android Studio 353 | 354 | * integration with YouTrack 355 | 356 | * free for up to 20 builds 357 | 358 | == Others CI Servers - continued 359 | 360 | * http://msdn.microsoft.com/en-us/vstudio/ff637362.aspx[MS Team 361 | Foundation Server] 362 | 363 | ** don't know much about it, strong .Net and MS tooling focus 364 | 365 | * http://cruisecontrol.sourceforge.net/[Cruise Control] 366 | 367 | ** old and outdated, don't use it anymore 368 | 369 | * http://www.thoughtworks-studios.com/go-continuous-delivery[ThoughWorks 370 | Go] 371 | 372 | ** focus towards continuous delivery 373 | 374 | ** community edition 375 | 376 | * ... 377 | 378 | NOTE: There are many more available, often as part of enterprise tools 379 | under the Application Lifecycle Management ALM term 380 | 381 | == How to Select Your CI Server Platform 382 | 383 | * consider your needs beyond Android application builds 384 | 385 | * try them out, most have open source or free trial or community 386 | editions 387 | 388 | * consider what other tools like issue trackers you already use 389 | 390 | NOTE: There are a lot of choices available. Just check out this 391 | http://confluence.public.thoughtworks.org/display/CC/CI+Feature+Matrix[comparison 392 | matrix]. But don't worry too much just get started.. 393 | 394 | == Building Applications 395 | 396 | For continuous integration, build needs to happen on the command line! 397 | 398 | You can build Android applications in a couple of ways... 399 | 400 | * Apache Ant - but the Android Ant build is deprecated 401 | 402 | * Apache Maven 403 | 404 | * Gradle 405 | 406 | * Any of the above invoked from script 407 | 408 | * make for NDK apps, combined with above 409 | 410 | * Custom script 411 | 412 | WARNING: Be careful not to rely too much on the configuration in a 413 | specific CI server, that makes switching CI platform and running builds on other 414 | machines more difficult. 415 | 416 | == Provisioning Android SDK 417 | 418 | * via a script e.g. see https://github.com/jayway/maven-android-plugin-samples/blob/master/.travis.yml[Android Maven Plugin Samples] configuration 419 | 420 | * using VM snapshots 421 | 422 | * manually (wont scale but possible to get started) 423 | 424 | 425 | == Provisioning Android SDK 426 | 427 | From travis file suitable for Linux 428 | 429 | ---- 430 | wget http://dl.google.com/android/android-sdk_r21.1-linux.tgz 431 | tar xzf android-sdk_r21.1-linux.tgz 432 | export ANDROID_HOME=$PWD/android-sdk-linux 433 | export PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools 434 | ---- 435 | 436 | == Provisioning Android NDK 437 | 438 | From travis file suitable for Linux 439 | 440 | ---- 441 | NDK_ARCH="" 442 | if [ `uname -m` = x86_64 ]; then NDK_ARCH=_64; fi 443 | wget http://dl.google.com/android/ndk/android-ndk-r8e-linux-x86${NDK_ARCH}.tar.bz2 444 | tar xjf android-ndk-r8e-linux-x86${NDK_ARCH}.tar.bz2 445 | export ANDROID_NDK_HOME=$PWD/android-ndk-r8e 446 | ---- 447 | 448 | 449 | == Getting Android Platforms and Extras 450 | 451 | From travis file suitable for Linux 452 | 453 | ---- 454 | android update sdk 455 | --filter platform-tools,android-16,extra-android-support,sysimg-16 456 | --no-ui --force > /dev/null 457 | ---- 458 | 459 | Finding the right filter for different tools is painful. 460 | 461 | IMPORTANT: Google is planning on blocking this due to legal reasons 462 | 463 | 464 | == Creating and starting emulator 465 | 466 | With a script 467 | 468 | ---- 469 | echo no | android create avd --force -n test -t android-16 --abi x86 470 | emulator -avd test -no-skin -no-audio -no-window & 471 | ---- 472 | 473 | You can also have them be a part of your VM image. 474 | 475 | TIP: Or you can use the Jenkins Android Emulator Plugin... 476 | 477 | == Testing Applications 478 | 479 | On the JVM:: 480 | 481 | * Plain unit tests 482 | 483 | * Tests with mocked Android classes 484 | 485 | 486 | On Dalvik VM / Android:: 487 | 488 | * Integration/Instrumentation tests 489 | 490 | 491 | SDK Tools:: 492 | 493 | * Instrumentation tests 494 | 495 | * MonkeyRunner 496 | 497 | * Monkey 498 | 499 | * UI Automator 500 | 501 | NOTE: There are dedicated in the cloud test setups available, 502 | e.g. http://testdroid.com/[TestDroid from Bitbar] 503 | 504 | 505 | == Android Testing Tools Beyond SDK 506 | 507 | * http://www.robotium.org[Robotium] 508 | 509 | * http://robolectric.org/[Robolectric] 510 | 511 | * https://github.com/square/spoon[Spoon] 512 | 513 | * https://github.com/DominikDary/selendroid[Selendroid] 514 | 515 | * https://github.com/appium/appium[Appium] 516 | 517 | * http://square.github.io/fest-android/[FEST Android] 518 | * many more... 519 | 520 | 521 | 522 | == Android Emulator 523 | 524 | One or multiple emulator or attached devices are needed for 525 | instrumentation testing! 526 | 527 | Devices:: 528 | 529 | * Need access to the hardware or host of VM 530 | 531 | * Use a USB Hub 532 | 533 | Emulator:: 534 | 535 | * Potentially easier to emulate lots of devices 536 | 537 | * With hardware acceleration faster 538 | 539 | TIP: Android Maven Plugin can run tests on all attached devices and 540 | the Jenkins Android Emulator Plugin can create, start and stop them 541 | 542 | == Android Instrumentation Testing 543 | 544 | * Emulates a user and needs a emulator or device 545 | 546 | * Is slower.. 547 | 548 | * Android Maven Plugin creates junit compatible test results per 549 | device! 550 | 551 | == Analysis - Overview 552 | 553 | There are *lots* of different tools available. 554 | 555 | Java/Generic:: 556 | 557 | * Checkstyle 558 | 559 | * PMD 560 | 561 | * Findbugs 562 | 563 | * Sonar 564 | 565 | Android Specific:: 566 | 567 | * Lint 568 | 569 | 570 | TIP: Stephane Nicolas has a great sample project set up at 571 | https://github.com/stephanenicolas/Quality-Tools-for-Android with lots 572 | more tools 573 | 574 | 575 | == Android Lint 576 | 577 | Execute lint with 578 | 579 | * command line execution 580 | 581 | * custom exec from build system like Gradle 582 | 583 | * dedicated goal in Android Maven Plugin 584 | 585 | * Android Lint Plugin for Jenkins 586 | 587 | and then 588 | 589 | * archive the reports per build 590 | 591 | * create them in html format so users can investigate easily 592 | 593 | == Android Continuous Deployment 594 | 595 | Internally:: 596 | 597 | * to a repository manager like Sonatype Nexus 598 | 599 | * QA and other users can access apk via http url 600 | 601 | To stores:: 602 | 603 | * All have a web UI -> you can automate the upload with scripts, 604 | e.g. parameterized selenium script 605 | 606 | * Ideally stores would have a management API - I talked to the Play 607 | Store team at Google IO, they want to get there, we need to push them! 608 | 609 | WARNING: I strongly recommend to adapt the frequency of deployments 610 | suitable to your users! 611 | 612 | == Other Jenkins Plugins 613 | 614 | * HockeyApp Plugin for Jenkins - to publish app 615 | 616 | * Zubhium Plugin for Jenkins 617 | 618 | * GCM Notification Plugin 619 | 620 | * Appaloosa Plugin 621 | 622 | == More Links 623 | 624 | * http://en.wikipedia.org/wiki/Continuous_integration[Wikipedia article about Continuous Integration] 625 | 626 | * http://en.wikipedia.org/wiki/Continuous_delivery[Wikipedia article 627 | about Continuous Delivery] 628 | 629 | == Demo Time 630 | 631 | * Start-up scripts 632 | 633 | * Jenkins and Hudson locally 634 | 635 | * Travis 636 | 637 | * Project setup, notifications and so on 638 | 639 | TIP: What else do you want to see? 640 | 641 | == Summary 642 | 643 | [quote,Manfred Moser] 644 | Continuous integration usage is easy and essential! Get on with it! 645 | 646 | == The End 647 | 648 | * Q & A 649 | 650 | * Discussion 651 | 652 | * Find me at http://www.simpligility.com 653 | -------------------------------------------------------------------------------- /src/generate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | asciidoc --backend slidy --attribute stylesheet=`pwd`/simpligility-slidy.css -o ../ci-intro-android.html ci-intro-android.asciidoc 4 | 5 | -------------------------------------------------------------------------------- /src/images/bamboo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/bamboo.png -------------------------------------------------------------------------------- /src/images/cfengine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/cfengine.png -------------------------------------------------------------------------------- /src/images/chef.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/chef.png -------------------------------------------------------------------------------- /src/images/hudson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/hudson.png -------------------------------------------------------------------------------- /src/images/icons/caution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/icons/caution.png -------------------------------------------------------------------------------- /src/images/icons/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/icons/example.png -------------------------------------------------------------------------------- /src/images/icons/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/icons/home.png -------------------------------------------------------------------------------- /src/images/icons/important.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/icons/important.png -------------------------------------------------------------------------------- /src/images/icons/next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/icons/next.png -------------------------------------------------------------------------------- /src/images/icons/note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/icons/note.png -------------------------------------------------------------------------------- /src/images/icons/prev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/icons/prev.png -------------------------------------------------------------------------------- /src/images/icons/tip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/icons/tip.png -------------------------------------------------------------------------------- /src/images/icons/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/icons/up.png -------------------------------------------------------------------------------- /src/images/icons/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/icons/warning.png -------------------------------------------------------------------------------- /src/images/jenkins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/jenkins.png -------------------------------------------------------------------------------- /src/images/puppet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/puppet.png -------------------------------------------------------------------------------- /src/images/teamcity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/teamcity.png -------------------------------------------------------------------------------- /src/images/travis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simpligility/introduction-to-continuous-integration-for-android-developers/92c77f70d4b9f4436fcd14224eb8ee420500610f/src/images/travis.png -------------------------------------------------------------------------------- /src/simpligility-slidy.css: -------------------------------------------------------------------------------- 1 | div.sect1 h1 { 2 | padding-left: 20px; 3 | margin-left: -20px; 4 | margin-left: -20px; 5 | background-color: #ff891c; 6 | color: #ffffff; 7 | } 8 | 9 | 10 | /*div.slide div.sect1 h1, div.slide div.sect2 h1, div.slide div.sect3 h1 { 11 | color: #3399CC; 12 | text-align: right; 13 | width: 100%; 14 | background-color: #ff891c; 15 | padding-right: 20px; 16 | padding-top: 20px; 17 | padding-bottom: 20px; 18 | background-repeat: no-repeat; 19 | background-position: 20px 20px; 20 | margin-left: -20px; 21 | margin-right: -20px; 22 | } 23 | 24 | div.listingblock { 25 | border: 1px solid black; 26 | -moz-box-shadow: 3px 3px 4px #000; 27 | -webkit-box-shadow: 3px 3px 4px #000; 28 | box-shadow: 3px 3px 4px #000; 29 | background-color: #A9F5F2; 30 | font-size: 12pt; 31 | padding-right: 10px; 32 | padding-left: 10px; 33 | line-height: 105%; 34 | margin-bottom: 20px; 35 | } 36 | */ 37 | --------------------------------------------------------------------------------