Slide 1

Slide 1 text

バリエーションで差をつける。 myshoesの新たな挑戦 株式会社サイバーエージェント CIU Development div 
 Nakanishi Kento @whywaita CI/CD Test Night # 6 @ 2 02 3 / 0 5 / 2 6 #cicd_test_night

Slide 2

Slide 2 text

Nakanishi Kento / whywaita • 株式会社サイバーエージェント 2019〜 • 業務: CAグループ向けプライベートクラウド開発 • IaaS の開発 • OSS (myshoes) の開発 
 & OSSを⽤いたマネージドサービス PdM • 趣味: ポーカー / XREAL Air / ⾃宅インフラ

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

4 オススメです

Slide 5

Slide 5 text

5 閑話休題

Slide 6

Slide 6 text

GitHub Actionsの 
 runner事情 6

Slide 7

Slide 7 text

GitHub Actionsの好きなところ • GitHubリポジトリとの連携がスムーズ • ⼀通り⼈間がほしい機能が *だいたい* ある • on.schedule, on.work fl ow_dispatch, matrix … • runner が Virtual Machine (not Container) • docker run が普通にできる • mkmod / dbus が普通にできる • つまり何でも動くということだ 7

Slide 8

Slide 8 text

docker run ができる • runner内では dockerd がそのまま動いている • テストに必要なdockerコンテナ • 例: ory/dockertest • MySQL, Redis, minio … + self build image ok • helm/kind-action • A GitHub Action for Kubernetes IN Docker 8

Slide 9

Slide 9 text

mkmod / dbus が普通にできる iSCSI initiator のテストがうごく 
 
 
 
 9 https://github.com/lovi-cloud/go-os-brick/blob/master/test/scripts/init.sh

Slide 10

Slide 10 text

mkmod / dbus が普通にできる LXDを動かしてpacker buildできる 
 
 
 
 10 https://github.com/whywaita/actions-runner-images-lxd

Slide 11

Slide 11 text

便利 ✨ 11

Slide 12

Slide 12 text

runnerについて • 2種類が存在 • GitHub-hosted runner • GitHubが管理してくれるrunner • self-hosted runner • ⾃分で管理するrunner • actions/runner をVMにインストール 12

Slide 13

Slide 13 text

runnerについて • 2種類が存在 • GitHub-hosted runner • GitHubが管理してくれるrunner • self-hosted runner • ⾃分で管理するrunner • actions/runner をVMにインストール 13 ⼀⻑⼀短

Slide 14

Slide 14 text

GitHub-hosted Runner • Pros • 完全マネージド • Cons • スペックが 2Core 7 GB 固定 • ⾃前でやるよりは⾼い 14

Slide 15

Slide 15 text

self-hosted Runner • Pros • ⾃⼰のインフラで実⾏可能 (スペック、IP) • Cons • 冪等性がない • self-hosted⽤terraformを管理する 
 terraformをself-hostedで動かして…… 15

Slide 16

Slide 16 text

そんなときに便利なのが…… 16

Slide 17

Slide 17 text

17

Slide 18

Slide 18 text

18 とは

Slide 19

Slide 19 text

whywaita/myshoes • Auto scaling self-hosted runner 
 for GitHub Actions • runnerには様々な環境のインフラが利⽤可能 • OSS: https://github.com/whywaita/ myshoes 19

Slide 20

Slide 20 text

whywaita/myshoes • runnerには様々な環境のインフラが利⽤可能 • hashicorp/go-plugin を利⽤ • terraformが内部で利⽤しているプラグイン • shoes-aws, shoes-gcp, shoes-openstack, shoes- lxd etc etc... • https://github.com/topics/myshoes-provider 20

Slide 21

Slide 21 text

内部動作 - 追加時 21 Cloud Provider • AWS / GCP / Azure • LXD • OpenStack • etc etc … ② Send a webhook 
   to myshoes ① Request job ③ Execute provider Virtual Machine with actions/runner ④ Create an instance ⑤ Register runner

Slide 22

Slide 22 text

内部動作 - 削除時 22 Cloud Provider • AWS / GCP / Azure • LXD • OpenStack • etc etc … ① Get a list of runner ③ Execute provider Virtual Machine with actions/runner ④ Delete an instance ② Check to delete runner

Slide 23

Slide 23 text

内部動作 - 追加時 23 Cloud Provider • AWS / GCP / Azure • LXD • OpenStack • etc etc … ② Send a webhook 
   to myshoes ① Request job ③ Execute provider Virtual Machine with actions/runner ④ Create an instance ⑤ Register runner

Slide 24

Slide 24 text

内部動作 - 追加時 24 Cloud Provider • AWS / GCP / Azure • LXD • OpenStack • etc etc … ③ Execute provider Virtual Machine with actions/runner ④ Create an instance ② Send a webhook 
 ① Request job ⑤ Register runner

Slide 25

Slide 25 text

内部動作 - shoes provider 25 Cloud Provider Execute provider (hashicorp/go-plugin) Virtual Machine with actions/runner shoes-xxx Virtual Machine with actions/runner Virtual Machine with actions/runner Call API 1 .Runner Name : runnerに付けるべき名前 2 .Setup Script : actions/runner展開スクリプト 3 .Resource Type : runnerのスペック

