Slide 1

Slide 1 text

Android CI for Beginners どくぴー(@e10dokup) 2018/06/08 @ サポーターズCoLab勉強会

Slide 2

Slide 2 text

• 開発中のAndroidプロジェクトにCIを導⼊するお話です • 個⼈アプリだったり • OSSライブラリだったり • 今回はBitriseを使います • お⾦がかからない範囲でがんばります • お⾦をかけると50USD/monthになります まずはじめに

Slide 3

Slide 3 text

• 話すこと • CIについて • ローカルでの⾃動テストについて • CI上での⾃動テストについて • CIでやるちょいとした⾃動化 • 話さないこと • テストの詳細な書き⽅について 今回お話すること・しないこと

Slide 4

Slide 4 text

• Android テスト全書を今すぐ予約だ! ⾃動テストをガッツリ書きたい⼈へ

Slide 5

Slide 5 text

CIについて

Slide 6

Slide 6 text

• Continuous Integration:継続的インテグレーション • コミット単位で以下のような作業を実⾏すること • コンパイル • テスト • コード・ドキュメントの解析 • ベータ版配信 そもそもCIってなんじゃ

Slide 7

Slide 7 text

• Continuous Integration:継続的インテグレーション • コミット単位で以下のような作業を実⾏すること • コンパイル • テスト • コード・ドキュメントの解析 • ベータ版配信 そもそもCIってなんじゃ ΞϓϦέʔγϣϯ࡞੒࣌ͷ඼࣭վળ΍࡞ۀίετͷ࡟ݮ

Slide 8

Slide 8 text

• ⾃動テスト • ユニットテストもしたいしUIテストも… • その結果何かあったらSlackに通知とかしてほしい • QAやテスターに⾃動で配信できるようにしたい • Deploygateとかにアップロードしたり • リリースノートの⾃動⽣成とかやりたい • このバージョンでは何を直したの?とかの記述は⾯倒 Android開発でCIでやりたいことというと

Slide 9

Slide 9 text

• Jenkins • ⾔わずとしれたおじさん • オンプレミス環境で運⽤できる • 運⽤しなければならないとも • 圧倒的⾃由度 • 複数プロジェクトを動かしていると ランタイムやSDKを共有してしまう Android開発で使われているCI

Slide 10

Slide 10 text

• Circle CI • クラウドCIサービス • circle.yml でビルド制御を完結 • Circle CI 2.0からDockerコンテナ
 上でビルドが実⾏されるように • 1.0ではUbuntu環境上 • 無料枠1500分/⽉ • 50USD * 追加コンテナ数/⽉ Android開発で使われているCI

Slide 11

Slide 11 text

• Wercker • クラウドCIサービス • wercker.yml にビルド制御を記述 • Dockerコンテナ上でビルド • 無料枠がでかい • ビルド時間無制限 • 2並列までOK • Oracleに買われた Android開発で使われているCI

Slide 12

Slide 12 text

• Travis CI • クラウドCIサービス • .travis.yml にビルド制御を記述 • OSSに関しては無料利⽤可能 • Private Repositoryに関しては
 有料 Android開発で使われているCI

Slide 13

Slide 13 text

• Bitrise • クラウドCIサービス • GUIで処理ステップを定義 • bitrise.yml にも記述できる • Android/iOS特化のCIサービス • 無料枠では1ビルド10分/⽉200回 • それ以降は1並列毎に50USD/⽉ Android開発で使われているCI

Slide 14

Slide 14 text

Bitriseで個⼈プロジェクトにCIを 導⼊する⽅法について解説します 今回は

Slide 15

Slide 15 text

Bitriseをリポジトリ に導⼊する

Slide 16

Slide 16 text

• BitriseのDashboardから「Add new app」を選ぶ • ⼤体⾔われる通りにリポジトリを選ぶ • SSH keyを選ぶシーンがあるが必要に応じて⾃前のSSH keyを 渡してください • ここまで指定するとBitriseがリポジトリをクローンしてどのプ ラットフォームのプロジェクトか判定しだす Bitriseを導⼊する(その1)

Slide 17

Slide 17 text

• うまくいくと勝⼿にAndroidプロジェクトと判定してくれるの でDocker Imageを選ぶ • 決定するとFirst buildとして指定したbranchでデバッグビルド をするので、それが成功すれば導⼊完了 Bitriseを導⼊する(その2)

Slide 18

Slide 18 text

テストを書こう

Slide 19

Slide 19 text

•https://github.com/e10dokup/example-bitrise • だいぶ簡素なMVPアーキテクチャです 今回のサンプルプロジェクト 7JFX 1SFTFOUFS .PEFM "DUJWJUZ 'SBHNFOU %BUB4PVSDF

Slide 20

Slide 20 text

• Unit Test • JVM上で動かせる単体テスト • app/src/test 以下に書こう • 通信周りはMockWebServerを使ってモックしながら • PresenterはMockitoでMockしたり、ArgumentCaptorを 使ってコールバックをverifyするテストを書いています • ⾮同期処理のテストではCountDownLatch等を使って待たな いとテストが不⾃然に通過したりするので注意! ユニットテストを書こう

