Slide 1

Slide 1 text

GitHub Actionsと DeployGateで始めるAndroid アプリのCI/CD CI/CD Conference 2023 by CloudNative Days 2023-03-20 Yuhei FUJITA

Slide 2

Slide 2 text

目次 1. 自己紹介 2. それまでの開発の現状(No CI/CD) 3. GitHub ActionsによるUnitTest(CI) 4. DeployGateによる配信(CD) 5. GitHub ActionsによるBuildとDeployGateへのDeploy(CI/CD) 6. GitHub ActionsによるReleaseNoteの生成(CD) 7. GitHub Actionsの改善(CI) 2

Slide 3

Slide 3 text

自己紹介 【名前】 藤田 悠平(フジタ ユウヘイ) 【所属】 アララ株式会社 ACシステム本部 ACアプリケーション開発部 【運営】 PWA Night(2021~) VS Code Meetup(2022~) Vue Fes Japan(2022~) 3 @Yuhei_FUJITA https://fujita.dev

Slide 4

Slide 4 text

クルクル - QRコードリーダー ● QRコード読み取り ○ 高速・高精度 ● QRコード作成 ○ 地図・連絡先 ● クルクル Wi-Fi ○ Wi-Fi接続 ● クルクル チャンネル ○ メッセージ配信 4 ※QRコードの商標はデンソーウェーブの登録商標です。

Slide 5

Slide 5 text

開発の現状 ● リリース頻度 ○ 最大で月に一回のリリース ● 開発規模 ○ モバイルアプリエンジニア:3人 ○ Webアプリエンジニア:2人 ○ デザイナー(フロントエンド):5人 ● テスト ○ 手動テスト(エンジニア・デザイナー) ● リリース ○ 手動リリース 5

Slide 6

Slide 6 text

開発の現状 ● リリース頻度 ○ 最大で月に一回のリリース ● 開発規模 ○ モバイルアプリエンジニア:3人 ○ Webアプリエンジニア:2人 ○ デザイナー(フロントエンド):5人 ● テスト ○ 手動テスト(エンジニア・デザイナー) ● リリース ○ 手動リリース 6 CI/CDが皆無

Slide 7

Slide 7 text

第1の課題 手動テスト 7

Slide 8

Slide 8 text

手動テストによる問題 8 ● 増えるテスト項目 ○ 毎回手動でテストしているとテストそのものに時間がかかる ○ 再テストも考えると憂鬱 ● コードレビュー ○ 動作が保証されていないコードレビューは大変 ○ コードレビューは実装そのものに集中したい ● 想定外の不具合 ○ 副作用のあるコードを変更した結果、予期しない不具合が生まれる ○ 毎回フルテストするのは時間もかかる

Slide 9

Slide 9 text

いつ自動テストを実行するか 9 いつ どこで なぜ git commit 開発者のローカルマシン バグのあるコードを git commitしないため Pull Request 作成時 GitHub ActionsなどCIツール コードレビューに専念するため Pull Request Merge時 GitHub ActionsなどCIツール リリース対象のBranchの動作保証

Slide 10

Slide 10 text

いつ自動テストを実行するか 10 いつ どこで なぜ git commit 開発者のローカルマシン バグのあるコードを git commitしないため Pull Request 作成時 GitHub ActionsなどCIツール コードレビューに専念するため Pull Request Merge時 GitHub ActionsなどCIツール リリース対象のBranchの動作保証

Slide 11

Slide 11 text

GitHub ActionsによるUnitTestの実行(1) 11 実行するのは Pull Request・develop/masterへのpush時

Slide 12

Slide 12 text

GitHub ActionsによるUnitTestの実行(2) 12 JavaとGradleの 実行環境をセットアップ シークレットな情報を `secrets` から取得 UnitTestを実行

Slide 13

Slide 13 text

自動テストはなんとかなった 13

Slide 14

Slide 14 text

第2の課題 社内向けリリース 14

Slide 15

Slide 15 text

