Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Android: Integração Contínua & Entrega Contínua
Search
Rafael Toledo
April 20, 2018
Programming
3
170
Android: Integração Contínua & Entrega Contínua
Apresentado na Trilha Android do TDC Florianópolis 2018
Rafael Toledo
April 20, 2018
Tweet
Share
More Decks by Rafael Toledo
See All by Rafael Toledo
Gamedev com Kotlin Native
rafaeltoledo
0
89
Kotlin Multiplataforma: Compartilhando código entre Android e iOS
rafaeltoledo
0
290
Motion Layout
rafaeltoledo
1
150
Pipeline Android
rafaeltoledo
3
170
Android Architecture Components
rafaeltoledo
7
170
What's New in Kotlin 1.3
rafaeltoledo
0
150
An Overview of Multiplatform Kotlin
rafaeltoledo
2
130
Compartilhando Código com Kotlin Multiplataforma
rafaeltoledo
2
270
Android Assíncrono
rafaeltoledo
3
220
Other Decks in Programming
See All in Programming
AI時代もSEOを頑張っている話
shirahama_x
0
230
Querying Design System デザインシステムの意思決定を支える構造検索
ikumatadokoro
1
1.2k
React Native New Architecture 移行実践報告
taminif
1
130
Media Capture and Streams: W3C仕様と現場での知見
nowaki28
0
130
無秩序からの脱却 / Emergence from chaos
nrslib
2
12k
CSC305 Lecture 17
javiergs
PRO
0
270
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
5
1.1k
30分でDoctrineの仕組みと使い方を完全にマスターする / phpconkagawa 2025 Doctrine
ttskch
3
730
社内オペレーション改善のためのTypeScript / TSKaigi Hokuriku 2025
dachi023
1
470
ハイパーメディア駆動アプリケーションとIslandアーキテクチャ: htmxによるWebアプリケーション開発と動的UIの局所的適用
nowaki28
0
330
CloudNative Days Winter 2025: 一週間で作る低レイヤコンテナランタイム
ternbusty
7
1.9k
新卒エンジニアのプルリクエスト with AI駆動
fukunaga2025
0
140
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
GitHub's CSS Performance
jonrohan
1032
470k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Writing Fast Ruby
sferik
630
62k
Music & Morning Musume
bryan
46
7k
Into the Great Unknown - MozCon
thekraken
40
2.2k
Embracing the Ebb and Flow
colly
88
4.9k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Automating Front-end Workflow
addyosmani
1371
200k
Statistics for Hackers
jakevdp
799
230k
Transcript
ANDROID Integração Contínua & Entrega Contínua
Rafael Toledo Consultor na ThoughtWorks Especialista em Android Mobile desde
2012 rafaeltoledo.net twitter.com/_rafaeltoledo github.com/rafaeltoledo medium.com/@rafael_toledo
Por que eu preciso disso? • Integração de código •
Todo mundo na mesma página • Execução de testes e validação contínua • Cobertura de código e outras métricas • Releases frequentes 3
Git Flow • Forks ou Branches? • Short lived branches
/ Long lived branches • Pull Requests / Merge Requests • Code Review 4
5
O que você procura em um code review? 6
7 Code Review O que devo procurar em um code
review? https://bit.ly/2JabM5R
None
None
None
Self-Hosted x Cloud
Self-Hosted x Cloud
Self-Hosted x Cloud
Cloud - CircleCI • Cota gratuita para repositórios privados •
Github ou Bitbucket • Facilidade de configuração • Suporte a Docker 14
.circleci/config.yml version: 2 jobs: build: working_directory: ~/my-project docker: - image:
circleci/android:api-27-alpha environment: JVM_OPTS: -Xmx3072m CIRCLE_JDK_VERSION: oraclejdk8 ... 15
.circleci/config.yml ... steps: - checkout - run: name: Accept licenses
command: yes | sdkmanager --licenses || true - run: name: Build release APK Command: ./gradlew assembleRelease 16
None
None
None
Jenkins: setup mínimo 20
None
None
E como ficam os meus segredos nesse bolo todo? 23
# app/build.gradle android { ... signingConfigs { storeFile file("$rootDir/release.jks") storePassword
'12345678' keyAlias 'myawesomeapp' keyPassword '12345678' } }
# app/build.gradle android { ... signingConfigs { storeFile file("$rootDir/release.jks") storePassword
'12345678' keyAlias 'myawesomeapp' keyPassword '12345678' } }
# app/build.gradle android { ... signingConfigs { storeFile file(System.env.RELEASE_STORE_FILE) storePassword
System.env.RELEASE_STORE_PASSWORD keyAlias System.env.RELEASE_KEY_ALIAS keyPassword System.env.RELEASE_KEY_PASSWORD } }
None
criptografa openssl aes-256-cbc -e -in release.keystore -out release.keystore-cipher -md sha256
-k $CIPHER_DECRYPT_KEY 28
descriptografa openssl aes-256-cbc -d -in distribution/release.keystore-cipher -out distribution/release.keystore -md sha256
-k $CIPHER_DECRYPT_KEY 29
None
FIREBASE TEST LAB 31
5 execuções / dia em devices 10 execuções / dia
em emuladores
Robo Test & Espresso
None
Por que o emulador não funciona bem na cloud? 35
... - run: name: Run Tests on Firebase Test Lab
command: | echo "${FIREBASE_TOKEN}" >> "secret.json" curl -0 https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.zip unzip -qq google-cloud-sdk.zip ./google-cloud-sdk/bin/gcloud config set project my-project ./google-cloud-sdk/bin/gcloud auth activate-service-account --key-file secret.json
... ./google-cloud-sdk/bin/gcloud firebase test android run --app app/build/outputs/apk/debug/app-debug.apk --test app/build/outputs/apk/androidTest/app-debug-androidTest.apk
--device-ids sailfish,NexusLowRes,hammerhead --os-version-ids 19,23,27 --locales en --orientations portrait
DEPLOY / DELIVERY 38
None
None
None
None
https://docs.fastlane.tools/getting-started/an droid/setup/ 43
lane :beta do gradle(task: 'assemble', build_type: 'Release') upload_to_play_store(track: 'beta') slack(message:
'Successfully distributed a new beta build') end
https://docs.fastlane.tools/getting-started/an droid/screenshots/ 45
... # https://github.com/Triple-T/gradle-play-publisher - run: name: Deploy to Google Play
command: ./gradlew publishApkRelease
# https://github.com/square/spoon Spoon.screenshot(activity, "initial_state");
The Social Project rafaeltoledo.net medium.com/the-social-app github.com/rafaeltoledo/social-app
Links CIRCLECI https://circleci.com JENKINS https://jenkins.io FIREBASE TEST LAB https://firebase.google.com/docs/test-lab/ SEGMENTIO
ANALYTICS (SETUP CIRCLECI + FIREBASE) https://flutter.io/flutter-for-android/ 49
OBRIGADO Slides disponíveis em: speakerdeck.com/rafaeltoledo 50