Slide 26

Slide 26 text

内部動作 - shoes-aws 26 Amazon Web Services Execute provider (hashicorp/go-plugin) EC 2 with actions/runner shoes-aws EC 2 with actions/runner EC 2 with actions/runner Call AWS REST API 1 .Runner Name to tag “Name” 2 .Setup Script to cloud-init user-data 3 .Resource Type to AWS Instance Type

Slide 27

Slide 27 text

内部動作 - shoes-lxd 27 LXD server Execute provider (hashicorp/go-plugin) LXD Container with actions/runner shoes-lxd Call LXD REST API LXD Container with actions/runner LXD Container with actions/runner 1 .Runner Name to Instance name 2 .Setup Script to cloud-init user-data 3 .Resource Type to limits.cpu, limits.memory

Slide 28

Slide 28 text

バリエーションが産まれる ✨ 28

Slide 29

Slide 29 text

様々なバリエーション • Public Cloudの安価なインスタンス • AWS Spot Instances, GCP Preemptible Instances • Private Cloud, ⾃宅サーバ • LXD, OpenStack • 専⽤ハードウェア対応 • GPU, FPGA 29

Slide 30

Slide 30 text

サイバーエージェントにおける 
 myshoesの活⽤事例 30

Slide 31

Slide 31 text

31 プライベートクラウド

Slide 32

Slide 32 text

プライベートクラウド 32 •社内(CAグループ)向けクラウド基盤 •特徴 •社内の需要に合わせた物理設計 •⼀括購⼊によるコストメリット •安価に計算機資源を利⽤可能

Slide 33

Slide 33 text

Cycloud 33 •Cy(berAgent)cloud •各種サービスの提供 •IaaS / KaaS / PaaS / ML Platform •Cycloud-hosted runner (myshoes)

Slide 34

Slide 34 text

34 https://www.tomorrow-net.co.jp/case_detail/cyberagent/

Slide 35

Slide 35 text

35 https://www.cyberagent.co.jp/news/detail/id= 2 84 8 4

Slide 36

Slide 36 text

36 https://isucon.net/archives/ 55 5 3 3 0 13 .html

Slide 37

Slide 37 text

プライベートクラウド 37 •社内(CAグループ)向けクラウド基盤 •特徴 •社内の需要に合わせた物理設計 •⼀括購⼊によるコストメリット •安価に計算機資源を利⽤可能

Slide 38

Slide 38 text

38 安価に計算機資源を利⽤可能 
 ↓ 
 CIサービスの提供に向いている 💯

Slide 39

Slide 39 text

サイバーエージェントのCI事情 • 技術選定は各プロダクトが⾏う • github.com , GitHub Enterprise Server, GitLab • Jenkins, Travis CI, CircleCI, Drone CI, Bitrise • エンタープライズ契約を⾏うことも 
 ex:) CircleCI Enterprise • GitHub Actionsもbeta時代から⼀部プロダクトで導⼊ 39

Slide 40

Slide 40 text

サイバーエージェントのCI事情 • Circle CI Enterprise からGitHub Actionsへの移⾏需要 • Enterprise 契約の終了 • コストメリットの低下 • サポートコストの増加 • Cycloudの安価な計算機資源が利⽤できるのでは? → myshoesの開発へ 40

Slide 41

Slide 41 text

サイバーエージェント では • myshoesをマネージドサービスとして提供 • Cycloudユーザでも⾮ユーザでも利⽤可 • GHES, GHEC, github.com 全対応 • 社内のほぼ全てのユースケースに対応 • マルチテナントとして提供 41

Slide 42

Slide 42 text

サイバーエージェントにおけるmyshoes構成 • whywaita/myshoes + shoes-lxd-multi • LXD (LinuX Container Daemon) • マルチテナント提供: myshoes-controller • MySQL Cluster (with orchestrator) • Docker Registry v 2 , LXD image server 42

Slide 43

Slide 43 text

Kubernetes Cluster サイバーエージェントにおけるmyshoes構成 43 myshoes-proxy (Global IP) github.com GHES User Tenant A Tenant B webhook myshoes REST API Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) k 8 s Service k 8 s Service for Service X for Service Y k 8 s Service Tenant C k 8 s Service

Slide 44

Slide 44 text

既存 Cycloud サイバーエージェントにおけるmyshoes構成 44 Tenant A Tenant B Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) k 8 s Service k 8 s Service for Service X for Service Y k 8 s Service Tenant C k 8 s Service Service VM Service VM Service VM 既存 Cycloud ユーザは 
 ⾃テナントのVMとの接続が可能 
 他テナントのVMとの接続は不可

Slide 45

Slide 45 text

サイバーエージェントにおけるmyshoes仕様 • Cycloud VMをStadiumとしGitHub-hostedよりも安価に提供 • LXDイメージはGitHub-hostedとほぼ同じイメージを利⽤ • https://github.com/whywaita/actions-runner-images-lxd • runnerスペック 2Core 2 0 GB ~ 1 6 Core 1 60 GB • 起動時間は約1分程度 • 詳細は https://speakerdeck.com/whywaita/cadc 2 0 2 2 -github-actions-runner-myshoes 45

