RailsアプリケーションでGitHub Actionsを試す

前回のまとめ

前回は空のアプリケーションでGitHub Actionsを動作させてみました。今回はもう少し実践的にRailsアプリケーションを動作させてみようと思います。

Railsアプリケーションの準備

Railsアプリケーションはこちらで準備しました。

GitHub Actionsの作成

前回GitHub Actionsを作成したように、作成したRailsアプリケーションのリポジトリを選択した状態で、Actionsタブをクリックします。

RailsアプリケーションのGitHub Action template

Rails用はないようです。とりあえずSet up this workflowをクリックして雛形を作成します。

Railsアプリケーションのworkflow

workflowの設定

今回は、workflowでRailsのテストの実行まで行いたいと思います。

トリガー

1
2
3
4
5
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]

トリガーは前回と同じように、masterブランチの更新と、masterブランチへのPullRequest作成(更新)時になっています。

ジョブ

1
2
3
jobs:
test:
runs-on: ubuntu-latest

testというジョブが予め作成されています。ランナーマシンはubuntu-latestです。

Rubyのインストール

前回のRailsアプリケーションの作成ではRubyの現時点での最新版を指定しました。が、workflowでは初期値2.6を指定しており、一致しておらず、Your Ruby version is 2.6.6, but your Gemfile specified 2.7.1というエラーが出ます。ですので、workflowのRubyバージョン指定を2.7.1に変更します。

1
2
3
4
5
6
7
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@ec106b438a1ff6ff109590de34ddc62c540232e0
with:
ruby-version: 2.7.1
- name: Install dependencies
run: bundle install

サービスコンテナの利用

前回、RailsアプリケーションのデータベースとしてMySQLを設定しました。MySQLをランナーマシン上で動かしてもよいのですが、GitHub Actionsではサービスコンテナというものが使えるので使ってみましょう。

サービスコンテナについてはドキュメントがしっかりしていたので、参考になりました。

ランナーマシンがDockerホストのように動作し、その上にコンテナを立ち上げるイメージです。ですので、ランナーマシン上でジョブを実行するときに、サービスコンテナと通信を行うにはlocalhostのポートをマッピングするだけで可能です。ドキュメントにも以下のように記載されています。

ジョブをランナーマシン上で直接実行する場合、サービスコンテナにはlocalhost:もしくは127.0.0.1:を使ってアクセスできます。 GitHubは、サービスコンテナからDockerホストへの通信を可能にするよう、コンテナネットワークを設定します。

なるほど!簡単ですね!

サービスコンテナの設定でハマる

まず、先ほどのジョブにサービスコンテナを設定します。

1
2
3
4
5
6
7
services:
mysql:
image: mysql:5.6
ports:
- 3306:3306
env:
MYSQL_ROOT_PASSWORD: root

ランナーマシンのローカルポート3306をコンテナの3306にマッピングします。環境変数でrootのパスワードも設定します。

次に、Railsのデータベース接続設定を行います。CI用のdatabase.ymlを作成します。

1
2
3
4
5
6
7
8
9
test:
adapter: mysql2
encoding: utf8
collation: utf8_general_ci
username: root
password: root
host: localhost
database: github_actions_for_rails_test
reconnect: false

これをdatabase.yml.ciとして保存し、ジョブ内でdatabase.ymlにリネームします。

1
2
3
4
5
6
7
- name: Setup Database
env:
RAILS_ENV: test
run: |
cp config/database.yml.ci config/database.yml
./bin/rails db:create
./bin/rails db:migrate

masterへのPullRequestを作成し、workflowの動作確認を行うと、以下のようなエラーが表示されました。

1
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

MySQLへの接続に失敗しているようです。ランナーマシンのlocalhost:3306をmysqlコンテナの3306にマッピングしているので問題なさそうです…

原因がわからないので、一度サービスコンテナを使わずにランナーマシンにインストールされているMySQLを起動してみます。

サービスコンテナの記述を削除し、Setup Databaseを以下のように書き換えます。

1
2
3
4
5
6
7
8
- name: Setup Database
env:
RAILS_ENV: test
run: |
sudo systemctl start mysql
cp config/database.yml.ci config/database.yml
./bin/rails db:create
./bin/rails db:migrate

この場合は接続可能でした。
しかし、やはりサービスコンテナを利用したいです。

ドキュメントにはlocalhostでも127.0.0.1でもよいと書かれていたので、127.0.0.1を接続先として設定し試してみます。すると、先ほどのConnection Errorは出ず、マイグレーションが行われました。

Railsアプリケーション特有の問題かどうかわかりませんが、localhostではなく127.0.0.1を接続先として指定することで解決しました。

最終版のconfig/database.yml.ciは以下のようになります。

1
2
3
4
5
6
7
8
9
test:
adapter: mysql2
encoding: utf8
collation: utf8_general_ci
username: root
password: root
host: 127.0.0.1
database: github_actions_for_rails_test
reconnect: false

workflowは以下のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby

name: Ruby

on:
push:
branches: [ master ]
pull_request:
branches: [ master ]

jobs:
test:

runs-on: ubuntu-latest
services:
mysql:
image: mysql:5.6
ports:
- 3306:3306
env:
MYSQL_ROOT_PASSWORD: root

steps:
- uses: actions/checkout@v2
- name: Set up Ruby
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
# change this to (see https://github.com/ruby/setup-ruby#versioning):
# uses: ruby/setup-ruby@v1
uses: ruby/setup-ruby@ec106b438a1ff6ff109590de34ddc62c540232e0
with:
ruby-version: 2.7.1

- name: Setup Database
env:
RAILS_ENV: test
run: |
cp config/database.yml.ci config/database.yml
./bin/rails db:create
./bin/rails db:migrate
- name: Run tests
run: ./bin/rails test

まとめ

GitHub ActionsでCIの設定を行ってみました。GitHub Actionsはとても評判の良いCI/CDツールです。コード管理しているプラットフォームで行えるという点がとても良いと思います。今後も積極的に使っていきたいと思います。

次回は今回のようなまっさらなRailsアプリケーションではなく、プロダクション環境で稼働中のRailsアプリケーションでGitHub Actionsを動作させてみたいと思います。

その次くらいにAWS ECSにデプロイする処理を書いてみたいと思います。