社内向けにアプリをリリースする手段 15 apkファイルを直接配布 Google Playの内部テストで配布 メリット ● 自由に出来る ● 審査不要 ● 通常のリリースと近い ● インストールが簡単 デメリット ● バージョン管理が大変 ● インストール手順が複雑 ● アプリ開発者が必須 ● 審査がある ● 頻繁なリリースには 向いてない

Slide 16

Slide 16 text

社内向けにアプリをリリースする手段 16 apkファイルを直接配布 Google Playの内部テストで配布 メリット ● 自由に出来る ● 審査不要 ● 通常のリリースと近い ● インストールが簡単 デメリット ● バージョン管理が大変 ● インストール手順が複雑 ● アプリ開発者が必須 ● 審査がある ● 頻繁なリリースには 向いてない どちらも一長一短

Slide 17

Slide 17 text

DeployGate 17

Slide 18

Slide 18 text

DeployGateで社内向けリリースを配信 18 ● 審査不要 ○ 迅速なリリースが可能 ○ 毎日PRが飛び交うような場合でも常に最新を配信できる ● 専用アプリ ○ apk直配布よりインストール手順が簡単 ○ 非エンジニアでも利用できる ● 複数の配布ページ ○ 同一アプリの配布ページを複数作成出来る ○ ロールなどによって配布するバージョンなどを分けられる ● Slack連携 ○ Deploy通知などをSlackと連携できる

Slide 19

Slide 19 text

DeployGateで社内向けリリースを配信 19 ● 審査不要 ○ 迅速なリリースが可能 ○ 毎日PRが飛び交うような場合でも常に最新を配信できる ● 専用アプリ ○ apk直配布よりインストール手順が簡単 ○ 非エンジニアでも利用できる ● 複数の配布ページ ○ 同一アプリの配布ページを複数作成出来る ○ ロールなどによって配布するバージョンなどを分けられる ● Slack連携 ○ Deploy通知などをSlackと連携できる

Slide 20

Slide 20 text

Gradle DeployGate PluginでcliからDeploy 20 ● DeployGateにアプリを配信するためのGradle Plugin ● Gradleタスクとして実行が出来る

Slide 21

Slide 21 text

/build.gradle(Project Rootの`build.gradle`) 21

Slide 22

Slide 22 text

/app/build.gradle(app-moduleの`build.gradle`) 22

Slide 23

Slide 23 text

Deployの設定を記述 23 DeployGateの配布ページに表示される この中にVariantごとに記述 DeployGateの配布ページを指定 uploadDeployGateDevelopとして Gradleタスクに追加される DeployGateの配布ページに表示される

Slide 24

Slide 24 text

タスクが追加されたか確認 24

Slide 25

Slide 25 text

実行するとこんな感じ 25

Slide 26

Slide 26 text

GitHub Actionsに組み込む 26 まずはアプリをBuildする (./gradlew uploadDeployGateDevelopでも可能) DeployGateにDeployする 環境のセットアップは省略してます

Slide 27

Slide 27 text

GitHub ActionsでDeployGateに Deployできた 27

Slide 28

Slide 28 text

ReleaseNoteの作成 28

Slide 29

Slide 29 text

ReleaseNoteにほしい情報 29 ● リリースノート ○ リリースの概要 ● 変更内容 ○ どんなPull RequestがMergeされたのか ● apkファイル ○ このバージョンの各Variantのapkファイル

Slide 30

Slide 30 text

ReleaseNoteにほしい情報 30 ● リリースノート←これは手で書く必要がある ○ リリースの概要 ● 変更内容←Pull Requestから引っ張ってきたい ○ どんなPull RequestがMergeされたのか ● apkファイル←DeployGateにDeployしたapkファイルがある ○ このバージョンの各Variantのapkファイル ○ ReleaseNoteに紐付いていたほうがわかりやすい

Slide 31

Slide 31 text

GitHub ActionsによるReleaseNoteの作成(1) 31 まずはBuildする mapping.txtも同様 Buildしたファイルを artifactに一時保存

Slide 32

Slide 32 text

