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

Github Actions self-hosted runners のすゝめ

nade
March 15, 2023

Github Actions self-hosted runners のすゝめ

nade

March 15, 2023
Tweet

More Decks by nade

Other Decks in Programming

Transcript

  1. @kazuma_nagano / nade
    2023/03/15 CA.Swift
    Github Actions self-hosted runners
    のすゝめ

    View Slide

  2. 自己紹介
    なで( @kazuma_nagano )
    2019 サイバーエージェント 入社
    タップル iOSチームリーダー
    2

    View Slide

  3. 登壇中の疑問、感想等
    #ca_swift にてツイートしていただけると
    大変喜びます🙇
    3

    View Slide

  4. アウトライン
    1. ネイティブにおける CI / CDの主な役割
    2. ビルドコスト増加に伴うリスク
    3. Github Actions self-hosted runners の紹介
    4. Bitrise → Github Actions への移行
    5. まとめ
    4

    View Slide

  5. ネイティブにおける CI / CDの主な役割
    5

    View Slide

  6. ネイティブにおける CI / CD の主な役割
    自動テスト( CI / Continuous Integration )
    アプリ配布( CD / Continuous Delively )
    6
    Build Test
    Prepare Feedback
    Build
    Submit
    Store
    Prepare
    Distribute

    View Slide

  7. 環境構築はキャッシュを駆使してチューニング可能
    自動テスト( CI / Continuous Integration )
    アプリ配布( CD / Continuous Delively )
    7
    Build Test
    Prepare Feedback
    Build
    Submit
    Store
    Prepare
    Distribute
    タップルにおけるビルド時間(2023)

    View Slide

  8. 参考文献
    8
    https://bitrise.io/blog/post/tune-your-bitrise-workflows-using-cache-in-steps

    View Slide

  9. (主題)どちらもビルドで時間的コストの大半を使う
    自動テスト( CI / Continuous Integration )
    アプリ配布( CD / Continuous Delively )
    9
    Build Test
    Prepare Feedback
    Build
    Submit
    Store
    Prepare
    Distribute
    ビルドコストは増
    加していく

    View Slide

  10. ビルドコスト増加に伴うリスク
    10

    View Slide

  11. ビルドコスト増加に伴うリスク
    1. ビルド時間は年々増加していく
    2. 実行時間に準じた課金体系の標準化
    11

    View Slide

  12. 1. ビルド時間は年々増加していく
    12

    View Slide

  13. 13
    9年弱のコードベース
    成果物のキャッシュされていな
    いライブラリ群
    Kotlin Multiplatform
    Mobile
    ビルド時間は年々増加していく
    タップルにおけるビルド時間

    View Slide

  14. 14
    ビルド時間は年々増加していく
    タップルにおけるビルド時間(2023)

    View Slide

  15. 15
    ビルド時間は年々増加していく
    タップルにおけるビルド時間(2025?)

    View Slide

  16. 1. 実行時間に準じた課金体系の標準化
    16

    View Slide

  17. 実行時間に準じたクレジットベースのプラン
    17
    Bitrise
    https://bitrise.io/pricing

    View Slide

  18. 実行時間に準じたクレジットベースのプラン
    18
    Circle CI
    https://circleci.com/ja/pricing/

    View Slide

  19. 実行時間に準じたクレジットベースのプラン
    19
    Github Actions(GitHub-managed Standard)
    https://github.co.jp/pricing#compare-features

    View Slide

  20. 実行時間に準じたクレジットベースのプラン
    20
    Xcode Clound
    https://developer.apple.com/jp/xcode-cloud/

    View Slide

  21. 実行時間に準じたクレジットベースのプラン
    ● iOS向けSaaSはどこもビルド時間ごとの課金体系が主流で値上げ傾向
    ● プランごとのクレジットがなくなるとCIが止まってしまうことも
    ● チームの拡大や生産性の向上により線形に価格上昇していく
    ● マシンスペックに応じて実行時間ごとの価格が上昇していく
    ○ 一般的にクレジット消費が2xになっても実行時間は1/2にはならない
    21
    ビルド時間の増加がプロダクト開発の潜在的なリスクになっている

    View Slide

  22. Github Actions Self-hosted Runnersの紹介
    22

    View Slide

  23. Github Actions self-hosted runner の紹介
    ● 自分達で管理する実マシンやAWS EC2などの仮想マシンをGithub Actionsの実
    行マシンに指定できる機能
    ● 基本的にはGithub が提供するself-hosted runner アプリケーションを実行できる
    マシンであればどのマシンでもOK
    ● Github Actions上からのインターフェースはほぼ変わらない
    ● 実行時間の制限はほぼなく(35日)、マシンスペックも好きなものを選べる
    23

    View Slide

  24. Github Actions self-hosted runner の紹介
    ビルド実行時の実行マシンのラベル指定のみ
    24
    name: '[iOS] Test App'
    on:
    workflow_dispatch:
    jobs:
    build:
    runs-on:
    - self-hosted
    - macOS
    timeout-minutes: 120

    View Slide

  25. Github Actions self-hosted runner の注意点
    ● Private Repository のみの利用推奨
    ○ forkされた場合に悪意のあるプログラムがマシン上で実行できてしまう
    ○ Publicな場合はGithub Actionsが無料で利用できるので不要かも
    ● 基本はMac 1台につき1つのマシンのみの提供
    ○ Mac OSの規約上1物理マシン上に2つのOS(ベースOS + Docker)
    ● 複数の会社でのシェア等はMac OSの利用規約で禁止されている
    ○ 24時間単位での貸し出しのみ
    25

    View Slide

  26. グループのインフラチームの管理する myshoes を通して 物理マシンを利用
    Cyberagent myshoes の 紹介
    26
    https://speakerdeck.com/whywaita/cyberagent-oss-cicd-myshoes-cicd2021

    View Slide

  27. Bitrise → Github Actions への移行
    27

    View Slide

  28. 今日話さないこと
    ● Bitrise、Github Actions の特徴、比較
    ● 実際のワークフローの構築の仕方
    ● それぞれのコストの話
    28

    View Slide

  29. Bitrise → Github Actions への移行
    ● 基本的な CI / CD に必要な機能においては代替手段あり
    ○ キャッシュ管理(CocoaPods, Gem, Ruby, Java, Gradle, SwiftPM)
    ○ スケジューリングビルド
    ● 事前にワークフローの実行をfastlaneにまとめておくことで容易に移行可能
    ○ 証明書管理 → fastlane match、ビルドコマンド → fastlane gym
    ● Bitriseにしかない機能は代替案を用意する必要あり
    29

    View Slide

  30. Bitriseにしかない機能の代替案を用意する
    タップルで利用していたBitriseにしかない機能
    ● Sandbox Tester 作成などの2FAが必要なワークフロー
    ● SlackからのCIの実行
    ● アプリのQRコード配布
    30

    View Slide

  31. Bitriseにしかない機能の代替案を用意する
    31
    Sandbox Tester 作成などの2FAが必要なワークフロー
    ● Fastlaneには課金のSandbox Userの作成など、Appleの非公式APIを利用した機
    能がいくつかある
    ○ api_key認証に対応していないため2FAを通過する必要がある
    ● Bitriseには「一度2FAした認可(cookie)を保持する」機能がある
    ○ Appleの2FAはリクエストされた地域外から利用すると即時無効化される
    ○ Bitriseでコンソール上からマシンが2FAをリクエストし、その場でユーザーに
    コードを教えてもらうことで解決している
    https://firebase.google.com/products/app-distribution

    View Slide

  32. Bitriseにしかない機能の代替案を用意する
    32
    Sandbox Tester 作成などの2FAが必要なワークフロー
    Github Actions self-hosted runners を利用している場合、実行マシンと、ユーザーが
    同じ地域にいる場合はローカルで通したcookie情報をsecret経由で更新して使うことで
    Github Actions上で認証を通すことは可能-
    ● ~/.fastlane/spaceship/[email] にあるcookieをCI上でも設置する
    https://firebase.google.com/products/app-distribution

    View Slide

  33. Bitriseにしかない機能の代替案を用意する
    33
    SlackからのCIの実行
    Bitriseの Slackからのwebhook実行 + Slackのワークフロー
    ● 簡単に誰でもアプリが配布できるように
    https://firebase.google.com/products/app-distribution

    View Slide

  34. Bitriseにしかない機能の代替案を用意する
    34
    SlackからのCIの実行(要実装)
    Slack App + Github Actions API にて実装することで代替(In progress)
    https://api.slack.com/apps

    View Slide

  35. Bitriseにしかない機能の代替案を用意する
    ビルド済みのipaの端末へのダウンロードURLを
    Bitriseが生成してくれる機能
    施策テスト時など、特定のブランチのアプリを渡してや
    りとりする際に利用されていた
    35
    アプリのQRコード配布

    View Slide

  36. Bitriseにしかない機能の代替案を用意する
    36
    アプリのQRコード配布 → Firebase App Distribution に完全移行
    Firebase App Distribution
    ● Firebase 内のベータ版アプリ配布の機能
    ● 利用は完全無料
    ● Fastlane用の実行プラグインもある
    ● Googleアカウントごとに制御可能
    タップルでも以前から併用していたがこれを機に完全移行
    https://firebase.google.com/products/app-distribution

    View Slide

  37. Bitriseにしかない機能の代替案を用意する
    37
    アプリのQRコード配布 → Firebase App Distribution に完全移行
    いつの間にかアプリごとのURLが取得できるようになっていた
    https://firebase.google.com/products/app-distribution

    View Slide

  38. Bitriseにしかない機能の代替案を用意する
    38
    アプリのQRコード配布 → Firebase App Distribution に完全移行
    Q: アプリ配布時にダウンロードURLが取得できる?
    https://firebase.google.com/products/app-distribution

    View Slide

  39. Bitriseにしかない機能の代替案を用意する
    39
    アプリのQRコード配布 → Firebase App Distribution に完全移行
    Q: アプリ配布時にダウンロードURLが取得できる?
    YES. 下記の環境変数に結果が格納されている
    (移行時にはなかった)
    lane_context[SharedValues::FIREBASE_APP_DISTRO_RELEASE]
    https://firebase.google.com/docs/reference/app-distribution/rest/v1/projects.apps.releases#resource:-release

    View Slide

  40. Bitriseにしかない機能の代替案を用意する
    40
    アプリのQRコード配布 → Firebase App Distribution に完全移行
    fastlaneでのipaのアップロード後、アプリURL(+QR)をSlackに投稿

    View Slide

  41. 実際のGithub Actions 移行後のパフォーマンス
    41

    View Slide

  42. 実際のGithub Actions 移行後のパフォーマンス
    42
    30min → 9.5min と300%削減🎉(フルキャッシュ状態)

    View Slide

  43. 実際のGithub Actions 移行後のパフォーマンス
    43
    ● Bitriseで価格帯からスペックの良いマシンが利用できていなかったことによるマシン
    スペック差が大きそう
    ● Git CloneがBitrise上よりGithub Action上のほうが2min早いことも
    ● キャッシュの管理がBitriseより柔軟
    https://firebase.google.com/products/app-distribution
    30min → 9.5min と300%削減🎉

    View Slide

  44. まとめ
    44

    View Slide

  45. まとめ
    ● iOSのCI / CD SaaSは実行時間ベースの課金体系が主流になっており、価格が上
    がってきている
    ● Github Actions self-hosted runners を利用することで実行時間や消費クレジッ
    トを機にすることのないCI / CD 環境を構築できる
    ● Bitrise → Github Actions への移行は基本的には可能
    ● 高いマシンスペックを活用することで大幅にCIの実行時間が短縮できる場合も
    45

    View Slide

  46. ありがとうございました!
    #ca_swift にて感想お待ちしてます🙇
    46

    View Slide