初めてGitHub Actionsを使ってRailsのRSpecを自動化したときの備忘録

 GitHub Actionsでpushをトリガーにrailsのrspecを起動させるコードを初めて作成したときの記録です。色々エラーが発生したので、メモしました。

## GitHub Actionsコード
```
name: Run RSpec

on:
  push:

jobs:
  rspec:
    name: RSpec Tests
    runs-on: ubuntu-latest

    services:
      mysql:
        image: mysql:8.0.31
        ports:
          - 3306:3306
        env:
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
        options: --health-cmd "mysqladmin ping" --health-interval 10s --health-timeout 5s --health-retries 10

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3.1.3
          bundler-cache: true

      - name: Set up Node.js (for Rails assets)
        uses: actions/setup-node@v2
        with:
          node-version: '14'

      - name: Bundler and gem install
        run: |
          gem install bundler
          bundle install --jobs 4 --retry 3 --path vendor/bundle

      - name: Database setup and migrate
        run: |
          cp config/database.yml.ci config/database.yml
          bundle exec rails db:create RAILS_ENV=test
          bundle exec rails db:migrate RAILS_ENV=test

      - name: Run rspec
        run: bundle exec rspec

```
上記のコードをgit push origin <ブランチ名>のコマンドでプルリクエストを実行したところ、以下のエラーが発生。
```
Your bundle only supports platforms ["x86_64-darwin-22", "x86_64-linux-musl"]
but your local platform is x86_64-linux. Add the current platform to the
lockfile with
`bundle lock --add-platform x86_64-linux` and try again.
Error: The process '/opt/hostedtoolcache/Ruby/3.1.3/x64/bin/bundle' failed with exit code 16
```



エラーはGemfile.lockに指定されているプラットフォームがGitHub Actionsが動作しているプラットフォーム（この場合x86_64-linux）と一致していないことを示しているようです。



## 対処
Gemfile.lockにx86_64-linuxプラットフォームを追加します。
（ちなみに私のGemfile.lockにはx86_64-linuxプラットフォームはありませんでした）。
私の環境ではDockerコンテナで作業しているので、以下のコマンドを入力していきます。

1.コンテナ内でshを起動します。

```
docker-compose exec api sh
```
(apiの部分はご自身の環境によって変わります)。
上記コマンドを入力したらエンターキーを押す。

2.コンテナ内で、Gemfile.lockにx86_64-linuxプラットフォームを追加します。

上記1でエンターキーを押すと、以下の/app #が表示されるので、
#の後に、bundle lock --add-platform x86_64-linuxを入力し、エンターキーを押す。
```
/app #
```
3．コンテナを終了します。
exitを入力し、エンターキーを押す。
```
exit
```
4.エラーの対処はできたので、変更をステージングし、コミットします。
```
git add Gemfile.lock
git commit -m "Add x86_64-linux platform to Gemfile.lock"
```
5.修正をリモートリポジトリにpushします。
```
git push origin <ブランチ名>
```


先ほどのエラーは解消されましたが、今度はdatabase sestup and migrateの方で以下のエラーになりました。
```
cp: cannot stat 'config/database.yml.ci': No such file or directory
Error: Process completed with exit code 1.
```


エラーメッセージは、config/database.yml.ciのファイルが存在していないと言っています。

## 対処
1.config/database.yml.ciのファイルを作成し、CI/CD環境で使用するデータベース接続設定を記述します。
```
test:
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: 127.0.0.1
  database: <データベース名>_test
```

2.記述が完了したら、以下コマンドを実行
```
git add config//database.yml.ci
git commit -m "Add database.yml.ci for CI/CD environment"
git push origin <ブランチ名>
```

以上で、私の環境ではpushイベントのたび、rspecが起動するようになりました。

## その他試したこと

コンテナ内でshではなくbashで起動したらどうなるか試してみました。

```
docker-compose exec api bash
```
すると、以下のようになりました。

```
OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown
```
bashシェルがそのコンテナイメージ内に存在しないか、またはPATH内にないことを示しています。ですので、docker-compose exec shを実行しました。