GitHub ActionsによるReleaseNoteの作成(2) 32 secrets.GITHUB_TOKENで ghコマンドからDraftとして作成 artifactに保存していたファイルを ReleaseNoteにアップロード

Slide 33

Slide 33 text

ghコマンド 33 tagをターゲットに指定 自動でReleaseNoteのテキストを生成 Draftとして作成 tag名をタイトルとして指定

Slide 34

Slide 34 text

作成されたReleaseNote 34 差分のPull Request artifactから追加したファイル

Slide 35

Slide 35 text

CI/CDできた! 35

Slide 36

Slide 36 text

ほんとうに? 36

Slide 37

Slide 37 text

問題点 37 ● 点在する共通処理 ○ GitHub Actionsのセットアップは基本同じ ○ UnitTestとBuildに同じ部分が存在する ○ メンテナンス性的にも共通処理はまとめたい ● GitHub Actionsの実行時間 ○ 3つのVariantがある ■ develop, debug, release ○ 1つあたり5〜6分かかる ■ 順番にBuildしていると15~20分もかかる

Slide 38

Slide 38 text

処理の共通化 38

Slide 39

Slide 39 text

全く同じ部分 39 セットアップはどこも同じ シークレット情報を取得

Slide 40

Slide 40 text

ほぼ同じ部分 40 Variantごとでほぼ同じ 特定のVariantだけ実行

Slide 41

Slide 41 text

処理を共通化して呼び出す(1) 41 GitHub Actionsの共通処理 (/.github/actions/*/action.yaml) GitHub Actionsの本体 (/.github/workflows/*.yaml)

Slide 42

Slide 42 text

処理を共通化して呼び出す(2) 42 呼び出し時に`with` で指定できる これを指定することで呼び出せるようになる `inputs.properties` で `inputs` の値を呼び出せる

Slide 43

Slide 43 text

処理を共通化して呼び出す(3) 43 `uses` で呼び出せる `with` で `inputs` に値を渡す

Slide 44

Slide 44 text

GitHub ActionsのJobを分ける 44

Slide 45

Slide 45 text

Buildを3回もやっていたら遅い ● Variantが3つ ○ develop ○ debug ○ release ● 各Buildにかかる時間は5~6分 ○ 3つしていると15~20分くらいかかる 45

Slide 46

Slide 46 text

jobを分けて同時実行する 46 develop VariantのBuild Job debug VariantのBuild Job release VariantのBuild Job 各VariantのBuild Jobを待ってから ReleaseNoteを作成

Slide 47

Slide 47 text

Jobを並行実行して時間を短縮する 47 6分程度まで短縮に成功

Slide 48

Slide 48 text

今後の課題 48 ● まだまだテストコードが少ない ○ テストコードを書き始めたのはここ最近 ○ まだUnitTest程度しか存在しない ● App Linkのテストができない ○ App Linkの検証にはPlay Consoleで配信する必要がある ○ DeployGateだけでは解決できない ● テストコードが増えたときの実行時間 ○ 今回、GitHub Actionsそのものの高速化はできていない ○ 今後テストコードが増えたときの実行時間を考えないといけない

Slide 49

Slide 49 text

まとめ ● 社内向けリリース(ベータ版)はDeployGateが便利 ● Gradle Pluginを使えばCI/CDに簡単に組み込める ● GitHub Actionsの共通処理はまとめるべし ● GitHub ActionsのJobsをうまく活用して処理時間を短縮 49

Slide 50

Slide 50 text

参考情報 ● gradle-deploygate-plugin https://github.com/DeployGate/gradle-deploygate-plugin/blob/master/README_JP.md ● About custom actions - GitHub Docs https://docs.github.com/en/actions/creating-actions/about-custom-actions ● About GitHub CLI - GitHub Docs https://docs.github.com/en/github-cli/github-cli/about-github-cli 50

Slide 51

Slide 51 text

余談 51

Slide 52

Slide 52 text

リリース文言もGASで自動生成 52

Slide 53

Slide 53 text

CI/CDもドキュメントに残す 53

Slide 54

Slide 54 text

CI/CDもドキュメントに残す 54