駆け出しエンジニアの気ままブログ

気になったことについて、調べながら投稿するブログです。

バックエンド(Rails)のGIthubActionsのCI構築

今回の概要

前回書いた、フロントサイドのバックエンドバージョンです。

前回の記事はこちら

使用技術

jobsの設定

今回の記事は、nameonの説明は省略させていただきます。前回の記事を御覧ください。

今回のつまづきポイント

何故かconfig/database.ymlで指定できない…

今回は、Dockerを使っていることもあり、Dockerと紐付けられるように下記のように書いてあります。

databese.yml

test:
  <<: *default
  database: myapp_test
  host: db_test

こちらをしてすれば良いと思い、ci.ymlに同じhostとdatabaseを指定して書いたものの、エラーが発生し、解決できませんでした。

そのため、test用のymlファイルconfig/database.yml.ciを新たに作成して、こちらをDBとして見るようにして、migrationを実施しました…

全体的な流れは、

  • DBを指定。今回は、MySQL
    • アクセスできるようにMYSQL_ALLOW_EMPTY_PASSWORD: "yes"を追加。普通にパスワード書いても良い(config/database.ymlに書くように)
  • Rubyのセットアップ
    • ruby-versionを指定
  • migrationの実施
    • こちらがconfig/database.ymlconfig/database.yml.ciをコピーするという1行を追加した。
    • 他は、ローカルと同様にcreatemigrateを実施
  • 実行する中身
    • RspecとRubocopを実行する

完成形

ci.yml

name: Rails-ci

on:
  push:
    branches:
      - "**"

jobs:
  Rspec_Rubocop:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    env:
      RAILS_ENV: test
    
    services:
      db:
        image: mysql
        ports:
          - 3306:3306
        env:
          LANG: "ja_JP.UTF-8"
          MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
        options: >-
          --health-cmd "mysqladmin ping"
          --health-interval 10s 
          --health-timeout 5s 
          --health-retries 10

    steps:
      # 該当ブランチをcheckout
      - name: Checkout code
        uses: actions/checkout@v2
      
      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3.2.0
          bundler-cache: true

      # migrationの実施
      - name: DB migration
        run: |
          cp config/database.yml.ci config/database.yml
          bundle exec rails db:create
          bundle exec rails db:migrate

      # RSpec
      - name: Run Rspec
        run: bundle exec rspec
      
      # Rubocop
      - name: Run Rubocop
        run: bundle exec rubocop

config/database.yml.ci

test:
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: 127.0.0.1
  database: myapp_test

未だに、なぜdatabase.ymlを直接見てくれないのかわからないので、原因調査しています!

注意点

駆け出しエンジニアです。日々の業務や学習から、気になったことをアウトプットしています。

まだ、理解できていない点も多く、間違えている点が多々あるかと思います。

その時は、ご指摘いただけると助かります。よろしくお願いします。