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
770
Firebase App Distributionのテストアプリ配信を試しやすくする
e10dokup
0
530
アプリに署名する 〜GitHub ActionsでのCIも見据えて〜
e10dokup
0
1.1k
Profileable buildでより正確なパフォーマンスを掴む
e10dokup
0
690
[DroidKaigi 2021] メディアアクセス古今東西 / Now and Future of Media Access
e10dokup
0
3.3k
今更「dp」を考える / Let's think about "dp" now
e10dokup
0
5.4k
1から学ぶAndroidアプリデバッグ - アプリの動作を追いかけよう / Learn Android application debugging from the scratch - track apps' behaviors
e10dokup
10
3.1k
Guide to background processingを読んでみる / Reading "Guide to background processing"
e10dokup
0
250
よしなに頑張る画像ロードの話 / image load mettya tsurai
e10dokup
2
470
Other Decks in Programming
See All in Programming
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
2
170
Symfony Mapper Component
soyuka
2
730
複雑な仕様に立ち向かうアーキテクチャ
myohei
0
170
採用事例の少ないSvelteを選んだ理由と それを正解にするためにやっていること
oekazuma
2
1k
暇に任せてProxmoxコンソール 作ってみました
karugamo
1
720
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
180
Recoilを剥がしている話
kirik
5
6.6k
CSC305 Lecture 26
javiergs
PRO
0
140
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
330
menu基盤チームによるGoogle Cloudの活用事例~Application Integration, Cloud Tasks編~
yoshifumi_ishikura
0
110
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
4
250
KMP와 kotlinx.rpc로 서버와 클라이언트 동기화
kwakeuijin
0
140
Featured
See All Featured
Done Done
chrislema
181
16k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Producing Creativity
orderedlist
PRO
341
39k
For a Future-Friendly Web
brad_frost
175
9.4k
Why Our Code Smells
bkeepers
PRO
335
57k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
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とか試せるとだいぶ安⼼感がある • お⾦がかかるケースが多いので負担にならない程度に… 最後に
おわり