[Rails]Github Actionsを使ったCI/CD
はじめに
RailsアプリにGithub Actionsを使ってCI/CDを導入してみました。
今回ではGithub Actionsが用意してくれてる設定ファイルを使い、コードの変更がリポジトリにプッシュされた際に自動的にテストとリンターチェックが実行されるように設定していきます。
Github Actions
GitHub Actionsは、GitHubが提供する継続的インテグレーションと継続的デプロイメント(CI/CD)プラットフォームです。GitHub Actionsを使用すると、アプリ開発に関連するワークフローやタスクを、GitHubリポジトリ内で直接自動化できます。
1. ワークフローの自動化:YAMLファイルを使ってワークフローをコードとして定義できます。コードのプッシュ、PR、またはイシューコメントなどのイベントに応答した実行を含めることができます。
2. ビルドとテスト:ユニットテスト、統合テスト、およびリンターチェックなどを設定できます。
3. 継続的インテグレーション(CI):新しいコードがプッシュされるたびにテストやチェックを実行して、コードが動作する状態に保ちます。
4. 継続的デプロイメント(CD):アプリのデプロイをさまざまなホスティング環境に自動化できます。
CI/CDを導入したワークフローの例として上げられます。
tl;dr
-
GitHubリポジトリの作成: Github上にリポジトリを作成します。既存のリポジトリを使用する場合次へ。
-
GitHub Actionsの設定ファイルの作成: リポジトリのルートディレクトリに、GitHub Actionsの設定ファイルである
.github/workflows
ディレクトリを作成します。その中にYAML形式の設定ファイルを追加します。今回ではGithub Actionsが用意したデフォルトの設定ファイルを使います。 -
ローカルでの動作確認:ローカル環境でテストとリンターチェックを行い、動作を確認します。
-
GitHubにプッシュ: 変更をGitHubリポジトリにプッシュし、反映させます。
-
GitHub Actionsの実行: GitHubにプッシュした後、GitHub Actionsが自動的にCIジョブをトリガーします。ジョブの進行状況と結果はGitHubのActionsタブで確認できます。
Githubリポジトリの作成
scaffoldでCRUDアプリを作成しリポジトリにプッシュしました。
GitHub Actionsの設定ファイルの作成
GitHub Actionsにあるテンプレートファイルを使ってカスタマイズしていきます。
- リポジトリ内にある
Actions
タブをクリックします。
2. リポジトリの言語によって設定を薦められます。Ruby on Rails
のカードをクリックします。
3. サンプル設定ファイルを作成してくれました。
この設定ファイルは、リポジトリのmain
ブランチに対する push
と pull_request
イベントに応じて実行されます。
test
とlint
二つのジョブが含まれています。ジョブ内に、name
とrun
のペアで実行するステップの名前と実行するコマンドを定義しています。
test
ジョブでは、PostgreSQLがセットアップされています。これにより、テストが実行される際に設定された環境変数を用いてDBを利用できます。
test
ジョブ: コードのチェックアウト、Rubyと必要なGemのセットアップ、データベーススキーマのセットアップとテストの実行が含まれています。
lint
ジョブ: コードのチェックアウト、Rubyと必要なGemのセットアップ、依存関係のセキュリティ監査、コードのセキュリティチェック(Brakeman
)とRubyファイルのリント(RuboCop
)が含まれています。
52行目以後にある実行コマンドを以下のように修正します。
# Add or replace any other lints here
- name: Security audit dependencies
run: bundle exec bundle audit --update
- name: Security audit application code
run: bundle exec brakeman -q -w2
- name: Lint Ruby files
run: bundle exec rubocop --parallel
dependeciesを監視するgem、アプリの変更を監視するgemとリンターチェックのgemを実行する際のコマンドを指定しています。
ページの右上にあるCommit Changes
をクリックし、コミットメッセージを入力し、変更をコミットします。
ローカルでの動作確認
ローカルリポジトリに移動し、git pull
で作成した設定ファイルをローカル環境に反映させます。
gemをインストールする
設定ファイルで指定したgemたちをインストールします。
group :development, :test do
gem 'brakeman'
gem 'bundler-audit'
gem 'pg'
gem 'rubocop-rails'
gem 'rubocop'
end
bundle install
rubocop
bundle exec rubocop --auto-gen-config
このコマンドは、RuboCopを使用して、アプリのコードの静的解析に基づいて自動的にスタイルガイドの設定ファイルを生成するためのコマンドです。
生成された設定ファイルは.rubocop_todo.yml
という名前のファイルに保存されました。
リンターチェックに通ったことを確認します。
bundle exec rubocop
Inspecting 44 files
.................................
44 files inspected, no offenses detected
テスト
rails test
Running 7 tests in a single process (parallelization threshold is 50)
Run options: --seed 52243
# Running:
.......
Finished in 0.593878s, 11.7869 runs/s, 15.1546 assertions/s.
7 runs, 9 assertions, 0 failures, 0 errors, 0 skips
ここで一度変更をコミットし、githubにプッシュします。
Actions
タブに移動し、CIが実行されていることを確認します。
ローカルでテストとリンターチェックに通ったのでCIが成功しました。
ジョブをクリックし、設定ファイル通りに動いてることが確認できます。
失敗した場合、エラーが出るので、
エラーの修正→コミット・プッシュ→CI/CDの実行の繰り返しになります。
終わりに
簡単ですがGithub ActionsのCI/CDを使ってました。
コードがプッシュされる度に設定したジョブが自動的に実行してくれるところが便利でした!
他のジョブも試してみたいと思います。
Discussion