5.9K Views
March 27, 24
スライド概要
Magic Pod 社が主催する『主要CIツール3選!導入する前に知りたかった!各ツールのアピールポイント!』というイベントの発表資料です。
https://trident-qa.connpass.com/event/310009/
GitHub Actions の基本から最新トピック、サイボウズでの CI についてまとめました。
開発を⽀える GitHub Actions 〜基本から最新トピックまで〜 サイボウズ株式会社 開発本部 ⽣産性向上チーム 宮⽥ 淳平(@miyajan)
⾃⼰紹介 ▌宮⽥ 淳平(@miyajan) ▌サイボウズ株式会社 n 2009年 新卒⼊社 n 2015年 ⽣産性向上チーム⽴ち上げ n ⽣産性向上チームの紹介 n チームのマスコットキャラができました n セイサンシャインくん ▌『GitHub Actions 実践⼊⾨』執筆など
本⽇の話 ▌CI ツール導⼊を検討している⼈向け n CI ⾃体の基本的な説明は省きます n 参考: CI/CD 2021 ▌GitHub Actions の基本的な話とかいろいろ ▌サイボウズ社内での CI
GitHub Actions の基本
GitHub Actions とは ▌GitHub が提供する CI/CD サービス
GitHub Actions の歴史 ▌2018/10 beta 版公開 ▌2019/08 ⼤幅リニューアル n 記述⾔語が HCL から YAML に変更 n インフラは Azure 上で動き、ランナーも Azure Pipelines の fork に n GitHub が Microsoft に買収された影響 ▌2019/11 GA ▌参考: GitHub Actionsの歴史(2021/12/1 更新) - cangoxina
GitHub Actions の特徴
GitHub 上で完結して CI を実⾏できる ▌GitHub 利⽤者は⼿軽に導⼊できる ▌GitHub へのアクセス権限を別サービスに持ち出さなくて済む
YAML によるとっつきやすいワークフロー定義 ▌直感的で読みやすい(※個⼈の感想です) ▌ワークフロー単位で YAML ファイルを分割可能 name: Hello, World! on: push jobs: build: name: Greeting runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: echo “Hello, World!” ...
アクションによる巨⼤なエコシステム ▌アクションという単位で実⾏可能なタスクを作成して共有できる n いろいろな企業・個⼈から OSS で作成・公開されている ▌アクションの例 n リポジトリのチェックアウト (actions/checkout) - uses: actions/checkout@v4 n キャッシュの保存・復元 (actions/cache) n 様々なツールのインストール・セットアップ (actions/setup-node など) n Docker イメージのビルド&プッシュ (docker/build-push-action) n AWS の認証 (aws-actions/configure-aws-credentials)
多くのツールが⼊ってるランナー環境 ▌よく使うツールは⼀通りデフォルトでインストールされている ▌インストールされてるソフトウェア⼀覧は公開されている n 例: Ubuntu 22.04 ランナー
GitHub のさまざまなイベントをサポート ▌push 以外の GitHub の様々なイベントにフックしてワークフローを実⾏ できる ▌CI 以外の⽤途にも活⽤しやすい n issue にコメントしたらタスクを実⾏する ChatOps 的な⽤途とか
パブリックリポジトリは標準のランナーが無料 ▌※⼀部の性能の強いランナーは除きます ▌Linux, Windows, macOS (M1 含む) のランナーを無料で使える n private リポジトリは有料だけどプランごとに無料利⽤枠がある https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions
セルフホストランナー ▌⾃⾝が管理するマシン(VM、コンテナ)上でジョブを実⾏できる仕組み ▌GitHub が提供するランナー以外の環境が必要なケースで役⽴つ n例 n GitHub が提供してないマシン環境(CPU、メモリ、OS など)が必要 n 特定のクローズドなネットワーク内で実⾏したい n 同じ環境で巨⼤なキャッシュや成果物を使いまわしたい ▌⼤量のセルフホストランナーを管理するソリューションもいろいろ存在する
GitHub Actions の導⼊
GitHub を使っていれば考えることはあまりない ▌リポジトリに YAML ファイルを置くだけ n 書き⽅は公式サイトや技術ブログなど⼭ほど情報源がある ▌スターターワークフローというテンプレートがいろいろな⽤途向けに存在する
予算 ▌private リポジトリだとお⾦がかかるので料⾦上限を設定する ▌デフォルトでは $0 になっていて無料分を超えて利⽤するには設定が必要 n 指定した上限の 75%, 90%, 100% でアラートメールが⾶ぶ
GitHub Actions の気に⼊ってる機能
GITHUB_TOKEN (github.token) ▌ワークフロー実⾏時に発⾏される⼀時トークン ▌対象のリポジトリの権限が与えられ、権限を柔軟に制限できる ▌GitHub へのアクセスのために⾃前でトークン発⾏&管理しなくていい - name: Create release note env: GH_TOKEN: ${{ github.token }} run: | gh release create ${{ github.ref_name }} –-generate-notes
OpenID Connect (OIDC) サポート ▌OIDC による認証でクラウドプロバイダ (e.g. AWS) への認証が⾏える n 永続的な認証トークンを発⾏&管理する必要がなくなる ▌参考: GitHub Actions の OpenID Connect サポートについて
GitHub Actions の最新トピック
public リポジトリの無料ランナーの性能がアップグレード ▌年明けになぜかいきなり無料ランナーの性能が倍以上になった🙏 n ただし、public リポジトリのみ ▌vCPU: 2 core → 4 core ▌メモリ: 7 GiB → 16 GiB ▌SSD: 14 GiB → 150 GiB
M1 の macOS ランナーが追加 ▌macOS 14 (Sonoma) のランナーが追加 ▌public リポジトリで無料で使える M1 ランナーも追加
GitHub Actions の物⾜りないところ
定期実⾏のタイミングがかなりアバウト ▌GitHub Actions にはワークフローを定期実⾏する設定がある n 例︓5 分間隔で実⾏する設定 on: schedule: - cron: “*/5 * * * *” ▌しかし、この設定は時間通りに実⾏される保証はない ▌なんなら実⾏をスキップされる可能性もある n 上記の設定で⼀時間以上実⾏されないこともありえる ▌定期実⾏を保証したい場合は別システムからトリガーするなど⼯夫が必要
メトリクス収集まわりが弱い ▌CircleCI だと Insights 機能が豊富 n ワークフローの成功率、実⾏時間など n テストの成功率や不安定なテスト、実⾏時間の⻑いテストもわかる ▌GitHub Actions はそういったメトリクスを提供してくれない n API などはあるので⾃前で集計できなくはない n Kesin11/actions-timeline n ワークフローのタイムラインをサマリに表⽰するアクション n fchimpan/gh-workflow-stats n ワークフローやジョブの成功率や実⾏時間を集計する GitHub CLI エクステンション n 標準機能としてほしい…🙏
サイボウズの CI
サイボウズの開発基盤 ▌社内ネットワークからしかアクセスできないシステムに開発の⼀部が依存 ▌GitHub Enterprise Server (GHES) と GitHub Enterprise Cloud (GHEC) を両⽤ n GHEC に移⾏していく流れ
サイボウズで使われている CI ツール ▌今は GitHub Actions が主流 n 単純に便利だし、GitHub との連携が強い n セルフホストランナーとの組み合わせで社内ネットワークからしかアクセス できないシステムとの連携もできる n GHES でも GHEC でも可能 ▌過去には Jenkins や CircleCI がよく使われていた n 今も使ってるチームもある ▌CD で ArgoCD や AWS CodeBuild なども使われている
参考: サイボウズの⼤規模セルフホストランナー事例 ▌philips-labs/terraform-aws-github-runner による GitHub Actions セルフホストランナーの⼤規模運⽤
サイボウズの CI の規模 ▌ピーク時は約 700〜800 台のセルフランナーが同時に起動している ▌GHEC では GitHub がホストするランナーも使い倒している n 今⽉だと 20 万分を超える利⽤がある
⼤規模開発における CI で問題になりがちなところ
料⾦ ▌基本的にクラウド CI サービスは従量課⾦ ▌CI の活⽤が進むにつれて料⾦は上がる ▌開発スピード > CI にかかる料⾦ の優先順位で⼤抵はよい ▌とはいえ、削減できるところは削減したい n ジョブの⾼速化・不必要なジョブ実⾏の削減など n ランナーのセルフホスト n これは運⽤コストが発⽣するので、それなりの規模じゃないとペイしない
実⾏時間 ▌開発が⼤規模化するにつれて CI で⾏いたいタスクが増える n テストの種類やテストケース数の増加など ▌CI の実⾏時間が⻑くなると開発者体験を損なうので地道な改善が必要 n キャッシュの活⽤ n 並列実⾏ n 強い性能のマシンを使う n 不必要なジョブ実⾏の削減
不安定系 ▌CI で E2E テストを実⾏すると⼤規模になるにつれて不安定になりがち n 原因 n ⻑時間の実⾏、ネットワーク、依存システムが多い、テストの書き⽅ ▌こちらも開発者体験を損なうので地道な改善が必要 n テスト構成の⾒直し、不安定なテストの改善など n ⼀定回数までは失敗してもテストをリトライして通ったら許容する仕組み
オブザーバビリティ ▌これまで書いた問題を改善するためには計測が重要 n どのリポジトリのどのワークフロー(ジョブ・ステップ)が料⾦への影響が⼤きい か︖ n ワークフローのどのジョブ・ステップで実⾏時間がかかっているか︖ n どのテストが不安定でどれぐらいの頻度で失敗しているか︖ n いつから上記の傾向は変わっているのか︖ ▌必要な情報を観測可能にする取り組みが⼤事 n 必要なメトリクスを収集する仕組み n 分析ツールの⽤意
セキュリティ ▌ CI 環境上で実⾏される多くのソフトウェアのどこかに⽳があると CI に渡している権限を悪⽤される可能性 ▌ CI に設定しているシークレットに誰がアクセスできるかの管理も重要 ▌ CI に渡されるパラメータによるインジェクション攻撃なども ▌ 完璧な対策は難しいけど、どういうリスクがあってどういう対策が可能か認識しましょう n 監査ログの保存と分析⽅法の準備 n CI に渡す権限を最⼩限にする、必要であればシークレットを使うジョブに承認プロセスを⼊れるなど n 典型的な攻撃⼿法とその対策の周知 n 退職者が出たときの永続シークレットのローテーション⼿順の整備、OIDC の活⽤ n ソフトウェアの利⽤バージョン固定 n Dependabot や Renovate によるセキュリティ fix の⾃動更新 n GitOps の検討、などなど…
まとめ
GitHub Actions ▌GitHub との連携が強く、導⼊も楽 ▌CI ⽤途だけでなく様々な⽤途に使えて便利 ▌後発の CI サービスなので機能も豊富 n 完璧ではないところはもちろんあるけど、⾃前でカバー可能 ▌セルフホストランナーによるビルド環境の柔軟さ ▌巨⼤なエコシステムがあり、ネット上の情報量も多い ▌個⼈開発から⼤規模組織での業務利⽤までどの層でも使える ▌マイクロソフトの資本をバックにつけた⼼強さ💰
CI の活⽤ ▌現代の開発で CI は⽣活インフラレベルで、開発者は使い倒している ▌⾼速なフィードバックループは不確実性を下げ、学びを最⼤化する ▌最近は導⼊も簡単 ▌⼤きくなるにつれて地道な改善は重要 n 最初から完璧でなくていい ▌ぜひ CI 活⽤してみてください︕
宣伝 ▌Engineering Productivity Meetup #2 in ⼤阪 n 4/9 19:00-21:30 @サイボウズ⼤阪オフィス n オフラインのみ(後⽇アーカイブ配信) ▌みんなの⽣産性向上ネタを持ち寄ってワイワイする会です︕ n 発表テーマの例 n ⾃動化(テスト・リリース・環境構築)、CI/CD、IaC、DevOps、メトリクスの 監視・計測、ソースコードの静的解析、開発者ツール、etc.
Q&A