この記事はCyberAgent Developers Advent Calendar 2024 12日目の記事です。

前日の担当はMasaya KamiokaさんのABEMAにおける映像解析AI基盤「MediaAnalyzer」についてでした。

こんにちは、サイバーエージェント CIU所属の中西 (@whywaita) です。

ここ数年はプライベートクラウド Cycloud 上で提供しているGitHub Actionsのオートスケーリングself-hosted runner基盤の開発や運用をしています。 この基盤はCyberAgent Developers Advent Calendar 2020で書いた記事 で発表した myshoesをマネージドに提供しています。
名前はCycloud上で動作しているので本家をもじって Cycloud-hosted runner です。

今年はあまり対外発表が出来ていなかったので、今年の1年でmyshoesやその関連ソフトウェアに入ったアップデートを社外向けにまとめておきます。

OSSになっていない部分も含みますがご容赦ください。

Freeze対応

2024年のリリースの中でトップクラスに大きいリリースです。

我々の提供しているものは大きな分類で言うとジョブ処理基盤と呼ばれるものです。
ユーザにとってはジョブをより高速に・効率的に展開することがUXを向上されることが目的です。

リリース当初はジョブ要求が来る度にインスタンスの作成を行っていたのですが、より高速にジョブ処理を行うために1度runner向けのOS起動まではさせておいて、ジョブ要求が来るタイミングでpickするように変更しました。
myshoesと近しいソフトウェアであるactions-runner-controllerであれば minRunners 、philips-labs/terraform-aws-github-runnerであれば pool_config が近しい機能ですね。

単にrunnerを先に作成しておけば良いだけであれば、GitHub Actionsのself-hosted runnerは事前にrunnerを登録しておく機能があるためそちらを利用するだけで問題ありません。事実、前述のソフトウェアは「1プラットフォームに1つの開発チーム」であることを想定して実装されているため、上記を設定すると単にrunnerを作成しておくスケジューリングを行います。

我々のプラットフォームが大きく異なる点として、我々の基盤は複数の GitHub(Enterprise Server 含む) / 複数の Organization / 複数の Repository を収容している点にあります。

runnerの登録先はユーザ毎に異なり、単にそれぞれの設定値通りにrunnerを作成してしまうと非効率なリソース配分を行わなくてはいけません。
そのため我々はLXCのfreeze機能を用いてrunnerの登録直前まで設定したものを事前に配置し、ジョブ要求が来た段階で解凍しrunnerとして登録する仕組みを採っています。

詳細なアーキテクチャなどは今後登壇やドキュメンテーションなどで可視化予定ですが、気になる方はぜひお声がけいただければと思います。ちなみにfreezeの採用の他にも高速化する手法がOSSであるmyshoesのLXD providerである whywaita/shoes-lxd-multi に展開されています。

高速化が得意takonomuraさんにもContributeしていただきました。

add pool-agent by gamoutatsumi · Pull Request #28 · whywaita/shoes-lxd-multi

Implement pool mode by takonomura · Pull Request #22 · whywaita/shoes-lxd-multi

macOS / Xcode 新規バージョン対応

GitHub Actions Meetup Tokyo #4 でも発表しましたが、Linux runnerだけではなく macOS runner も社内向けに提供しています。

2024年はmacOS Sequoia、iOS 18とそれに付随してXcode 15.2〜Xcode 16.2までの合計6件のXcodeがリリースされました(Beta, RCを除く)。
これらは既定されたポリシーベースに事前にインストールした上で社内に提供しています。
特にXcodeはiOSの新機能を利用する際に必須となるため、優先度を高く設定しています。

直近ではGitHub-hosted runner上でのXcodeインストールポリシーが変わったことが話題になりました。

[macOS] Support policy changes; Xcode 14 and 16 will be removed from macOS 14 on November 4 · Issue #10703 · actions/runner-images

まだ我々のプラットフォームではどうするか社内で検討中です。

残念ながらmacOS向けのproviderはPrivate Repositoryで運用されています。いくつか理由はありますが、提供時点で macOSの Virtualization.Framework が整っていなかったことが1つです。

現代ではDocker Desktopで動作しているDocker VMMなど利用例も増えて枯れてきたところかなと思いますので、そろそろオープンソース実装に着手できればと思っています。
Code-Hex/vzsuzusuzu/virtualization-rsなどなど各言語のバインディングライブラリも増えてきているので(macOS Guestに対応しているかどうかと言われるとまた別なのですが)、そろそろ戦えるのではないかなと。

まとめ

細かいアップデートはまだまだありますが、大きな2つのアップデートをご紹介しました。

CIUではソフトウェアを開発し、それをマネージドサービスとして社内向けに提供する基盤を開発し、社内開発者の開発者体験をより良くしていきます。
Cycloud-hosted runnerチームでも前記したようにmacOS runnerのproviderやOSイメージの管理の刷新や、新しいLinux container runtimeの検討など新しいものの開発、ハードウェアをソフトウェアの力で管理する基盤開発などをこれからも進めていきます。

明日の担当はJunpei Tsujiさんで「メディアの言語選定の歴史」です。辻さんのブログは何年経っても読み返す記事が多くてよく参照しています。いつもありがとうございます。