CA.Swift #16 https://cyberagent.connpass.com/event/233745/
@kazuma_nagano / nade2023/03/15 CA.SwiftGithub Actions self-hosted runnersのすゝめ
View Slide
自己紹介なで( @kazuma_nagano )2019 サイバーエージェント 入社タップル iOSチームリーダー2
登壇中の疑問、感想等#ca_swift にてツイートしていただけると大変喜びます🙇3
アウトライン1. ネイティブにおける CI / CDの主な役割2. ビルドコスト増加に伴うリスク3. Github Actions self-hosted runners の紹介4. Bitrise → Github Actions への移行5. まとめ4
ネイティブにおける CI / CDの主な役割5
ネイティブにおける CI / CD の主な役割自動テスト( CI / Continuous Integration )アプリ配布( CD / Continuous Delively )6Build TestPrepare FeedbackBuildSubmitStorePrepareDistribute
環境構築はキャッシュを駆使してチューニング可能自動テスト( CI / Continuous Integration )アプリ配布( CD / Continuous Delively )7Build TestPrepare FeedbackBuildSubmitStorePrepareDistributeタップルにおけるビルド時間(2023)
参考文献8https://bitrise.io/blog/post/tune-your-bitrise-workflows-using-cache-in-steps
(主題)どちらもビルドで時間的コストの大半を使う自動テスト( CI / Continuous Integration )アプリ配布( CD / Continuous Delively )9Build TestPrepare FeedbackBuildSubmitStorePrepareDistributeビルドコストは増加していく
ビルドコスト増加に伴うリスク10
ビルドコスト増加に伴うリスク1. ビルド時間は年々増加していく2. 実行時間に準じた課金体系の標準化11
1. ビルド時間は年々増加していく12
139年弱のコードベース成果物のキャッシュされていないライブラリ群Kotlin MultiplatformMobileビルド時間は年々増加していくタップルにおけるビルド時間
14ビルド時間は年々増加していくタップルにおけるビルド時間(2023)
15ビルド時間は年々増加していくタップルにおけるビルド時間(2025?)?
1. 実行時間に準じた課金体系の標準化16
実行時間に準じたクレジットベースのプラン17Bitrisehttps://bitrise.io/pricing
実行時間に準じたクレジットベースのプラン18Circle CIhttps://circleci.com/ja/pricing/
実行時間に準じたクレジットベースのプラン19Github Actions(GitHub-managed Standard)https://github.co.jp/pricing#compare-features
実行時間に準じたクレジットベースのプラン20Xcode Cloundhttps://developer.apple.com/jp/xcode-cloud/
実行時間に準じたクレジットベースのプラン● iOS向けSaaSはどこもビルド時間ごとの課金体系が主流で値上げ傾向● プランごとのクレジットがなくなるとCIが止まってしまうことも● チームの拡大や生産性の向上により線形に価格上昇していく● マシンスペックに応じて実行時間ごとの価格が上昇していく○ 一般的にクレジット消費が2xになっても実行時間は1/2にはならない21ビルド時間の増加がプロダクト開発の潜在的なリスクになっている
Github Actions Self-hosted Runnersの紹介22
Github Actions self-hosted runner の紹介● 自分達で管理する実マシンやAWS EC2などの仮想マシンをGithub Actionsの実行マシンに指定できる機能● 基本的にはGithub が提供するself-hosted runner アプリケーションを実行できるマシンであればどのマシンでもOK● Github Actions上からのインターフェースはほぼ変わらない● 実行時間の制限はほぼなく(35日)、マシンスペックも好きなものを選べる23
Github Actions self-hosted runner の紹介ビルド実行時の実行マシンのラベル指定のみ24name: '[iOS] Test App'on:workflow_dispatch:jobs:build:runs-on:- self-hosted- macOStimeout-minutes: 120
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
グループのインフラチームの管理する myshoes を通して 物理マシンを利用Cyberagent myshoes の 紹介26https://speakerdeck.com/whywaita/cyberagent-oss-cicd-myshoes-cicd2021
Bitrise → Github Actions への移行27
今日話さないこと● Bitrise、Github Actions の特徴、比較● 実際のワークフローの構築の仕方● それぞれのコストの話28
Bitrise → Github Actions への移行● 基本的な CI / CD に必要な機能においては代替手段あり○ キャッシュ管理(CocoaPods, Gem, Ruby, Java, Gradle, SwiftPM)○ スケジューリングビルド● 事前にワークフローの実行をfastlaneにまとめておくことで容易に移行可能○ 証明書管理 → fastlane match、ビルドコマンド → fastlane gym● Bitriseにしかない機能は代替案を用意する必要あり29
Bitriseにしかない機能の代替案を用意するタップルで利用していたBitriseにしかない機能● Sandbox Tester 作成などの2FAが必要なワークフロー● SlackからのCIの実行● アプリのQRコード配布30
Bitriseにしかない機能の代替案を用意する31Sandbox Tester 作成などの2FAが必要なワークフロー● Fastlaneには課金のSandbox Userの作成など、Appleの非公式APIを利用した機能がいくつかある○ api_key認証に対応していないため2FAを通過する必要がある● Bitriseには「一度2FAした認可(cookie)を保持する」機能がある○ Appleの2FAはリクエストされた地域外から利用すると即時無効化される○ Bitriseでコンソール上からマシンが2FAをリクエストし、その場でユーザーにコードを教えてもらうことで解決しているhttps://firebase.google.com/products/app-distribution
Bitriseにしかない機能の代替案を用意する32Sandbox Tester 作成などの2FAが必要なワークフローGithub Actions self-hosted runners を利用している場合、実行マシンと、ユーザーが同じ地域にいる場合はローカルで通したcookie情報をsecret経由で更新して使うことでGithub Actions上で認証を通すことは可能-● ~/.fastlane/spaceship/[email] にあるcookieをCI上でも設置するhttps://firebase.google.com/products/app-distribution
Bitriseにしかない機能の代替案を用意する33SlackからのCIの実行Bitriseの Slackからのwebhook実行 + Slackのワークフロー● 簡単に誰でもアプリが配布できるようにhttps://firebase.google.com/products/app-distribution
Bitriseにしかない機能の代替案を用意する34SlackからのCIの実行(要実装)Slack App + Github Actions API にて実装することで代替(In progress)https://api.slack.com/apps
Bitriseにしかない機能の代替案を用意するビルド済みのipaの端末へのダウンロードURLをBitriseが生成してくれる機能施策テスト時など、特定のブランチのアプリを渡してやりとりする際に利用されていた35アプリのQRコード配布
Bitriseにしかない機能の代替案を用意する36アプリのQRコード配布 → Firebase App Distribution に完全移行Firebase App Distribution● Firebase 内のベータ版アプリ配布の機能● 利用は完全無料● Fastlane用の実行プラグインもある● Googleアカウントごとに制御可能タップルでも以前から併用していたがこれを機に完全移行https://firebase.google.com/products/app-distribution
Bitriseにしかない機能の代替案を用意する37アプリのQRコード配布 → Firebase App Distribution に完全移行いつの間にかアプリごとのURLが取得できるようになっていたhttps://firebase.google.com/products/app-distribution
Bitriseにしかない機能の代替案を用意する38アプリのQRコード配布 → Firebase App Distribution に完全移行Q: アプリ配布時にダウンロードURLが取得できる?https://firebase.google.com/products/app-distribution
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
Bitriseにしかない機能の代替案を用意する40アプリのQRコード配布 → Firebase App Distribution に完全移行fastlaneでのipaのアップロード後、アプリURL(+QR)をSlackに投稿
実際のGithub Actions 移行後のパフォーマンス41
実際のGithub Actions 移行後のパフォーマンス4230min → 9.5min と300%削減🎉(フルキャッシュ状態)
実際のGithub Actions 移行後のパフォーマンス43● Bitriseで価格帯からスペックの良いマシンが利用できていなかったことによるマシンスペック差が大きそう● Git CloneがBitrise上よりGithub Action上のほうが2min早いことも● キャッシュの管理がBitriseより柔軟https://firebase.google.com/products/app-distribution30min → 9.5min と300%削減🎉
まとめ44
まとめ● iOSのCI / CD SaaSは実行時間ベースの課金体系が主流になっており、価格が上がってきている● Github Actions self-hosted runners を利用することで実行時間や消費クレジットを機にすることのないCI / CD 環境を構築できる● Bitrise → Github Actions への移行は基本的には可能● 高いマシンスペックを活用することで大幅にCIの実行時間が短縮できる場合も45
ありがとうございました!#ca_swift にて感想お待ちしてます🙇46