【circleCI】Rails 앱으로 github와 연동하여 rubocop과 rspec 테스트를 실행

소개



학교 졸업 후 묵묵히 앱을 만들고 있습니다만, 개발 환경에 Docker를 도입했다고 하는 것으로 그대로 CircleCI도 도입해 버렸습니다.

덧붙여서 circleCI를 도입하려면 적지 않고 Docker의 지식이 필요합니다.
만약 Docker는 뭐야? 라고 사람은 먼저 Docker를 개발 환경에 구축해 보는 편이 부드럽다고 생각합니다.

Rails에 Docker를 도입하는 방법은 아래에 쓰고 있으므로, 좋다면 봐!

작성한 Rails 애플리케이션으로 Docker 환경 구축

circleCI란?



지속적인 통합 (배달) 서비스입니다. 커밋에서 배포까지 파이프라인을 만들고 지속적인 통합/배달을 사용하여 소프트웨어 개발 프로세스를 자동화할 수 있습니다.

조금 어려운 용어입니다.
간단하게 말하면, github의 push에 맞추어, 테스트 코드를 달리게 해 줍니다.
이 자동 배치까지 해주는 환경을 CI/CD 환경이라고 합니다.

이번에는 자동 배포는 할애하므로 CI까지 됩니다.

전제 조건


  • github 계정이 있습니다
  • 이미 rails 프로젝트가 있다
  • 데이타베이스에는 Mysql을 사용하고 있는 것.
  • rspec 및 rubocop은 설치, 구성 됨

  • circleCI와 github를 연동



    이 근처에 대해서는 아래 기사를 참고하십시오.
    간단하다고 생각합니다. 다만 언어는 Ruby를 선택해 주세요!
    이 언어를 선택했을 때, 나중의 설정 파일의 두드려대가 되는 기술이 있으므로, 복사해 메모 계속 좋을지도 모릅니다.
  • 【CircleCI】CircleCI 2.0부터 시작하는 개인에서의 간단한 CI 도입 방법 - github와의 제휴까지

  • 파일을 만드는 위치



    여기에서 circleCI의 설정 파일을 써 가게 됩니다.
    먼저 응용 프로그램의 루트 디렉터리에 .circleci/config.yml이라는 디렉터리와 파일을 만듭니다.
    이런 느낌.



    .circleci/config.yml 작성



    갑자기 결론이 되지만, 나는 이런 느낌이 되었습니다.
    이 설명은 github에서 push 할 때마다 circleCI를 시작하고 rubocop과 rspec을 실행합니다.
    간략한 설명은 코멘트 아웃에 적어 둡니다.

    circleci/config.yml
    
    # Ruby CircleCI 2.0 configuration file
    #
    # Check https://circleci.com/docs/2.0/language-ruby/ for more details
    #
    version: 2
    jobs:
      build:
        docker:
          # specify the version you desire here
          # ruby2.5.1を使ったアプリのため
          - image: circleci/ruby:2.5.1-node-browsers
            environment:
    #  ①注意!! bundlerのバージョンが2.0.1以上だと、bundle installに失敗します。ここに環境として指定します。
              - BUNDLER_VERSION: 2.0.2
    #  ②注意!! circleCIは仮想環境を構築するので、そのときに使うデータベースを指定する必要があります。
              - RAILS_ENV: 'test'
          # Mysqlのバージョン5.6で動かしていたため、5.6を指定
          - image: circleci/mysql:5.6
            environment:
              - MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
              - MYSQL_ROOT_HOST: '%'
    
          # Specify service dependencies here if necessary
          # CircleCI maintains a library of pre-built images
          # documented at https://circleci.com/docs/2.0/circleci-images/
          # - image: circleci/postgres:9.4
    
        working_directory: ~/repo
    
        steps:
          - checkout
    
          # Download and cache dependencies
          - restore_cache:
              keys:
                - v1-dependencies-{{ checksum "Gemfile.lock" }}
                # fallback to using the latest cache if no exact match is found
                - v1-dependencies-
    
          - run:
              name: install dependencies
              command: |
    # ①bundler2.0.1以降のものを使っているのであれば、環境変数と合わせて指定する必要があります。
                gem install bundler -v 2.0.2
                bundle install --jobs=4 --retry=3 --path vendor/bundle
    
          - save_cache:
              paths:
                - ./vendor/bundle
              key: v1-dependencies-{{ checksum "Gemfile.lock" }}
    
    # ②ちょっと無理やりですが、database.ymlとdatabase.yml.ciを入れ替える記述です。
          - run: mv config/database.yml.ci config/database.yml 
    
          # Database setup
          - run: bundle exec rake db:create
          - run: bundle exec rake db:schema:load
    
    # rubocopを走らせる記述です。
          - run:
              name: Rubocop
              command: bundle exec rubocop
    
    # rspecを走らせる記述です。
          # run tests!
          - run:
              name: run tests
              command: |
                mkdir /tmp/test-results
                TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
                  circleci tests split --split-by=timings)"
    
    
    # ③ここでRspecJunitFormatterというgemをインストールしていないとエラーになります。gemfileに記述しましょう。
                bundle exec rspec \
                  --format progress \
                  --format RspecJunitFormatter \
                  --out /tmp/test-results/rspec.xml \
                  --format progress \
                  $TEST_FILES
    
          # collect reports
          - store_test_results:
              path: /tmp/test-results
          - store_artifacts:
              path: /tmp/test-results
              destination: test-results
    

    주의점이 꽤 많지만 하나씩 해설합니다.

    ① bundler2.0.1 이후의 것을 사용하고 있으면 bundle install 에 실패합니다. (Docker와 같습니다.)
    환경으로 지정하고 bundle install을하기 전에 bundler의 버전을 지정한 후에 bundler를 설치하지 않으면 안됩니다.

    ② circleCI는 가상환경을 구축하는데, 그때 사용할 데이터베이스를 지정할 필요가 있어 에러가 나왔습니다. 제 경우에는 여기서 test를 지정하고 database.yml.ci라는 것을 준비했습니다.
    데이터베이스를 설정하기 전에 기존 database.yml을 사용하는 대신 database.yml.ci로 교체해야 합니다.
    database.yml.ci의 내용은 나중에 설명합니다.

    ③ circleCI의 버전이 바뀌었을 때, RspecJunitFormatter라는 gem이 필요하게 되었다고 합니다.
    여기서도 에러가 나왔으므로, gemfile에 기술해 봅시다. 소스는 여기

    config/database.yml.ci 작성



    나는 이런 식으로 기술했습니다.

    config/database.yml.ci
    test:
      adapter: mysql2
      encoding: utf8
      pool: 5
      username: 'root'
      port: 3306
      host: '127.0.0.1'
      database: ci_test
    

    이런 곳일까요?
    대체로 내가 막힌 에러에 대해서는 쓰고 있다고 생각합니다.

    그건 그렇고, github에 circleCI 결과를 표시 할 수도 있습니다.
    참고 기사는 이쪽
    매우 간단하기 때문에 시도해보십시오.

    속편



    circleCI를 사용한 CD 환경 구축까지 해 버렸습니다

    rails5.2/Capistrano/circleCI 환경을 통한 AWS에 자동 배포

    좋은 웹페이지 즐겨찾기