Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
[Sergiy Mokienko] Continuous Integration in And...
Search
Google Developers Group Lviv
September 10, 2016
Technology
0
310
[Sergiy Mokienko] Continuous Integration in Android
Presentation from GDG DevFest Ukraine 2016.
Learn more at:
https://devfest.gdg.org.ua
Google Developers Group Lviv
September 10, 2016
Tweet
Share
More Decks by Google Developers Group Lviv
See All by Google Developers Group Lviv
[Elad Bezalel] Angular Material CDK
gdglviv
1
160
[Zac Sweers] Breaking the Android ClassLoader
gdglviv
1
250
[Daniel Galpin] Adventures in Navigation
gdglviv
2
530
[Rebecca Franks] Practical Image Processing in Android
gdglviv
1
460
[Mateusz Herych] Architecture for App Bundles
gdglviv
2
140
[Andrea Falcone] Iterative Mobile Development
gdglviv
2
120
[Yonatan Levin] Keynote: The world of change and your significance in it
gdglviv
1
140
[Denys Tkalich] Using BigQuery as a data warehouse in B2B startup
gdglviv
1
110
[Mete Atamel] Google Assistant powered by Containers, Machine Learning and .NET on Google Cloud
gdglviv
1
160
Other Decks in Technology
See All in Technology
日本Rubyの会: これまでとこれから
snoozer05
PRO
6
250
テストセンター受験、オンライン受験、どっちなんだい?
yama3133
0
200
2025年のデザインシステムとAI 活用を振り返る
leveragestech
0
580
202512_AIoT.pdf
iotcomjpadmin
0
160
モダンデータスタックの理想と現実の間で~1.3億人Vポイントデータ基盤の現在地とこれから~
taromatsui_cccmkhd
2
290
さくらのクラウド開発ふりかえり2025
kazeburo
2
1.3k
2025-12-27 Claude CodeでPRレビュー対応を効率化する@機械学習社会実装勉強会第54回
nakamasato
4
1.3k
人工知能のための哲学塾 ニューロフィロソフィ篇 第零夜 「ニューロフィロソフィとは何か?」
miyayou
0
210
Directions Asia 2025 _ Let’s build my own secretary (AI Agent) Part 1 & 2
ryoheig0405
0
110
AWSインフルエンサーへの道 / load of AWS Influencer
whisaiyo
0
240
Redshift認可、アップデートでどう変わった?
handy
1
120
SES向け、生成AI時代におけるエンジニアリングとセキュリティ
longbowxxx
0
260
Featured
See All Featured
Exploring anti-patterns in Rails
aemeredith
2
220
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
63
A better future with KSS
kneath
240
18k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
170
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
210
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.8k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
110
Code Review Best Practice
trishagee
74
19k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
70k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
320
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
53
Transcript
Continuous Integration in Android Sergiy Mokienko Android developer Make round
picture online http:// www.cutmypic.com/
#dfua The only thing you should care about is code.
Foreword
#dfua Background 5 years of android development 7 + projects
on a market Previously GDG Chapter lead in Nikolaev Love IoT
#dfua
Journey begins CI what are you ?
#dfua The main thing about Continues Integration is merging features
without breaking your solution
#dfua Steps Code Test Merge Build Deploy
#dfua No way to merge without testing
#dfua + + =
#dfua VCS
#dfua Benefits Jira integration Slack integration Access management Pull requests
#dfua Benefits
#dfua Strategy Time dev Feature branches Starting feature Merging feature
#dfua Merging policy Pull request Auto tests Static analysis Code
review Merge
#dfua Pull Request Leave comments
#dfua Pull Request See changes
#dfua Pull Request Build on pull request
#dfua Pull Request Easy merge
#dfua Auto test Test Java Separately
#dfua Auto test Unit tests should be fast
#dfua Auto test Keep tests relevant
#dfua Auto test Use spoon
#dfua Auto test
#dfua Static Analysis
#dfua Code Review Look for potential bugs Verify tests coverage
#dfua Code Review Project structure not violated Run happy path
#dfua No you are ready to merge boy =)
#dfua Version naming
#dfua Strategy Time dev master Feature branches Starting feature Merging
feature Release 0.2 Hot Fix Release 0.1
#dfua
#dfua Build & Deploy
#dfua Build server
#dfua Build server Open Sourced Plugins Free Easy setUp Scripts
support Build agents Variety of build triggers VCS support Remote test Run Poor git support Plugins No default support for build agents You have pay for it
#dfua TeamCity Build configuration VCS Root Build triggers Build steps
Failure Conditions Artefacts
#dfua TeamCity Build configuration - Script supports -Attach several VCS
roots -Build dependencies between jobs - Select branch for build - Schedule triggers - Repository manipulations
#dfua Version naming int majorVersion = MAJOR_VERSION as int int
minorVersion = MINOR_VERSION as int int bugFixVersion = BUG_VERSION as int String teamCityBuildVersion = (System.getenv("BUILD_NUMBER") ?: "0") versionCode majorVersion * 100000000 + minorVersion * 1000000 + bugFixVersion * 10000 + (jenkinsBuildVersion as Integer) versionName "" + majorVersion + "." + minorVersion + "." + bugFixVersion + "-" + jenkinsBuildVersion
#dfua gradle.properties MAJOR_VERSION = 1 MINOR_VERSION = 19 BUG_VERSION =
0 COMPILE_SDK_VERSION=23 BUILD_TOOLS_VERSION=23.0.2 MIN_SDK_VERSION=16 TARGET_SDK_VERSION=23 SNAPSHOT=true SNAPSHOT_ANALYTICS=false AUTOTEST=false CONNECTION_TEST=false MIXPANEL_QA_KEY=297559187fbc0957bec746de0c45a1b2 BRANDS_DIR=brands BRAND=internal SERVER_PROJECT_ID=429963794797 LEVERATE_PASSWORD=leverate2011
#dfua gradle.properties String snapshot = (Boolean.valueOf(getProperty('SNAPSHOT').toString())) ? "Boolean.parseBoolean(\"true\")" : "false"
buildConfigField 'boolean', 'SNAPSHOT', snapshot String snapshotAnalytics = (Boolean.valueOf(getProperty('SNAPSHOT_ANALYTICS').toString())) ? "Boolean.parseBoolean(\"true\")" : "false" buildConfigField 'boolean', 'SNAPSHOT_ANALYTICS', snapshotAnalytics String autotest = (Boolean.valueOf(getProperty('AUTOTEST').toString())) ? "Boolean.parseBoolean(\"true\")" : "false" buildConfigField 'boolean', 'AUTOTEST', autotest String connectionTest = (Boolean.valueOf(getProperty('CONNECTION_TEST').toString())) ? "Boolean.parseBoolean(\"true\")" : "false" buildConfigField 'boolean', 'CONNECTION_TEST', connectionTest String mixPanelDebugKey = ("\"" + getProperty('MIXPANEL_QA_KEY').toString() + "\"") buildConfigField 'String', 'MIXPANEL_QA_KEY', mixPanelDebugKey
#dfua Email Notification <TeamCity data directory>/config/_notifications/ Including ERRORS from the
log <#list build.buildLog.messages[1..] as message><#-- skipping the first message (it is a root node)--> <#if message.status == "ERROR" || message.status == "FAILURE" > ${message.text} </#if> </#list>
#dfua Email Notification <TeamCity data directory>/config/_notifications/ <p>Build artifacts:</p> <#list build.artifactsDirectory.listFiles()
as file> <a href="${webLinks.getDownloadArtefactUrl(build.buildTypeExternalId, build.buildId, file.name)}">${file.name}</a> ($ {file.length()}B)<br/> </#list>
#dfua Unit test Merge to any feature branch On every
pull request JUnit tests only Lint inspections Test report Lint report Cancel PullRequest if test fails
#dfua Merge On Every PullRequest: Feature branch -> dev Hot
fix -> master UI Tests on device Test report Cancel PullRequest if test fails
#dfua Nightly build Scheduled Every night on dev branch Runs
full Test run of All test suits on all relevant Test report Notifies all team with results Notifies all team with results
#dfua Debug deployment Triggered on every pull request: Feature branch
-> dev Builds debug version of the application Upload debug.apk to your debug build delivery cloud debug .apk
#dfua Debug deployment Triggered manually Builds release version of your
application Creates a tag with release version Uploads release.apk to google play release.apk
#dfua Release deployment Triggered manually Builds release version of your
application Creates a tag with release version Uploads release.apk to google play release.apk
#dfua Deployment debug
#dfua Debug deployment if (project.hasProperty("deployGateToken")) { apply plugin: 'deploygate'
deploygate { userName = "username" token = project.property("deployGateToken") } apks { release { sourceFile = file('build/outputs/apk/sirix-debug-' + android.defaultConfig.versionName + '.apk') } } }
#dfua Release deployment
#dfua Release deployment apply plugin: 'com.github.triplet.play' play { serviceAccountEmail
= 'your-service-account-email' pk12File = file('key.p12') track = 'production|betta|alpha' uploadImages = true }
#dfua Good to have
#dfua Summary Use correct tools Make your tests fast Automate
build delivery everywhere Use good VCS Use cross platform tools Give gradle a chance Automate you release cycle
#dfua Questions ?
Mokienko Sergiy @smokienko
[email protected]
https://www.facebook.com/Korwin22 Thank you!
#dfua Resource https://www.jetbrains.com/teamcity/documentation/ http://square.github.io/spoon/ http://nvie.com/posts/a-successful-git-branching-model/ https://github.com/Tapadoo/TCSlackNotifierPlugin https://github.com/Triple-T/gradle-play-publisher https://deploygate.com/?locale=en https://get.fabric.io/ https://www.sonatype.com/nexus-repository-sonatype
http://cyrilmottier.com/2014/12/09/a-story-of-software-development-methodologies/ https://www.reddit.com/r/androiddev/comments/3ig3gm/show_us_your_gradle_tasks/ https://medium.com/@jordanjoz/streamlining-eeros-android-build-process-6a870ef40a89#.1psxvs5kq https://medium.com/fuzz/getting-the-most-out-of-crashlytics-380afb703876#.5vyv6s5hc