71
81

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Rails】GithubとCircleCIを連携してcommit時にrspecとrubocopを動かす

Last updated at Posted at 2019-01-14

概要

  • 表題まま
  • CircleCIとGithubを連携
  • rspecとrubocopのインストール
  • CircleCIでrspecとrubocopを動かすための設定

前提

  • githubのアカウントをもっていること
  • 既にrailsのプロジェクトがあること
    • Postgresqlをつかった例を説明します
    • Mysqlの場合は適宜読みかえてください。

手順

CircleCIとGithubを連携

こちらを参考に。GitHubのアカウントを既に持っていればポチポチするだけです。

rspecとrubocopのインストール

  • rubocopは静的にコードを解析してくれるのと、コードの整形も見てくれます。また、今回は説明しませんが、 rubocop -a と書くとrubocopの設定に従って整形をしてくれます。
  • rspec はrailsのテスト環境です。 rails用のは rspec-railsです。

まずはインストールします。Gemfileに以下を追加します。

group :development, :test do
  gem 'rspec-rails'
  gem 'rubocop'
end

bundle installします。

bundle install

次に rspec-railsのセットアップ

rails generate rspec:install

rubocopに必須のセットアップは、特にないです。ただ、 .rubocop.yml は必須です。もし、迷うなら、 railsの .rubocop.yml をコピペ or 参考に作るといいです。

なお、自分のは以下の通りです。

.rubocop.yml
AllCops:
  Exclude:
    - "tmp/**/*"
    - "config/initializers/*"
    - "vendor/**/*"
    - "db/schema.rb"
    - "node_modules/**/*"
    - "db/migrate/*.rb"
    - "bin/*"
  DisplayCopNames: true
  TargetRubyVersion: 2.6.0

Rails:
  Enabled: true

Style/AndOr:
  EnforcedStyle: conditionals

Style/AsciiComments:
  Enabled: false

Style/Documentation:
  Enabled: false

Style/NumericLiterals:
  Enabled: false

Style/ClassAndModuleChildren:
  Enabled: false

Bundler/OrderedGems:
  Enabled: false

Lint/ShadowedException:
  Enabled: false

CircleCIでrspecとrubocopを動かすための設定

CircleCIとGithubを連携 の時点でgithubにcommitと同時にCircleCIのjobが走るようになっています。ただ、当然ながら何もしてないので、 失敗します。(failしましたのメールがgithubのアカウントのメールアドレスに届いているはず)
正常にrspecとrubocopを動かすためには .circleci/config.yml を新規追加/編集します。

CircleCI公式のrailsの例はこちらにあります。

で、最終的に使っているのは以下の通り。

config.yml
# Ruby CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
#
version: 2
jobs:
  rubocop:
    docker:
      - image: circleci/ruby:2.6.0-node-browsers-legacy
        environment:
          RAILS_ENV: test
          POSTGRES_HOST: 127.0.0.1
      - image: circleci/postgres:9.4
        environment:
          POSTGRES_USER: postgres
          POSTGRES_DB: app_test
    working_directory: ~/repo
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-
      - run: bundle install --jobs=4 --retry=3 --path vendor/bundle
      - run: yarn install
      - save_cache:
          paths:
            - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}
      # Rubocop
      - run:
          name: Rubocop
          command: bundle exec rubocop

  rspec:
    docker:
      - image: circleci/ruby:2.6.0-node-browsers-legacy
        environment:
          RAILS_ENV: test
          POSTGRES_HOST: 127.0.0.1
      - image: circleci/postgres:9.4
        environment:
          POSTGRES_USER: postgres
          POSTGRES_DB: app_test
    working_directory: ~/repo
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-
      - run: bundle install --jobs=4 --retry=3 --path vendor/bundle
      - run: yarn install
      - save_cache:
          paths:
            - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}
      - run: bundle exec rake db:create
      - run: bundle exec rake db:schema:load
      # Rspec
      - run:
          name: Rspec
          command: bundle exec rspec

workflows:
  version: 2
  rubocop_rspec:
    jobs:
      - rubocop
      - rspec:
          requires:
            - rubocop

まずimageを、 CircleCIのdocker hubからえらびます。
今回は2.6.0を使いました。
imageの環境変数は environment key で指定しました

Service container image available at host: localhost とあるので、 hostには、 127.0.0.1 と指定します。( localhost でもいいかもしれませんが、試していません。)
RAILS_ENV: test はtest環境で起ち上げるためです。

      - image: circleci/ruby:2.6.0-node-browsers-legacy
        environment:
          RAILS_ENV: test
          POSTGRES_HOST: 127.0.0.1

postgresqlのイメージを指定します。違うバージョンを使っている場合はこちら から適宜選んでください。
POSTGRES_USERPOSTGRES_DB はご自分の config/database.yml の記載にあわせてください。

      - image: circleci/postgres:9.4
        environment:
          POSTGRES_USER: postgres
          POSTGRES_DB: app_test

rubocopの実行した後、rspecを実行します。circle ci時間の節約のため、rubocopがfailしたらrspecをやらないように requires で rubocopを指定しています。

workflows:
  version: 2
  rubocop_rspec:
    jobs:
      - rubocop
      - rspec:
          requires:
            - rubocop

databaseの設定は以下の通りです。 app_xxxx のところは各自の環境にあわせてください。

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: postgres
  password:
  host: <%= ENV['POSTGRES_HOST'] %>

development:
  <<: *default
  database: app_development

test:
  <<: *default
  database: app_test

開発環境での POSTGRES_HOST は環境変数で指定してあげます。環境変数はdotenv を使い、開発環境構築にはdockerをつかっていて、 db という名前でpostgresqlが起動しているので下記のようにしています。

.env
POSTGRES_HOST=db

あとは、これをcommitしてあげると、CircleCIが動くことを確認して下さい。

  • commitすると自動でcheckしてくれます。
    Image from Gyazo

  • タブ Checks にテストの詳細が表示されます。

Image from Gyazo

以上、

71
81
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
81

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?