🦓

[Rails]Github Actionsを使ったCI/CD

2023/10/04に公開

はじめに

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

  1. GitHubリポジトリの作成: Github上にリポジトリを作成します。既存のリポジトリを使用する場合次へ。

  2. GitHub Actionsの設定ファイルの作成: リポジトリのルートディレクトリに、GitHub Actionsの設定ファイルである .github/workflows ディレクトリを作成します。その中にYAML形式の設定ファイルを追加します。今回ではGithub Actionsが用意したデフォルトの設定ファイルを使います。

  3. ローカルでの動作確認:ローカル環境でテストとリンターチェックを行い、動作を確認します。

  4. GitHubにプッシュ: 変更をGitHubリポジトリにプッシュし、反映させます。

  5. GitHub Actionsの実行: GitHubにプッシュした後、GitHub Actionsが自動的にCIジョブをトリガーします。ジョブの進行状況と結果はGitHubのActionsタブで確認できます。

Githubリポジトリの作成

scaffoldでCRUDアプリを作成しリポジトリにプッシュしました。

GitHub Actionsの設定ファイルの作成

GitHub Actionsにあるテンプレートファイルを使ってカスタマイズしていきます。

  1. リポジトリ内にあるActionsタブをクリックします。

2. リポジトリの言語によって設定を薦められます。Ruby on Railsのカードをクリックします。

3. サンプル設定ファイルを作成してくれました。

この設定ファイルは、リポジトリのmainブランチに対する pushpull_request イベントに応じて実行されます。

testlint二つのジョブが含まれています。ジョブ内に、namerunのペアで実行するステップの名前と実行するコマンドを定義しています。

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を実行する際のコマンドを指定しています。

https://github.com/rubysec/bundler-audit
https://github.com/presidentbeef/brakeman
https://github.com/rubocop/rubocop

ページの右上にあるCommit Changesをクリックし、コミットメッセージを入力し、変更をコミットします。

ローカルでの動作確認

ローカルリポジトリに移動し、git pullで作成した設定ファイルをローカル環境に反映させます。

gemをインストールする

設定ファイルで指定したgemたちをインストールします。

Gemfile
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