Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Github Actions Self-hosted Runnersの紹介 22

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Bitrise → Github Actions への移行 27

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

まとめ 44

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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