継続的インテグレーション(CI)とは
ソフトウェアの開発においてコードを頻繁に共有リポジトリにコミットする手法。
コードをリポジトリにコミットする際に、コミットによってエラーが発生しないように、
コードのビルドとテスト(コードの文法/フォーマットチェック、セキュリティチェック、コード網羅率、機能テスト、その他のカスタムチェック)を継続的に行うことができる。
コードをビルドしてテストするためには、サーバーが必要で、ローカルでアップデートのビルドとテストを行ってからコードをリポジトリにプッシュする方法や、リポジトリでの新しいコードのコミットをチェックするCIサーバーを使う方法がある。
コミット頻度が高いほどエラーの検出が早くなり、エラー原因を探すためのデバッグの必要性も減る。他のメンバーによる変更をマージするのも容易になる。
※ CI (Continuous Integration)
GitHub Actions
Githubリポジトリでのイベントを検知してワークフローを実行できる仕組み。
ワークフローは、1つまたは複数のジョブから構成される。
1つのリポジトリに複数のワークフローを作成可能。
リポジトリの.github/workflows配下にYAML形式で保存する。
GitHub Actionsを使用した継続的インテグレーション(CI)
GitHub Actionsを利用したCIでは、リポジトリ中のコードをビルドしてテストを実行する
ワークフローが利用できる。
CIワークフローは、下記の3つのタイミングで実行されるように設定が可能。
● GitHubイベント(新しいコードがリポジトリにプッシュされた)時などに実行する
● 設定したスケジュール(cron形式)で記述し、定期実行する
● リポジトリディスパッチwebhookを使用して、外部イベントが発生する時に実行する
GitHubは、CIテストを実行すると各テストの結果をプルリクエストで提供するため、
ブランチでの変更によってエラーが生じたかどうかを確認できる。
ワークフローのテストがすべて成功すると、プッシュした変更をチームメンバーがレビュー、またはマージできるようになる。
テストだけではなく、アクションを使用してプロジェクトをデプロイ、パッケージ、またはリリースすることも可能。
Laravelのテスト実行ワークフローの雛形を読んでみる
# ワークフロー名name:Laravel# on:ワークフローの実行タイミングon:# プッシュもしくはプルリクエストでワークフローを起動する# ただしmasterブランチに対してのみpush:branches:[master]pull_request:branches:[master]jobs:# ジョブの名前laravel-tests:# このジョブが実行される仮想環境runs-on:ubuntu-latest# ジョブ内で実行されるステップsteps:# リポジトリからのチェックアウトを行う-uses:actions/checkout@v2# .envが存在していない場合、.env.exampleファイルを.envにコピーする-name:Copy .envrun:php -r "file_exists('.env') || copy('.env.example', '.env');"# composer.jsonを読み込んで依存するパッケージをvendorディレクトリにインストール# -q(メッセージを表示しない) --no-ansi(ANSIカラーにしない) --no-interaction(インタラクティブな質問の問い合わせをしない)# --no-scripts(composer.jsonで指定されたスクリプトを実行しない) --no-suggest(推奨パッケージを出力しない)# --no-progress(ダウンロードの進行状況を表示しない) --prefer-dist(ダウンロード方法:安定版) -name:Install Dependenciesrun:composer install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist# .envのAPP_KEYの生成-name:Generate keyrun:php artisan key:generate-name:Directory Permissionsrun:chmod -R 777 storage bootstrap/cache# databaseディレクトリが無ければ作成、その中にテストDB(database.sqlite)を作成-name:Create Databaserun:|mkdir -p databasetouch database/database.sqlite-name:Execute tests (Unit and Feature tests) via PHPUnit# 既存の.envのキーの値の変更env:DB_CONNECTION:sqliteDB_DATABASE:database/database.sqlite# PHPUnitテスト実行run:vendor/bin/phpunit