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

minimo 事業部における開発基盤の整備(ChatOps + GItHub Actions)...

minimo 事業部における開発基盤の整備(ChatOps + GItHub Actions)【MIXI TECH CONFERENCE 2023】

MIXI TECH CONFERENCE 2023
にてお話した洗川&鈴木の資料です。

動画:https://youtu.be/irO5Yk1JvYE

https://techcon.mixi.co.jp/2023/d3-2

MIXI ENGINEERS

March 03, 2023
Tweet

More Decks by MIXI ENGINEERS

Other Decks in Technology

Transcript

  1. 自己紹介 • 洗川 雄輝 • 株式会社MIXI所属 ◦ minimo事業部には2年半ほど前にJoin ◦ コンテナ移行、Go移行などを担当

    • よく触るのはAWS、Unity • OSS ◦ https://github.com/yukiarrr/ecsk ◦ ECSのタスク操作をインタラクティブにできるツール ◦ 今回紹介するChatOpsの構築の際にも利用しています (C)MIXI
  2. 自己紹介 • 鈴木 雅也 (Masaya Suzuki) • 新卒4年目 / minimo

    2年目 • minimoのサーバーサイドの開発やインフラの構築・運用を担当 • GitHub Actionsを触るのが好き • 著書 ◦ 数式をプログラムするってつまりこういうこと https://amzn.asia/d/bvqp5T5 ◦ データサイエンス100本ノック構造化データ加工編ガイドブック https://amzn.asia/d/gmgxaVk (C)MIXI
  3. self-hosted runner 導入: 課題 • minimoでは主にGitHub Actionsを使ってCIを動かしている • GitHub-hosted runnerのみの場合、以下の課題があった

    ◦ 並列数の上限が決まっている ◦ 契約プランの無料枠を超過し、追加課金が常態化 ◦ AWSのVPC内への接続を伴うCIを記述するのが難しい ◦ (話が持ち上がった当時は) マシンスペックが固定なので、処理が重いCIを動 かしづらい (C)MIXI
  4. self-hosted runner 導入: 解決策・方針 • self-hosted runnerを導入する • 以下のCIをself-hosted runnerに移行する

    ◦ 実行時間がかかるCI ◦ AWSへの接続を伴うCI • 上記以外のCIは従来通りGitHub-hosted runnerで実行することで、 GitHubの無料枠を使い切る (C)MIXI
  5. self-hosted runner 導入: 基本的な構築方法 • 特定のリポジトリで動かす場合、以下のように構築する 2. 以下のようにDockerコンテナを立ち上げる 3. (GitHub側でrunnerが自動的に登録される)

    (C)MIXI docker run --rm -e RUNNER_SCOPE=repo \ -e LABELS=CIのruns-onの値 (カンマ区切りで複数指定可) \ -e RUNNER_WORKDIR=/path/to/work_dir \ -e REPO_URL=GitHubリポジトリのURL \ -e ACCESS_TOKEN=GitHubのPersonal Access Token \ Dockerイメージ名
  6. AWS Cloud ECR self-hosted runner 導入: アーキテクチャ (C)MIXI ECS on

    EC2 リポジトリA用Service Task数増減 CI起動・終了通知 定期実行 Task (Container) CI実行 リポジトリB用Service Amazon EventBridge AWS Lambda AWS Lambda Task入れ替え AWS Secrets Manager Payload検証用Secret取得 リポジトリA用Image リポジトリB用Image pull
  7. self-hosted runner 導入: アーキテクチャ • AWSのECS上で構築 • ECS ◦ CI上でDockerを使うケースがあるため、起動タイプはEC2

    ◦ 裏で動いているEC2インスタンスの増減はCapacity Providerで行う ◦ GitHubのリポジトリ単位でServiceを作り、その中でself-hosted runnerの Taskを動かす • ECR ◦ ECS Taskで使用するDockerイメージを管理 (C)MIXI
  8. self-hosted runner 導入: アーキテクチャ • Lambda (Task数増減) ◦ 実行するCIの増減に合わせてECS Taskも増減する

    ◦ Function URLsでGitHubのWebhookによるCI起動・終了の通知を受け取り、 ECS ServiceのdesiredCountを増減させる ◦ WebhookのPayload認証にはSecret Managerに保存したSecretを使用 • Lambda (Task入れ替え) ◦ タスクがずっと残っていると不具合が発生することがあるので、定期的に入れ 替える ◦ 深夜にECS ServiceをforceNewDeploymentを設定した状態でdesiredCount を1にする (C)MIXI
  9. self-hosted runner 導入: 工夫したポイント • Dockerイメージ・コンテナ関連 ◦ セキュリティ面を重視して、ベースイメージは少し枯れたバージョンを使用して いる ◦

    CI実行後にTaskをスケールインさせるため、CIの実行が終わったらrunnerを 終了させる環境変数「EPHEMERAL=1」を指定している (C)MIXI
  10. self-hosted runner 導入: 現状 • self-hosted runnerのインフラ構築完了 • CIをself-hosted runnerに移行中

    ◦ self-hosted runner導入前に比べ、GitHubへの追加課金が1/4になっている (C)MIXI
  11. self-hosted runner 導入: 導入してみてのメリット • self-hosted runnerに移行したCIについては並列数の上限がなくなった • AWSリソースを扱うCIを特別な処理なしで記述できるようになった •

    CIを動かすマシンを変えられるので、処理が重いCIに対し高スペックな マシンを割り当てられるようになった • CI実行に必要なコマンドのインストールをDockerイメージのビルド時に 行えるので、CIの実行時間のうちインストールにかかっていた時間を短 縮できた (C)MIXI
  12. PRを自動生成するCI導入: 構築方法 • 以下のような形でCIを記述する (C)MIXI on: pull_request: types: - opened

    - synchronize - reopened - closed jobs: diff-pr-management: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 if: github.event_name != 'pull_request' || github.event.action != 'closed' with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha || github.sha }} - if: github.event_name != 'pull_request' || github.event.action != 'closed' run: hoge fmt - uses: dev-hato/actions-diff-pr-management@v1 with: github-token: ${{secrets.GITHUB_TOKEN}} formatterやスクリプトを実 行する Actionsを実行する