前回のまとめ
前回は空のアプリケーションでGitHub Actionsを動作させてみました。今回はもう少し実践的にRailsアプリケーションを動作させてみようと思います。
Railsアプリケーションの準備
Railsアプリケーションはこちらで準備しました。
GitHub Actionsの作成
前回GitHub Actionsを作成したように、作成したRailsアプリケーションのリポジトリを選択した状態で、Actionsタブをクリックします。

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

workflowの設定
今回は、workflowでRailsのテストの実行まで行いたいと思います。
トリガー
1 | on: |
トリガーは前回と同じように、masterブランチの更新と、masterブランチへのPullRequest作成(更新)時になっています。
ジョブ
1 | jobs: |
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 | - uses: actions/checkout@v2 |
サービスコンテナの利用
前回、RailsアプリケーションのデータベースとしてMySQLを設定しました。MySQLをランナーマシン上で動かしてもよいのですが、GitHub Actionsではサービスコンテナというものが使えるので使ってみましょう。
サービスコンテナについてはドキュメントがしっかりしていたので、参考になりました。
ランナーマシンがDockerホストのように動作し、その上にコンテナを立ち上げるイメージです。ですので、ランナーマシン上でジョブを実行するときに、サービスコンテナと通信を行うにはlocalhostのポートをマッピングするだけで可能です。ドキュメントにも以下のように記載されています。
ジョブをランナーマシン上で直接実行する場合、サービスコンテナにはlocalhost:
もしくは127.0.0.1: を使ってアクセスできます。 GitHubは、サービスコンテナからDockerホストへの通信を可能にするよう、コンテナネットワークを設定します。
なるほど!簡単ですね!
サービスコンテナの設定でハマる
まず、先ほどのジョブにサービスコンテナを設定します。
1 | services: |
ランナーマシンのローカルポート3306をコンテナの3306にマッピングします。環境変数でrootのパスワードも設定します。
次に、Railsのデータベース接続設定を行います。CI用のdatabase.ymlを作成します。
1 | test: |
これをdatabase.yml.ciとして保存し、ジョブ内でdatabase.ymlにリネームします。
1 | - name: Setup Database |
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 | - name: Setup Database |
この場合は接続可能でした。
しかし、やはりサービスコンテナを利用したいです。
ドキュメントにはlocalhostでも127.0.0.1でもよいと書かれていたので、127.0.0.1を接続先として設定し試してみます。すると、先ほどのConnection Errorは出ず、マイグレーションが行われました。
Railsアプリケーション特有の問題かどうかわかりませんが、localhostではなく127.0.0.1を接続先として指定することで解決しました。
最終版のconfig/database.yml.ciは以下のようになります。
1 | test: |
workflowは以下のようになります。
1 | # This workflow uses actions that are not certified by GitHub. |
まとめ
GitHub ActionsでCIの設定を行ってみました。GitHub Actionsはとても評判の良いCI/CDツールです。コード管理しているプラットフォームで行えるという点がとても良いと思います。今後も積極的に使っていきたいと思います。
次回は今回のようなまっさらなRailsアプリケーションではなく、プロダクション環境で稼働中のRailsアプリケーションでGitHub Actionsを動作させてみたいと思います。
その次くらいにAWS ECSにデプロイする処理を書いてみたいと思います。


