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
AndroidデバイスにFTPサーバを建立する
e10dokup
0
250
Gradleの実行環境設定を見直す
e10dokup
0
850
Firebase App Distributionのテストアプリ配信を試しやすくする
e10dokup
0
560
アプリに署名する 〜GitHub ActionsでのCIも見据えて〜
e10dokup
0
1.1k
Profileable buildでより正確なパフォーマンスを掴む
e10dokup
0
710
[DroidKaigi 2021] メディアアクセス古今東西 / Now and Future of Media Access
e10dokup
0
3.4k
今更「dp」を考える / Let's think about "dp" now
e10dokup
0
5.5k
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
Other Decks in Programming
See All in Programming
苦しいTiDBへの移行を乗り越えて快適な運用を目指す
leveragestech
0
560
Introduction to kotlinx.rpc
arawn
0
690
AWS Organizations で実現する、 マルチ AWS アカウントのルートユーザー管理からの脱却
atpons
0
150
Flutter × Firebase Genkit で加速する生成 AI アプリ開発
coborinai
0
160
Open source software: how to live long and go far
gaelvaroquaux
0
630
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
170
『GO』アプリ データ基盤のログ収集システムコスト削減
mot_techtalk
0
120
Pulsar2 を雰囲気で使ってみよう
anoken
0
240
2024年のkintone API振り返りと2025年 / kintone API look back in 2024
tasshi
0
220
自分ひとりから始められる生産性向上の取り組み #でぃーぷらすオオサカ
irof
8
2.8k
Ruby on cygwin 2025-02
fd0
0
140
2,500万ユーザーを支えるSREチームの6年間のスクラムのカイゼン
honmarkhunt
6
5.3k
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
80
8.8k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
960
KATA
mclloyd
29
14k
A better future with KSS
kneath
238
17k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
10
1.3k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
Raft: Consensus for Rubyists
vanstee
137
6.8k
GitHub's CSS Performance
jonrohan
1030
460k
Into the Great Unknown - MozCon
thekraken
35
1.6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
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とか試せるとだいぶ安⼼感がある • お⾦がかかるケースが多いので負担にならない程度に… 最後に
おわり