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

GitHub Actionsで泣かないためにやっておきたい設定 / Recommended GHA settings to avoid crying

GitHub Actionsで泣かないためにやっておきたい設定 / Recommended GHA settings to avoid crying

PHPカンファレンス小田原 2024 (2024/04/13)
12:25〜 「ぼこ」会場
https://fortee.jp/phpconodawara-2024/proposal/cef0ab88-5a46-4193-af69-e9e23c414f4b

pinkumohikan

April 12, 2024
Tweet

More Decks by pinkumohikan

Other Decks in Programming

Transcript

  1. ©tete marche CO., LTD. 2 ✔ テテマーチ株式会社 SINIS for X

    テックリード 篠田 北斗 ( @pinkumohikan ) ✔ 社内ブランディング 「定期的に髪色が変わるやべーやつ」 ✔ バックエンド寄りの技術が好き ISUCON毎年参戦中🔥 (去年の戦績の話はNG) 自己紹介
  2. ©tete marche CO., LTD. Index 目次 4 1. GitHub Actionsのおさらい

    2. タイムアウトは必ず設定しよう 3. バージョンは明確に指定しよう 4. VariablesとSecretsを正しく使い分けよう 5. Actionは定期的にバージョンアップしよう 6. CI死んでて仕事出来ません...を無くそう
  3. ©tete marche CO., LTD. 6 • GitHub社が提供するCI/CDサービス ◦ CI/CD =

    システムを高速に開発するためのプラクティス ▪ CI: PullRequestとして最低限の要件を満たしているか自動検査 ▪ CD: デプロイの仕組み化 ◦ 平たく言うと、gitリポジトリへのpushをトリガーに任意のコマンドを実行できる仕組み ◦ 料金モデル: コンピューティング時間に対する従量課金 (無料枠あり) GitHub Actionsとは 👈 PRの下のほうにあるコレ
  4. ©tete marche CO., LTD. 7 GitHub Actionsの仕組み 出典: GitHub Actions

    Deep Dive using PHP / PHPerKaigi 2022 https://speakerdeck.com/k1low/phperkaigi-2022?slide=15
  5. ©tete marche CO., LTD. 8 GitHub Actionsの設定ファイル (Workflowファイル) name: CI

    on: [push] jobs: test: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: '8.3' - run: composer install - run: ./vendor/bin/phpunit workflow
  6. ©tete marche CO., LTD. 9 GitHub Actionsの設定ファイル (Workflowファイル) name: CI

    on: [push] jobs: test: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: '8.3' - run: composer install - run: ./vendor/bin/phpunit event
  7. ©tete marche CO., LTD. 10 GitHub Actionsの設定ファイル (Workflowファイル) name: CI

    on: [push] jobs: test: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: '8.3' - run: composer install - run: ./vendor/bin/phpunit job
  8. ©tete marche CO., LTD. 11 GitHub Actionsの設定ファイル (Workflowファイル) name: CI

    on: [push] jobs: test: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: '8.3' - run: composer install - run: ./vendor/bin/phpunit runner
  9. ©tete marche CO., LTD. 12 GitHub Actionsの設定ファイル (Workflowファイル) name: CI

    on: [push] jobs: test: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: '8.3' - run: composer install - run: ./vendor/bin/phpunit step
  10. ©tete marche CO., LTD. 13 GitHub Actionsの設定ファイル (Workflowファイル) name: CI

    on: [push] jobs: test: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: '8.3' - run: composer install - run: ./vendor/bin/phpunit Action
  11. ©tete marche CO., LTD. 14 GitHub Actionsの設定ファイル (Workflowファイル) name: CI

    on: [push] jobs: test: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - uses: shivammathur/setup-php@v2 with: php-version: '8.3' - run: composer install - run: ./vendor/bin/phpunit Step
  12. ©tete marche CO., LTD. 15 • 開発プロセス中に必ずやりたい作業があるとき ◦ コードのフォーマットチェック、テスト、静的解析、コンパイルが通ることの確認など ◦

    「忘れずにやっといてね」は絶対に漏れる → トラブルを仕組みで防ぐのが大事 • 個人マシンでやりたくないことをやるとき ◦ コンピューティングリソースをめちゃめちゃ食う処理 ◦ デプロイ (機微情報の取り扱い、本番環境への接続) どういうときに便利なのか
  13. ©tete marche CO., LTD. 18 • タイムアウト = 実行時間の上限 ◦

    configで言う timeout-minutes (これを超えると強制終了) ◦ デフォルト: 360分 タイムアウト設定
  14. ©tete marche CO., LTD. 19 • タイムアウト = 実行時間の上限 ◦

    configで言う timeout-minutes (これを超えると強制終了) ◦ デフォルト: 360分 • 設定しておきたい理由: コマンドは稀に “刺さる” ◦ パッケージのインストール、外部API呼び出し、CPU・メモリを食う処理、etc… ◦ GHAは実行時間に対する従量課金なので、刺さったときのダメージを小さくしたい タイムアウト設定
  15. ©tete marche CO., LTD. 20 • タイムアウト = 実行時間の上限 ◦

    configで言う timeout-minutes (これを超えると強制終了) ◦ デフォルト: 360分 • 設定しておきたい理由: コマンドは稀に “刺さる” ◦ パッケージのインストール、外部API呼び出し、CPU・メモリを食う処理、etc… ◦ GHAは実行時間に対する従量課金なので、刺さったときのダメージを小さくしたい タイムアウト設定 デフォルト設定でタイムアウトまで動くと 一撃で無料枠18%消費することになって泣く 😭
  16. ©tete marche CO., LTD. 22 • Runnerや、Actionなど バージョンを指定出来るところがある ◦ commit

    hash → uses: actions/checkout@b4ffde6 ◦ version tag → uses: actions/[email protected] ◦ branch name → uses: actions/checkout@main ◦ latest → uses: actions/checkout@latest バージョンは明確に指定する
  17. ©tete marche CO., LTD. 23 • Runnerや、Actionなど バージョンを指定出来るところがある ◦ commit

    hash → uses: actions/checkout@b4ffde6 ◦ version tag → uses: actions/[email protected] ◦ branch name → uses: actions/checkout@main ◦ latest → uses: actions/checkout@latest バージョンは明確に指定する 👍 👍 😥 😥
  18. ©tete marche CO., LTD. 24 • Runnerや、Actionなど バージョンを指定出来るところがある ◦ commit

    hash → uses: actions/checkout@b4ffde6 ◦ version tag → uses: actions/[email protected] ◦ branch name → uses: actions/checkout@main ◦ latest → uses: actions/checkout@latest • 明確に設定したい理由: CIは安定していることが超重要 ◦ 「知らないうちにCIが動かなくなっていた...」では困る ◦ 自分の知らないコードが動きうる状況はセキュリティリスク ▪ セキュリティポリシーが厳しいところではcommit hash指定 & リスクアセスメント必須 バージョンは明確に指定する 👍 👍 😥 😥
  19. ©tete marche CO., LTD. 25 • Runnerや、Actionなど バージョンを指定出来るところがある ◦ commit

    hash → uses: actions/checkout@b4ffde6 ◦ version tag → uses: actions/[email protected] ◦ branch name → uses: actions/checkout@main ◦ latest → uses: actions/checkout@latest • 明確に設定したい理由: CIは安定していることが超重要 ◦ 「知らないうちにCIが動かなくなっていた...」では困る ◦ 自分の知らないコードが動きうる状況はセキュリティリスク ▪ セキュリティポリシーが厳しいところではcommit hash指定 & リスクアセスメント必須 バージョンは明確に指定する 👍 👍 😥 😥 バージョン指定 latest だと 「何もしてないのに壊れました」で泣く 😭
  20. ©tete marche CO., LTD. 27 • GHAに値を登録してjob中で使うところは似ているが、これらは別物 ◦ Variables =

    いわゆる環境変数。環境ごとに変わる値。平文で保存される。 ◦ Secrets = いわゆる機微情報。ID/Pass、アクセストークンなど。暗号化して保存される。 VariablesとSecretsを正しく使い分ける
  21. ©tete marche CO., LTD. 28 • GHAに値を登録してjob中で使うところは似ているが、これらは別物 ◦ Variables =

    いわゆる環境変数。環境ごとに変わる値。平文で保存される。 ◦ Secrets = いわゆる機微情報。ID/Pass、アクセストークンなど。暗号化して保存される。 • 使い分けたい理由: セキュリティと設定を確認しやすくするため ◦ 外部APIのアクセストークンなど、他の開発者にも見られたくない情報がある ◦ 手元などで上手く動かないときなど、CI設定を参考にしたいことがある VariablesとSecretsを正しく使い分ける
  22. ©tete marche CO., LTD. 29 • GHAに値を登録してjob中で使うところは似ているが、これらは別物 ◦ Variables =

    いわゆる環境変数。環境ごとに変わる値。平文で保存される。 ◦ Secrets = いわゆる機微情報。ID/Pass、アクセストークンなど。暗号化して保存される。 • 使い分けたい理由: セキュリティと設定を確認しやすくするため ◦ 外部APIのアクセストークンなど、他の開発者にも見られたくない情報がある ◦ 手元などで上手く動かないときなど、CI設定を参考にしたいことがある VariablesとSecretsを正しく使い分ける 機微情報が他開発者に見えちゃうのは問題 見えて良い情報がマスクされてて見えないのも不便 😭
  23. ©tete marche CO., LTD. 31 • Action = 良くやるコマンドをまとめたもの (アプリで言うライブラリ)

    ◦ actions/checkout actions/cache shivammathur/setup-php とか ◦ GitHubも公開しているし、有志によるOSSもあるし、自分専用も作れる ◦ ActionのバージョンアップはDependabotを使って半自動化可能 Actionは定期的にバージョンアップしよう
  24. ©tete marche CO., LTD. 32 • Action = 良くやるコマンドをまとめたもの (アプリで言うライブラリ)

    ◦ actions/checkout actions/cache shivammathur/setup-php とか ◦ GitHubも公開しているし、有志によるOSSもあるし、自分専用も作れる ◦ ActionのバージョンアップはDependabotを使って半自動化可能 • バージョンアップするべき理由: 基本的に最新verしか保守されない • 考え方はライブラリのバージョンアップと同じ ◦ 新しければ高機能、高性能。旧バージョンを使うことは逆で、セキュリティリスクでもある。 ◦ やらずに貯めるとビッグバンバージョンアップで全然動かなくて血を吐く Actionは定期的にバージョンアップしよう
  25. ©tete marche CO., LTD. 33 • Action = 良くやるコマンドをまとめたもの (アプリで言うライブラリ)

    ◦ actions/checkout actions/cache shivammathur/setup-php とか ◦ GitHubも公開しているし、有志によるOSSもあるし、自分専用も作れる ◦ ActionのバージョンアップはDependabotを使って半自動化可能 • バージョンアップするべき理由: 基本的に最新verしか保守されない • 考え方はライブラリのバージョンアップと同じ ◦ 新しければ高機能、高性能。旧バージョンを使うことはセキュリティリスク。 ◦ やらずに貯めるとビッグバンバージョンアップで全然動かなくて痛い目を見る ◦ バージョンアップはDependabot等を使って省力化可能 Actionは定期的にバージョンアップしよう 必要に迫られてからのビッグバン対応は 期日と障害リスクの板挟みで泣く 😭
  26. ©tete marche CO., LTD. 35 • GHAを含むXaaSは稀に良く落ちる ◦ それだけに頼っていると「いざ」というときに貰い死にする ◦

    「CIが調子悪いので今は開発できません」を何度も言っていると信頼を失う CI死んでて仕事出来ません...を無くそう
  27. ©tete marche CO., LTD. 36 • GHAを含むXaaSは稀に良く落ちる ◦ それだけに頼っていると「いざ」というときに貰い死にする ◦

    「CIが調子悪いので今は開発できません」を何度も言っていると信頼を失う • じゃあどうすりゃええねん → ローカルでも動かせる状態にする ◦ 例えば... ▪ 環境構築やテストコマンドをshell scriptやMakefileにまとめ、それを呼び出す形にする ▪ GHA Workflowを手元で動かす仕組み (actなど) を整えておく ◦ ローカルで動かせるとCI/CD設定変更のデバッグもやりやすい ◦ ポータブルな状態を保てていれば、他のCI/CDサービスへの移行もしやすい CI死んでて仕事出来ません...を無くそう
  28. ©tete marche CO., LTD. 37 • GHAを含むXaaSは稀に良く落ちる ◦ それだけに頼っていると「いざ」というときに貰い死にする ◦

    「CIが調子悪いので今は開発できません」を何度も言っていると信頼を失う • じゃあどうすりゃええねん → ローカルでも動かせる状態を目指す ◦ 例えば... ▪ 環境構築やテストコマンドをshell scriptやMakefileにまとめ、それを呼び出す形にする ▪ actなど、GHA workflowを手元で動かす仕組みを整えておく ◦ ローカルで動かせるとCI/CD設定変更のデバッグもやりやすい ◦ ポータブルな状態を保てていれば、他のCI/CDサービスへの移行もしやすい CI死んでて仕事出来ません...を無くそう 何もやってないと「落ちることは分かっているのに 何で対策してないんですか?」って詰められて泣く 😭
  29. ©tete marche CO., LTD. 39 • タイムアウトは必ず設定しておく • バージョンは明確に指定する •

    VariablesとSecretsを正しく使い分ける • Actionを定期的にバージョンアップする • CI死んでて仕事出来ません...を無くす まとめ
  30. ©tete marche CO., LTD. 40 • GitHub Actions documentation (GitHub)

    • GitHub Actions Workflow チェックリスト (CyberAgent Developers Blog) • CI/CD とは -継続的インテグレーション/継続的デリバリー (Red Hat) • GitHub Actions Deep Dive using PHP / PHPerKaigi 2022 (k1LoW) 参考文献