Slide 46

Slide 46 text

サイバーエージェントでの規模感 • Stadium台数: 約80台 ( 1 6 c 160 gb) • 導⼊数: 約50チーム / プロダクト • Linux版GAから: 1年8ヶ⽉ • 1⽇の実⾏job数: 約1万個 • 常時500〜700インスタンスぐらい 46

Slide 47

Slide 47 text

サイバーエージェントでの規模感 47

Slide 48

Slide 48 text

サイバーエージェントでの規模感 mysql> SELECT SUM(TIMESTAMPDIFF(second, started_at, ended_at)) FROM job_logging WHERE started_at IS NOT NULL; +--------------------------------------------------+ | SUM(TIMESTAMPDIFF(second, started_at, ended_at)) | +--------------------------------------------------+ | 460269137 | +--------------------------------------------------+ 1 row in set (2.03 sec) 48

Slide 49

Slide 49 text

サイバーエージェントでの規模感 mysql> SELECT SUM(TIMESTAMPDIFF(second, started_at, ended_at)) FROM job_logging WHERE started_at IS NOT NULL; +--------------------------------------------------+ | SUM(TIMESTAMPDIFF(second, started_at, ended_at)) | +--------------------------------------------------+ | 460269137 | +--------------------------------------------------+ 1 row in set (2.03 sec) 49 4億秒 🎉

Slide 50

Slide 50 text

サイバーエージェントに おけるmyshoes 
 新たなるバリエーションの 登場 50

Slide 51

Slide 51 text

51

Slide 52

Slide 52 text

🍎 52

Slide 53

Slide 53 text

Cycloud-hosted runner (myshoes) macOS runner became General Availability! 🎉 53

Slide 54

Slide 54 text

macOS runner • ⾃社DCにMac miniを設置 • M 2 Mac mini (2023) を採⽤ • テナント毎にMac miniを割当、提供 • macOS runner 仮想化には UTM を採⽤ • https://mac.getutm.app 54

Slide 55

Slide 55 text

macOS runner • Linux版と同じ仕様 • jobを検知し都度VMを作成 • OSは actions/runner-images ベース 55

Slide 56

Slide 56 text

Kubernetes Cluster サイバーエージェントにおけるmyshoes構成 (今まで) 56 myshoes-proxy (Global IP) github.com GHES User Tenant A Tenant B webhook myshoes REST API Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) k 8 s Service k 8 s Service for Service X for Service Y k 8 s Service Tenant C k 8 s Service

Slide 57

Slide 57 text

Kubernetes Cluster サイバーエージェントにおけるmyshoes構成 (今まで) 57 Tenant A Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) for Service X shoes-lxd-multi shoes-lxd-multi-server ① Execute ② RPC call ③ Schedule

Slide 58

Slide 58 text

Kubernetes Cluster サイバーエージェントにおけるmyshoes構成 (これから) 58 Tenant A Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Mac mini x N for Service X shoes-label-router shoes-lxd-multi-server ① Execute ② RPC call ③ Schedule shoes-macos-server

Slide 59

Slide 59 text

shoes-label-router • myshoes provider • runs-on の記述を元に処理を実⾏ • Linux or macOS (RPC calls先を決定) • resource_type • OS version 
 59 runs-on: myshoes_linux_large_22.04 runs-on: myshoes_macos_large_12

Slide 60

Slide 60 text

shoes-label-router • myshoes provider • runs-on の記述を元に処理を実⾏ • Linux or macOS (RPC calls先を決定) • resource_type • OS version 
 60 runs-on: myshoes_linux_large_22.04 runs-on: myshoes_macos_large_12 ユーザは runs-onを 変えるだけでOK!

Slide 61

Slide 61 text

macOS runner 利⽤状況 / 今後の展望 • 複数のプロダクトで利⽤開始 • iOS向けアプリビルドがメイン • 仮想化周りのアップデートはあるかも • GitHubはankaを使っているっぽい?[1] • OSS化も…… 61 [ 1 ]: https://github.com/actions/runner-images/blob/ 
 b 8 9 2 aebfe 8 a 9 c 861 adb 84 7 2 a 8 e 0499 1 5 aad 8441 1 / 
 images/macos/templates/macOS- 1 3 .arm 6 4 .anka.pkr.hcl

Slide 62

Slide 62 text

今後の展望 62 •whywaita/myshoes として •GitHubが何かやってきそうなので (Job server) 
 その対応 •社内向けサービスとして •runner起動⾼速化 •物理サーバ提供

Slide 63

Slide 63 text

まとめ 63 •whywaita/myshoes のご紹介 •サイバーエージェントにおける取り組みのご紹介 •myshoes + LXD で社内向けに提供しています •macOS runner始めました 🍎🏃 •M 2 Mac miniベースに提供開始 •We are hiring!

Slide 64

Slide 64 text

Q? 64