LoginSignup
2
0

More than 3 years have passed since last update.

CircleCI2.0をRailsアプリに導入してみた

Last updated at Posted at 2020-12-20

概要

CircleCIの導入について整理していきたいと思います。
事前知識として、CircleCIの公式チュートリアルや他に記事がたくさんあるので、学習には困らないかと思いますが、今回は自分なりに学習したことの整理としてコードを見ていきたいと思います。

【追記】 2021-1-16
JavaScriptに対応している記事はこちらです!

CircleCIとは

CircleCIとはSaas型のCI/CDサービスのことです。
具体的に言うとGitHubのリポジトリへプッシュしたタイミングで、アプリのビルドやテスト、デプロイなどの処理が自動で実行されるようになります。

導入手順

1.CircleCIとGitHubを連携
2.CircleCIで現在作成しているリポジトリ(アプリ)を選択
3.ローカル環境で選択したリポジトリのrootディレクトリに.circleciディレクトリとその中にconfig.ymlファイルを作成する。
4.テスト用にconfig/database.yml.ciを作成する
5.config.ymlの設定が終わったらCircleCIのリポジトリに戻ってUse Existing Configをクリック、buildを選択
6.GitHubのリポジトリへpush

CircleCIの設定

私はこのような感じに書きました。

.circleci/config.yml

version: 2
jobs:
  build:
    docker:
      - image: circleci/ruby:2.6.6-node-browsers # 自身のRubyのバージョンに合わせてください
        environment: # 環境変数を使用
          - BUNDLER_VERSION: 2.0.2 # 自身のバンドラーのバージョンに合わせてください
          - RAILS_ENV: 'test'
      - image: circleci/mysql:8.0 # 自身のMySQLのバージョンに合わせてください
        command: [--default-authentication-plugin=mysql_native_password]
        environment:
          - MYSQL_USER: root
          - MYSQL_DB: ci_test

    working_directory: ~/myapp

    steps: # コンテナにインストールしていくステップ
      - checkout # インストール開始

      - restore_cache: # キーテンプレートに一致するキーを持つキャッシュを検索
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            - v1-dependencies-

      - run:
          name: install dependencies
          command: |
            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" }}

      - run: mv config/database.yml.ci config/database.yml 

      - run: yarn install
      # DB作成
      - run: bundle exec rake db:create
      - run: bundle exec rake db:schema:load
      # テストの実行
      - run:
          name: run tests
          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
              circleci tests split --split-by=timings)"
            sudo gem install bundler
            sudo gem install rspec
            sudo gem install rspec-core
            bundle exec rspec \
              --format progress \
              --format RspecJunitFormatter \
              --out /tmp/test-results/rspec.xml \
              --format progress \
              $TEST_FILES
      # テスト結果を保存
      - store_test_results:
          path: /tmp/test-results
      - store_artifacts:
          path: /tmp/test-results
          destination: test-results

config/database.yml.ci

test:
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: 'root'
  port: 3306
  host: '127.0.0.1'
  database: ci_test

詳細

Authentication plugin 'caching_sha2_password' cannot be loaded

command: [--default-authentication-plugin=mysql_native_password]この記述を追加しました。

Mysql2::Error: Unknown MySQL error

このエラーはMySQLが見つからないというエラーです。ローカルでは通っていたのだけどと思いつつ、設定を見直してみました。

database.yml.ciのusernameとdatabaseconfig.ymlのMYSQL_USERとMYSQL_DB整合性を取らないとこのようにエラーが起きます。

テストが通らない

circleci/ruby:2.6.6-node-browsersnodeが入っているイメージとrun: yarn installで解消しました。-タグ + -nodeとすることで、ビルド コンテナの状態を固定をすることができ、アップストリームからの想定外の変更を防止できるようです。詳しくはcircleciのイメージのベストプラクティスを御覧ください。
※今回はタグを付けておりません。(エラーが起きてしまうため、原因を探っております。。)

注意点

  • インデントに気をつける
  • 一か八かのpushをしない

こちらの記事が参考になりました。私は気づくのが遅くポジトリを少々荒らしてしまいました。。

CircleCI CLIを使ってpushする前にローカルで文法チェックとjobをテストすることができます。詳しくは記事を御覧ください。

  • 何をしているのか理解しながら進める

自分もまだ完全に理解はできておりませんが、何をしているのか、どのような流れでファイルが実行されるのかということを考えながらやると理解が早まるかもしれません。

まとめ

  • 導入は情報量が多いため比較的容易。
  • しかし、理解するのは時間がかかるため、まずは手を動かして流れを掴んでいく。
  • Dockerの知識も必要になるので復習し直す必要がある。

参考文献

【追記】 2021-1-16
JavaScriptに対応している記事はこちらです!

2
0
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
2
0