Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Android CI for Beginners
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yoshihiro WADA
June 08, 2018
Programming
180
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Android CI for Beginners
Yoshihiro WADA
June 08, 2018
More Decks by Yoshihiro WADA
See All by Yoshihiro WADA
AndroidデバイスにFTPサーバを建立する
e10dokup
0
1.7k
Gradleの実行環境設定を見直す
e10dokup
0
1.4k
Firebase App Distributionのテストアプリ配信を試しやすくする
e10dokup
1
760
アプリに署名する 〜GitHub ActionsでのCIも見据えて〜
e10dokup
0
1.4k
Profileable buildでより正確なパフォーマンスを掴む
e10dokup
0
820
[DroidKaigi 2021] メディアアクセス古今東西 / Now and Future of Media Access
e10dokup
0
4.1k
今更「dp」を考える / Let's think about "dp" now
e10dokup
0
6k
1から学ぶAndroidアプリデバッグ - アプリの動作を追いかけよう / Learn Android application debugging from the scratch - track apps' behaviors
e10dokup
10
3.7k
Guide to background processingを読んでみる / Reading "Guide to background processing"
e10dokup
0
330
Other Decks in Programming
See All in Programming
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
250
SODA - FACT BOOK(EN)
sodainc
1
200
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
4
1.7k
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
580
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
250
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.5k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
530
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
350
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
270
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
6.1k
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.2k
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
130
Featured
See All Featured
Code Review Best Practice
trishagee
74
20k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
540
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
620
Building AI with AI
inesmontani
PRO
1
1.4k
The Language of Interfaces
destraynor
162
27k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.9k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
730
Large-scale JavaScript Application Architecture
addyosmani
516
110k
The browser strikes back
jonoalderson
0
1.9k
Paper Plane (Part 1)
katiecoart
PRO
2
12k
Transcript
Android CI for Beginners どくぴー(@e10dokup) 2018/06/08 @ サポーターズCoLab勉強会
• 開発中のAndroidプロジェクトにCIを導⼊するお話です • 個⼈アプリだったり • OSSライブラリだったり • 今回はBitriseを使います • お⾦がかからない範囲でがんばります
• お⾦をかけると50USD/monthになります まずはじめに
• 話すこと • CIについて • ローカルでの⾃動テストについて • CI上での⾃動テストについて • CIでやるちょいとした⾃動化
• 話さないこと • テストの詳細な書き⽅について 今回お話すること・しないこと
• Android テスト全書を今すぐ予約だ! ⾃動テストをガッツリ書きたい⼈へ
CIについて
• Continuous Integration:継続的インテグレーション • コミット単位で以下のような作業を実⾏すること • コンパイル • テスト •
コード・ドキュメントの解析 • ベータ版配信 そもそもCIってなんじゃ
• Continuous Integration:継続的インテグレーション • コミット単位で以下のような作業を実⾏すること • コンパイル • テスト •
コード・ドキュメントの解析 • ベータ版配信 そもそもCIってなんじゃ ΞϓϦέʔγϣϯ࡞࣌ͷ࣭վળ࡞ۀίετͷݮ
• ⾃動テスト • ユニットテストもしたいしUIテストも… • その結果何かあったらSlackに通知とかしてほしい • QAやテスターに⾃動で配信できるようにしたい • Deploygateとかにアップロードしたり
• リリースノートの⾃動⽣成とかやりたい • このバージョンでは何を直したの?とかの記述は⾯倒 Android開発でCIでやりたいことというと
• Jenkins • ⾔わずとしれたおじさん • オンプレミス環境で運⽤できる • 運⽤しなければならないとも • 圧倒的⾃由度
• 複数プロジェクトを動かしていると ランタイムやSDKを共有してしまう Android開発で使われているCI
• Circle CI • クラウドCIサービス • circle.yml でビルド制御を完結 • Circle
CI 2.0からDockerコンテナ 上でビルドが実⾏されるように • 1.0ではUbuntu環境上 • 無料枠1500分/⽉ • 50USD * 追加コンテナ数/⽉ Android開発で使われているCI
• Wercker • クラウドCIサービス • wercker.yml にビルド制御を記述 • Dockerコンテナ上でビルド •
無料枠がでかい • ビルド時間無制限 • 2並列までOK • Oracleに買われた Android開発で使われているCI
• Travis CI • クラウドCIサービス • .travis.yml にビルド制御を記述 • OSSに関しては無料利⽤可能
• Private Repositoryに関しては 有料 Android開発で使われているCI
• Bitrise • クラウドCIサービス • GUIで処理ステップを定義 • bitrise.yml にも記述できる •
Android/iOS特化のCIサービス • 無料枠では1ビルド10分/⽉200回 • それ以降は1並列毎に50USD/⽉ Android開発で使われているCI
Bitriseで個⼈プロジェクトにCIを 導⼊する⽅法について解説します 今回は
Bitriseをリポジトリ に導⼊する
• BitriseのDashboardから「Add new app」を選ぶ • ⼤体⾔われる通りにリポジトリを選ぶ • SSH keyを選ぶシーンがあるが必要に応じて⾃前のSSH keyを
渡してください • ここまで指定するとBitriseがリポジトリをクローンしてどのプ ラットフォームのプロジェクトか判定しだす Bitriseを導⼊する(その1)
• うまくいくと勝⼿にAndroidプロジェクトと判定してくれるの でDocker Imageを選ぶ • 決定するとFirst buildとして指定したbranchでデバッグビルド をするので、それが成功すれば導⼊完了 Bitriseを導⼊する(その2)
テストを書こう
•https://github.com/e10dokup/example-bitrise • だいぶ簡素なMVPアーキテクチャです 今回のサンプルプロジェクト 7JFX 1SFTFOUFS .PEFM "DUJWJUZ 'SBHNFOU %BUB4PVSDF
• Unit Test • JVM上で動かせる単体テスト • app/src/test 以下に書こう • 通信周りはMockWebServerを使ってモックしながら
• PresenterはMockitoでMockしたり、ArgumentCaptorを 使ってコールバックをverifyするテストを書いています • ⾮同期処理のテストではCountDownLatch等を使って待たな いとテストが不⾃然に通過したりするので注意! ユニットテストを書こう
• ファイル単位、メソッド単位で実⾏できます • ちゃんと⾏けばグリーンで終わりますが、 失敗すれば激しく⾚⾊で怒られます。 • exceptedに対してこう違うって怒られる ので参考にしましょう • 本来はDagger等のDIライブラリを使うところ
ですが今回はコンストラクタDIをしています • うっかり忘れるとテストが完全に通らないとかあるので気を つけよう ユニットテストを⼿元で実⾏しよう
• Instrumentation Test • Android実機上で動かすテスト • app/src/androidTest 以下に書こう • 最近はデフォルトでUIテストライブラリのEspressoが付いて
くるのでこれを使いましょう • ActivityTestRuleとかを使う場合はruleの追加が必要 UIテストを書こう
• Viewを呼び出したい • Viewが存在していることを確認したい • Viewをクリックしたい UIテストの簡単な書き⽅ onView(ViewMatchers.withId(R.id.hoge) onView(―).check(matches(isDisplayed)) onView(―).perform(click())
• 通信等の⾮同期処理を⾏う際に待機したい • AsyncTaskの実⾏はEspresso側で勝⼿に待機してくれる • RxやOkHttpなどを使っている場合はIdlingResourceを実装 してEspressoに待機してもらえるようにする必要あり • RecyclerViewの要素をクリックしたいときは? •
RecyclerViewActionsを使いましょう UIテストでちょっと困ったとき RecyclerViewActions.actionOnItemAtPosition(index, click())
• 実⾏の⼿順はユニットテストと⼀緒 • JVM上では動かないのでエミュレータか実機がないと動きま せん • 以下の2つのAPKをデバイスに送ることでInstrumental Testを ⾏う •
普通のデバッグ⽤APK • テスト⽤の情報が⼊ったテスト⽤APK UIテストを⼿元で実⾏する
CI上でテストを 実⾏しよう
• Gradle Runnerステップで実⾏されるGradleタスクを追加 • 今回は test/assembleAndroidTest を追加 Bitrise上でテストを実⾏する
• Bitriseには仮想デバイスを実⾏するオプションがベータ版なが ら搭載されている • こちらを使わずに⾃分でデバイスファームにAPKをアップロー ドしてテストさせることも可能 • 以下の2つのファイルをデバイスに与えてテスト実⾏したい • app-debug.apk(assembleDebug)
• app-debug-androidTest.apk(assembleAndroidTest) UIテストは…?
デバイスファーム
• クラウドから複数の実機デバイスをテストできる環境 • Open STF • AWS Device Farm •
無料枠あり(今1000分?) • iOSデバイスもあるよ • Firebase Test Lab • Sparkで⼀⽇実機5回、VM10回無料 • RoboTestが優秀 デバイスファームとは
• Firebase Test Labを使ってみる • まずはFirebaseプロジェクトを作成 • 設定 > サービスアカウントから秘密鍵をDL
デバイスファームとは
Bitriseに秘密鍵を配置
• ビルドグリーンになればとりあえずOK • Firebase Test Labにアクセスするとinstrumentation testの 実⾏結果が⾒れる • 実⾏時の動画とか
• robo testを実⾏した場合は画⾯遷移図も出してくれる 実際にビルドしてみる
細かい設定を⾏う
• BitriseのリポジトリのCodeからINCOMING WEBHOOKのURL を取得する GitHubのwebhookを追加する
• GithubのリポジトリのSettings > Webhooksから追加する • Push/Pull Requestsのみ有効にしよう GitHubのwebhookを追加する
• feature/~ なブランチからのPRのみビルドを⾛らせたい場合は 以下のようにWorkflow > Triggersで設定する commitに応じてworkflowを設定する
• Send a Slack messageステップから通知することができる ビルドが成功したらslackに通知したい
• DeployGateにアップロードしたい • scriptステップでcurlを⾶ばすようにするだけ • 各種APIと連携する時は環境変数にAPI Keyとかを書いていく • ⾒られたらまずいものは基本的にSecret Envに書こう
• Expose for pull requestを有効にしないとPRで動かない その他の⼩技 curl -F "file=@/path/to/apk" \ -F "token=$DEPLOYGATE_KEY" \ -F "message=$GIT_CLONE_COMMIT_MESSAGE_SUBJECT" \ https://deploygate.com/api/users/{myName}/apps
• CIの導⼊⾃体はそんなに⼤変ではない(と思う) • ⾃分がCIを導⼊して何をしたいのか?を考えよう • ⾃動テストを実現したいのか? • デプロイ周りを楽にしたいのか? • 個⼈プロジェクトで慣れてから仕事でも使ってみる、みたいな
サイクルでCIとか試せるとだいぶ安⼼感がある • お⾦がかかるケースが多いので負担にならない程度に… 最後に
おわり