52.1K Views
August 21, 24
スライド概要
2024/08/22 開催 「GitHub Actionsの最適化どうしてる? 開発者体験を向上させる運用術」で発表する資料
イベントconnpassページ: https://findy.connpass.com/event/326645/
座右の銘は「an infinite iterator has no upper bound」
2024.08.22 GitHub Actions ステップアップ Tips 〜高速化・セキュリティ・設計〜 生産性向上チーム 谷 昌典 1
目次 • 自己紹介、チーム紹介 • 発表の前提、伝えたいこと • GitHub Actions Tips #1: 高速化 • GitHub Actions Tips #2: セキュリティ • GitHub Actions Tips #3: 設計 • まとめ #GitHubActions_findy 2
自己紹介、チーム紹介 谷 昌典 (@uta8a) サイボウズ株式会社 生産性向上チーム 所属 #GitHubActions_findy • 経歴 • 2023年 サイボウズ入社(新卒で入って今2年目) 好きな GitHub Actions の構文、action などを呟 いてみてね! • 業務内容 • 社内の GitHub Actions セルフホストランナー基盤の運用、改善 好きな GitHub Actions の構文「secrets コンテキスト」 #GitHubActions_findy 3
自己紹介、チーム紹介 生産性向上チームとは? 詳しくは… 生産性向上チーム採用ピッチ - docswell Zenn で発信してる Productivity Weekly も見てね! 生産性向上チームのPublication - Zenn #GitHubActions_findy 4
発表の前提、伝えたいこと 前提 前提 • Software Design 7月号に書いたネタと被ります • この発表では公式以外のツールも紹介 伝えたいこと 伝えたいこと • GitHub Actionsだけを用いて解決できる問題の範囲は小さい • 実際の課題はデプロイパイプライン全体に渡って複数チームの協力で解決すべきものも多い • Tipsを知っていれば面倒な仕組みを自前で用意することなくショートカットできる • GitHubの機能、GitHub Actionsは多くの開発者の共通の悩みを解決する機能を提供している #GitHubActions_findy 5
GitHub Actions Tips #1: 高速化 計測→対策の流れが大事! ©️ Cybozu, Inc. 6
Tips #1: 高速化 まずは計測から • ワークフローの全体像の把握 • クリティカルパスの把握 • どこの改善をしたらコスパが良いのか #GitHubActions_findy 7
Tips #1: 高速化 Kesin11/actions-timeline の紹介 Kesin11/actions-timeline 実行時間を視覚的に把握できる クリティカルパスがわかりやすい 描画データの実体は $GITHUB_STEP_SUMMARY に書き 込まれたMermaid Oneshotな計測でお手軽に使える ランナーの待機時間も出る (optionで非表示もできる) 画像はREADMEより引用 #GitHubActions_findy 8
Tips #1: 高速化 いざ高速化 必要ないジョブのスキップ キャッシュ マシンパワーで解決 • Larger runner • paths • dorny/paths-filter+matrix • キャッシュの10GB制限対応 • Arm runner • Self-hosted runner GitHub Actionsレベルで行える高速化の多くは3つのタイプ #GitHubActions_findy 9
Tips #1: 高速化 必要ないジョブのスキップ • ディレクトリが綺麗に分割されているとスキップしやすい(言語、機能...) • ワークフロー/ジョブ、ステップ レベルの制御を説明 • paths • 特定のファイル変更時にワークフ ワークフロー自身が変更され た時もトリガーする ローを実行 • モノレポ構成で有効 • ワークフローレベルの制御 #GitHubActions_findy 10
Tips #1: 高速化 必要ないジョブのスキップ • dorny/paths-filter と matrix の組み合わせ • ジョブ、ステップレベルの制御 filtersに key: value 形式で渡して、差分のあった valueにマッチするkeyを後続のジョブに渡せる .tool-versionsに 変更があったら outputsでkeyの配列が渡る ※actionのfull length commit hashは省略してます #GitHubActions_findy 11
Tips #1: 高速化 キャッシュ • メジャーな言語・パッケージマネージャを利用していればキャッシュ自体は難しくない • setup- 系 action に cache: ’***’ と書けば良い 多くはパッケージマネージャを指定 cache: true のみのものもある • 10GBのキャッシュ容量制限が問題 • キャッシュが合計10GBを超えると、新しいキャッシュは保存されるが、GitHub側が自動でキャッシュを削除 • 大規模リポジトリやdockerのイメージビルドで問題になりやすい #GitHubActions_findy 12
Tips #1: 高速化 キャッシュ • デフォルトブランチのみcacheをsaveする • デフォルトブランチ以外ではcacheのrestoreのみを行うことで、saveの量を減らす restoreは全てのブランチで実行 saveはmainブランチのみで実行 • itchyny/s3-cache-action を活用してAmazon S3にキャッシュを保存する • キャッシュスコープの制約がないのが特徴 #GitHubActions_findy 13
Tips #1: 高速化 マシンパワーで解決 • Larger runnerの活用 • Arm runnerは同じスペック帯で見るとintel系より安い • Self-hosted runnerも選択肢に入る(運用コストを許容するなら) 出典: https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions #GitHubActions_findy 14
Tips #1: 高速化 高速化まとめ • まずは計測しよう • Kesin11/actions-timeline • 高速化手法は色々ある • 必要ないジョブは実行しない • キャッシュは10GB制限に気をつける • マシンパワーによる解決 • 実際はテスト改善といったGitHub Actions以外も含めて課題を解決することも #GitHubActions_findy 15
GitHub Actions Tips #2: セキュリティ 脅威を把握しよう。便利なツールも活用しよう。 ©️ Cybozu, Inc. 16
Tips #2: セキュリティ 脅威を把握しよう 前提知識をつける • Security hardening for GitHub Actions – GitHub Docs • 社内用GitHub Actionsのセキュリティガイドラインを公開します – mercari engineering この2つを読めば前提知識としては十分 何を脅威とする? • 防ぎたい脅威を具体的に把握しよう • 内部の開発者と同等の権限を持つ攻撃者を想定する? • GitHub Actions実行環境への侵入はどの程度影響がある? • 脅威例の参考: OWASP Top 10 CI/CD Security Risks 出典: https://owasp.org/www-project-top-10-ci-cd-security-risks/ #GitHubActions_findy 17
Tips #2: セキュリティ GitHub Actionsセキュリティを考える上での参考情報 • CI/CD の脅威マトリクス rung/threat-matrix-cicd • CI/CDパイプライン上の脅威を MITRE ATT&CK のフレームワークに沿ってまとめたもの 攻撃する目的 個別の攻撃手法 考え方が脅威 の整理に 役立つよ! #GitHubActions_findy 18
Tips #2: セキュリティ セキュリティステップアップ 4つの話題を取り扱います 秘密情報の取り扱い • Org/Repo/Environments • secretsコンテキスト バージョン固定 • pinactの紹介 Attestationの紹介 ワークフローのチェック • Artifact Attestations • ghalint, actionlintの紹介 #GitHubActions_findy 19
Tips #2: セキュリティ 秘密情報の取り扱い • 秘密情報をActionsからsecretsコンテキストで扱う方法 • 範囲が広い方から、Organization、Repository、Environment • secretsを読み取れる範囲の違い • Organization secrets: GitHub Organization上のどのリポジトリの ワークフローからも読める • Repository secrets: リポジトリ上のどのワークフローからも読め る • Environment secrets: branch/tag rulesetsによる制限 + reviewer まで制限をかけられる • GitHubではない場所に保存してOIDCで値を取りに行く • AWS secrets managerの方が高機能 • secretsにアクセスしたログがCloudTrailで取れる • GitHubのsecretsは作成・更新・削除イベントのみ 例: Environment Secrets #GitHubActions_findy 20
Tips #2: セキュリティ actionsの利用バージョンは固定しよう Version部分はgit refなので、action提供者がv1をアプデしたら、同じv1タグでも中身が異なるようになる (通常v1系最新を指す) • suzuki-shunsuke/pinact が便利 • Renovateによるアップデート • 差分の確認も大事 #GitHubActions_findy 21
Tips #2: セキュリティ attestationの紹介 • Artifact Attestationsの紹介 • 生成物(artifact)がどういう過程でビルドされたかを証明できる • ワークフローの実行ログとの紐付けのみを行う • 広く活用されるのはこれからかも 生成物のPath もしくは コンテナイメージ を指定 • homebrew 4.3.0から実験的にbrew install時の検証が可能になった Runner Invocation URIに実行ログが記載される 生成物に対してgh attestation verify で検証可能 #GitHubActions_findy 22
Tips #2: セキュリティ ワークフローのチェック rhysd/actionlint • 静的解析によってワークフローファイルが間違ってないか検査できる • セキュリティ文脈だと • shellcheck integration for `run:`: runに書いているシェルスクリプトをshellcheckで検査 • Script injection by potentially untrusted inputs: script injectionがないか検査 • Hardcoded credentials: サービスコンテナのpassword sectionに直にパスワードを書いていないか検査 suzuki-shunsuke/ghalint • ワークフローファイルがセキュリティ的なルールに従っているか検査できる • action_ref_should_be_full_length_commit_sha: GitHub Actionsのバージョンがfull length commit SHAか検査 #GitHubActions_findy 23
Tips #2: セキュリティ セキュリティまとめ • その状況における脅威を把握しよう • GitHub Actions環境だけ対策すれば良いわけではない • デプロイパイプラインの中で評価を行い、ボトルネックから対策を行うべき • ステップアップ知識 • secretsは3つのレベルがあり、場合によってはAWS等に保存するのも検討 • pinactとRenovateでバージョン固定・バージョンアップ • Artifact Attestationsの紹介 • ghalintとactionlintで静的に解析できる部分は対処しよう #GitHubActions_findy 24
GitHub Actions Tips #3: 設計 小ネタの紹介 ©️ Cybozu, Inc. 25
Tips #3: 設計 reusableとcompositeの違い compositeはstepをまとめたもの reusableはワークフロー単位 • それぞれの制約に応じて選択する • reusableの上限20が結構厳しい #GitHubActions_findy 26
Tips #3: 設計 ワークフローの命名規則を考えよう • .github/ 以下にファイルが増えてきたら... • リポジトリに関わる人たちで合意を取ってファイル名を整理して認知負荷を下げよう • 命名規則の例 • prefixをつける • 頻度: daily-stale-pr.yaml ([daily] Stale PR) • チーム名: hoge-frontend-lint.yaml ([hoge] Frontend Lint) • 規模が小さければピン留めも使える • 5つまで • それ以上はワークフロー名のprefixに `>` をつけたりする 出典: https://github.blog/changelog/2024-04-30-github-actions-ui-improvements/ #GitHubActions_findy 27
Tips #3: 設計 設計まとめ • reusable, compositeは制約に応じて使い分けよう • ワークフローファイルの命名規則を考えて、認知負荷を下げよう #GitHubActions_findy 28
まとめ • GitHub Actionsはデプロイパイプラインの一部なので、課題解決のためには複合的な手法が必要 • GitHub Actions自体で解決できる問題は少ない • が、GitHubの機能やGitHub Actionsの機能で多くの開発者に共通する悩みが解決されているので、自前で用意せ ずに機能を活用して工程をスキップしていこう • 高速化・セキュリティ・設計について、お伝えしたTipsがステップアップの助けになると嬉しいです #GitHubActions_findy 29
参考文献(スライド中に記載してないけど参考にした資料) • CI/CDボトルネックの把握とその先へ - @Kesin11 • 高速化観点 • GitHub Actionsにおける脅威と対策まとめ - @JJ(yuasa) • GitHub Actionsの脅威について • コンパウンドスタートアップのためのスケーラブルでセキュアなInfrastructure as Codeパイプラインを 考える - @Yuya Takeyama • AWS Secrets Managerに秘密情報を寄せる観点 #GitHubActions_findy 30