【Rails】Github와 CircleCI를 연계하여 commit시 rspec과 rubocop을 이동

개요


  • 표제대로
  • CircleCI와 Github를 연계
  • rspec 및 rubocop 설치
  • CircleCI에서 rspec과 rubocop을 움직이기위한 설정


  • 전제


  • github 계정이 있습니다
  • 이미 rails 프로젝트가 있음
  • Postgresql을 사용한 예를 설명합니다.
  • Mysql의 경우는 적절하게 읽어 주세요.


  • 절차



    CircleCI와 Github 협력



    이쪽을 참고로. GitHub 계정을 이미 가지고 있다면 뽀뽀하는 것입니다.
  • Sign Up and Try CircleCI
  • Enabling GitHub Checks
  • 【CircleCI】CircleCI 2.0부터 시작하는 개인에서의 간단한 CI 도입 방법 - 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 을 copipe 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이 달리게 되어 있습니다. 다만 당연히 아무것도 하지 않기 때문에 실패합니다. (실패한 이메일이 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
    

    먼저 이미지를 CircleCI docker hub
    이번에는 2.6.0을 사용했습니다.
    이미지 환경 변수는 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 시간을 절약하기 위해 requires에서 rubocop을 지정하고 rubocop이 실패하면 rspec을 수행하지 않습니다.
    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가 기동하고 있으므로 아래와 같이 하고 있습니다.
    POSTGRES_HOST=db
    

    그리고, 이것을 commit 해 주면, CircleCI가 움직이는 것을 확인해 주세요.
  • commit 하면 자동으로 check 해 줍니다.
  • Checks에 테스트 세부 정보가 표시됩니다.



  • 이상,

    좋은 웹페이지 즐겨찾기