はじめに
GitHub Actions を利用した CI/CD パイプラインの設定では、効率的なジョブトリガーの設計が重要です。
特に、main
ブランチへのすべてのプッシュでワークフローをトリガーする設定では、不要なジョブが実行され、リソースの浪費や実行時間の増加につながることがあります。
本記事では、特定のファイルやディレクトリに変更があった場合のみワークフローをトリガーする方法を中心に、無駄を省き、効率的な運用を実現するための設定方法について解説します。
少し困っていたこと
以下の設定では、main
ブランチに対するすべての変更(ファイルの種類や内容に関係なく)でワークフローがトリガーされます。
on:
push:
branches:
- main
そのため、不要なトリガーが発生し、この先、ちょっとした変更を加えただけで、全てが実行されて少しだけストレスでした
問題点:全ての変更でトリガーされる
この設定では、main
ブランチに対するすべての変更(ファイルの種類や内容に関係なく)でワークフローがトリガーされます。その結果、以下の問題が発生する可能性があります:
問題点
-
非効率なリソース消費
- 不必要なジョブ実行により、GitHub Actions の実行時間や料金が浪費されます。
-
無関係な変更でも実行される
- 例えば、ドキュメントやREADMEファイルの変更でもジョブが実行され、効率が低下します。
-
ジョブの実行が遅くなる
- 不要な実行が増え、並列実行数の制限に達することで、重要なジョブの実行が遅れる可能性があります。
-
ビルド・デプロイの無駄
- アプリケーションに関係のない変更(例: ドキュメント更新など)でもDockerイメージのビルドやECRへのプッシュが行われ、無駄なリソース利用が発生します。
変更前の.github/workflows/main.ymlのファイルについて
name: Push to ECR
on:
push:
branches:
- main
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
# リポジトリのクローン
- name: Checkout code
uses: actions/checkout@v3
・・・(省略)
-
設定内容
main
ブランチへのすべてのプッシュイベントでワークフローがトリガーされる設定。 -
動作
ファイルの種類や内容に関係なく、すべての変更でジョブが実行される。
変更後の.github/workflows/main.ymlのファイルについて
name: Push to ECR
on:
push:
branches:
- main
paths:
- '**/*.go' # Goファイルに変更があった場合のみ実行
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
# リポジトリのクローン
- name: Checkout code
uses: actions/checkout@v3
・・・(省略)
-
paths
オプションの追加
特定のファイルパターン(**/*.go
)が指定されました。 -
動作の変更
main
ブランチへのプッシュ時に Goファイル(.go
) に変更がある場合のみワークフローがトリガーされるようになりました。
変更後の設定について
上記のように変更する前は、テスト用のHTMLファイルを作成すると、すべての場合でGitHub Actionsがトリガーされていました。
しかし、今回の設定変更によって、main.go
ファイルの変更時のみGitHub Actionsがトリガーされるようになり、正しく設定が反映されていることを確認できました。
まとめ
ここまでお読みいただき、ありがとうございました!今回の実装は簡単でしたが、このような細かい配慮が非常に重要であると改めて実感しました。
インフラのコード化に向けた第一歩として、非常に重要なポイントです。この内容をまとめることで、より深い理解を得ることができました。
この記事が、誰かの技術的な支えになれば嬉しいです!