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
570
[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
120
[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
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
10k
15 years with Rails and DDD (AI Edition)
andrzejkrzywda
0
200
Oracle Cloud Observability and Management Platform - OCI 運用監視サービス概要 -
oracle4engineer
PRO
2
14k
セキュリティについて学ぶ会 / 2026 01 25 Takamatsu WordPress Meetup
rocketmartue
1
310
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.4k
Cosmos World Foundation Model Platform for Physical AI
takmin
0
940
OWASP Top 10:2025 リリースと 少しの日本語化にまつわる裏話
okdt
PRO
3
820
【Oracle Cloud ウェビナー】[Oracle AI Database + AWS] Oracle Database@AWSで広がるクラウドの新たな選択肢とAI時代のデータ戦略
oracle4engineer
PRO
2
170
10Xにおける品質保証活動の全体像と改善 #no_more_wait_for_test
nihonbuson
PRO
2
320
生成AIを活用した音声文字起こしシステムの2つの構築パターンについて
miu_crescent
PRO
3
210
Claude_CodeでSEOを最適化する_AI_Ops_Community_Vol.2__マーケティングx_AIはここまで進化した.pdf
riku_423
2
600
Agent Skils
dip_tech
PRO
0
120
Featured
See All Featured
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
66
37k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
110
Paper Plane
katiecoart
PRO
0
46k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
54
Producing Creativity
orderedlist
PRO
348
40k
Bash Introduction
62gerente
615
210k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
50k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
The browser strikes back
jonoalderson
0
390
Being A Developer After 40
akosma
91
590k
Docker and Python
trallard
47
3.7k
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