Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GitHub ActionsとDeployGateで始めるAndroidアプリのCICD

GitHub ActionsとDeployGateで始めるAndroidアプリのCICD

Yuhei FUJITA

March 20, 2023
Tweet

More Decks by Yuhei FUJITA

Other Decks in Programming

Transcript

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

    View Slide

  2. 目次
    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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. 第1の課題
    手動テスト
    7

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. DeployGate
    17

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. 実行するとこんな感じ
    25

    View Slide

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

    View Slide

  27. GitHub ActionsでDeployGateに
    Deployできた
    27

    View Slide

  28. ReleaseNoteの作成
    28

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  35. CI/CDできた!
    35

    View Slide

  36. ほんとうに?
    36

    View Slide

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

    View Slide

  38. 処理の共通化
    38

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  44. GitHub ActionsのJobを分ける
    44

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  50. 参考情報
    ● 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

    View Slide

  51. 余談
    51

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide