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
Android CI for Beginners
Search
Yoshihiro WADA
June 08, 2018
Programming
1
140
Android CI for Beginners
Yoshihiro WADA
June 08, 2018
Tweet
Share
More Decks by Yoshihiro WADA
See All by Yoshihiro WADA
Gradleの実行環境設定を見直す
e10dokup
0
700
Firebase App Distributionのテストアプリ配信を試しやすくする
e10dokup
0
490
アプリに署名する 〜GitHub ActionsでのCIも見据えて〜
e10dokup
0
1k
Profileable buildでより正確なパフォーマンスを掴む
e10dokup
0
670
[DroidKaigi 2021] メディアアクセス古今東西 / Now and Future of Media Access
e10dokup
0
3.2k
今更「dp」を考える / Let's think about "dp" now
e10dokup
0
5.3k
1から学ぶAndroidアプリデバッグ - アプリの動作を追いかけよう / Learn Android application debugging from the scratch - track apps' behaviors
e10dokup
10
3k
Guide to background processingを読んでみる / Reading "Guide to background processing"
e10dokup
0
250
よしなに頑張る画像ロードの話 / image load mettya tsurai
e10dokup
2
460
Other Decks in Programming
See All in Programming
CSC509 Lecture 09
javiergs
PRO
0
110
Webの技術スタックで マルチプラットフォームアプリ開発を可能にするElixirDesktopの紹介
thehaigo
2
920
Kubernetes for Data Engineers: Building Scalable, Reliable Data Pipelines
sucitw
1
200
GCCのプラグインを作る / I Made a GCC Plugin
shouth
1
150
Jakarta Concurrencyによる並行処理プログラミングの始め方 (JJUG CCC 2024 Fall)
tnagao7
1
230
LLM生成文章の精度評価自動化とプロンプトチューニングの効率化について
layerx
PRO
2
140
NSOutlineView何もわからん:( 前編 / I Don't Understand About NSOutlineView :( Pt. 1
usagimaru
0
150
RailsのPull requestsのレビューの時に私が考えていること
yahonda
5
1.7k
From Subtype Polymorphism To Typeclass-based Ad hoc Polymorphism- An Example
philipschwarz
PRO
0
170
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
0
160
EventSourcingの理想と現実
wenas
6
2.1k
Streams APIとTCPフロー制御 / Web Streams API and TCP flow control
tasshi
1
290
Featured
See All Featured
Side Projects
sachag
452
42k
Why Our Code Smells
bkeepers
PRO
334
57k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
228
52k
Into the Great Unknown - MozCon
thekraken
31
1.5k
Ruby is Unlike a Banana
tanoku
96
11k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
167
49k
How to Think Like a Performance Engineer
csswizardry
19
1.1k
4 Signs Your Business is Dying
shpigford
180
21k
Designing the Hi-DPI Web
ddemaree
280
34k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
41
2.1k
StorybookのUI Testing Handbookを読んだ
zakiyama
26
5.2k
10 Git Anti Patterns You Should be Aware of
lemiorhan
654
59k
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とか試せるとだいぶ安⼼感がある • お⾦がかかるケースが多いので負担にならない程度に… 最後に
おわり