Slide 21

Slide 21 text

• ファイル単位、メソッド単位で実⾏できます • ちゃんと⾏けばグリーンで終わりますが、
 失敗すれば激しく⾚⾊で怒られます。 • exceptedに対してこう違うって怒られる
 ので参考にしましょう • 本来はDagger等のDIライブラリを使うところ
 ですが今回はコンストラクタDIをしています • うっかり忘れるとテストが完全に通らないとかあるので気を つけよう ユニットテストを⼿元で実⾏しよう

Slide 22

Slide 22 text

• Instrumentation Test • Android実機上で動かすテスト • app/src/androidTest 以下に書こう • 最近はデフォルトでUIテストライブラリのEspressoが付いて くるのでこれを使いましょう • ActivityTestRuleとかを使う場合はruleの追加が必要 UIテストを書こう

Slide 23

Slide 23 text

• Viewを呼び出したい • Viewが存在していることを確認したい • Viewをクリックしたい UIテストの簡単な書き⽅ onView(ViewMatchers.withId(R.id.hoge) onView(―).check(matches(isDisplayed)) onView(―).perform(click())

Slide 24

Slide 24 text

• 通信等の⾮同期処理を⾏う際に待機したい • AsyncTaskの実⾏はEspresso側で勝⼿に待機してくれる • RxやOkHttpなどを使っている場合はIdlingResourceを実装 してEspressoに待機してもらえるようにする必要あり • RecyclerViewの要素をクリックしたいときは? • RecyclerViewActionsを使いましょう UIテストでちょっと困ったとき RecyclerViewActions.actionOnItemAtPosition(index, click())

Slide 25

Slide 25 text

• 実⾏の⼿順はユニットテストと⼀緒 • JVM上では動かないのでエミュレータか実機がないと動きま せん • 以下の2つのAPKをデバイスに送ることでInstrumental Testを ⾏う • 普通のデバッグ⽤APK • テスト⽤の情報が⼊ったテスト⽤APK UIテストを⼿元で実⾏する

Slide 26

Slide 26 text

CI上でテストを
 実⾏しよう

Slide 27

Slide 27 text

• Gradle Runnerステップで実⾏されるGradleタスクを追加 • 今回は test/assembleAndroidTest を追加 Bitrise上でテストを実⾏する

Slide 28

Slide 28 text

• Bitriseには仮想デバイスを実⾏するオプションがベータ版なが ら搭載されている • こちらを使わずに⾃分でデバイスファームにAPKをアップロー ドしてテストさせることも可能 • 以下の2つのファイルをデバイスに与えてテスト実⾏したい • app-debug.apk(assembleDebug) • app-debug-androidTest.apk(assembleAndroidTest) UIテストは…?

Slide 29

Slide 29 text

デバイスファーム

Slide 30

Slide 30 text

• クラウドから複数の実機デバイスをテストできる環境 • Open STF • AWS Device Farm • 無料枠あり(今1000分?) • iOSデバイスもあるよ • Firebase Test Lab • Sparkで⼀⽇実機5回、VM10回無料 • RoboTestが優秀 デバイスファームとは

Slide 31

Slide 31 text

• Firebase Test Labを使ってみる • まずはFirebaseプロジェクトを作成 • 設定 > サービスアカウントから秘密鍵をDL デバイスファームとは

Slide 32

Slide 32 text

Bitriseに秘密鍵を配置

Slide 33

Slide 33 text

• ビルドグリーンになればとりあえずOK • Firebase Test Labにアクセスするとinstrumentation testの
 実⾏結果が⾒れる • 実⾏時の動画とか • robo testを実⾏した場合は画⾯遷移図も出してくれる 実際にビルドしてみる

Slide 34

Slide 34 text

細かい設定を⾏う

Slide 35

Slide 35 text

• BitriseのリポジトリのCodeからINCOMING WEBHOOKのURL を取得する GitHubのwebhookを追加する

Slide 36

Slide 36 text

• GithubのリポジトリのSettings > Webhooksから追加する • Push/Pull Requestsのみ有効にしよう GitHubのwebhookを追加する

Slide 37

Slide 37 text

• feature/~ なブランチからのPRのみビルドを⾛らせたい場合は 以下のようにWorkflow > Triggersで設定する commitに応じてworkflowを設定する

Slide 38

Slide 38 text

• Send a Slack messageステップから通知することができる ビルドが成功したらslackに通知したい

Slide 39

Slide 39 text

• 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

Slide 40

Slide 40 text

• CIの導⼊⾃体はそんなに⼤変ではない(と思う) • ⾃分がCIを導⼊して何をしたいのか?を考えよう • ⾃動テストを実現したいのか? • デプロイ周りを楽にしたいのか? • 個⼈プロジェクトで慣れてから仕事でも使ってみる、みたいな サイクルでCIとか試せるとだいぶ安⼼感がある • お⾦がかかるケースが多いので負担にならない程度に… 最後に

Slide 41

Slide 41 text

おわり