カテゴリー: Server

CircleCIを使ってみた(RailsのRSpecとデプロイのサンプル)

はじめに

個人的に作成しているアプリケーションのCIツールとして、CircleCIを使用しています。
1コンテナであれば無料で使えるようなので、個人制作でCIにあまり時間が使えない場合は重宝します。

今回は単純ですが、RailsアプリケーションのRSpec実行とCapistranoによるデプロイを設定したファイルを記載したいと思います。

導入するにあたって

CircleCIに関する記事は多く存在するので、ここでは詳細は割愛させていただきます。
ただ、導入した際に、私が感じたことをメモ程度でまとめておきます。

  • GithubかBitbucketを使ってログインすると、関連するリポジトリを参照してくれるので初期設定がかなり楽。
  • プロジェクトを作成すると、言語が選択できる。選択後、CircleCIの方でサンプルを表示してくれる。正直、それをコピペして作ればできる。
  • 初期設定では、全てのコミットでCIが起動してしまうので、ある程度条件は絞った方が良いかも(全てでも良いのかもしれませんが、時間で制限もあるので。)。
  • Dockerコンテナを使ってCI環境を作るので、Dockerを少しかじっておくとなんとなく理解できる。

項目B

version: 2
jobs:
  build:
    # 対象のブランチ
    # master に限定
    branches:
      only:
        - master
    # 使用する Docker イメージ
    # Rails 用の Ruby イメージ
    # MySQL 用のイメージ
    docker:
       - image: circleci/ruby:2.5.1-node-browsers
         # MySQL に接続するための環境変数を設定
         # テスト用なのでデフォルトのまま(rootユーザー)
         environment:
           RAILS_ENV: test
           DB_HOST: 127.0.0.1
           DB_USERNAME: 'root'
           DB_PASSWORD: ''

       - image: circleci/mysql:5.7

    working_directory: ~/repo

    steps:
      - checkout

     # SSH鍵を設定
      - add_ssh_keys:
          fingerprints: "aaaaaaaaaaa"

      - 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: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle

      - save_cache:
          paths:
            - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}

      # テストデータベースの設定
      - run: rm ./config/database.yml
      - run: mv ./config/database.yml.ci ./config/database.yml
      - run: bundle exec rake db:create RAILS_ENV=test
      - run: bundle exec rake db:migrate RAILS_ENV=test

      # テスト実行
      - run:
          name: run tests
          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"

            bundle exec rspec --format progress \
                            --out /tmp/test-results/rspec.xml \
                            $TEST_FILES

      - store_test_results:
          path: /tmp/test-results
      - store_artifacts:
          path: /tmp/test-results
          destination: test-results

      # ssh-agent で鍵を登録
      - run:
          name: Add ssh-agent
          command: |
            ssh-agent -s > ~/.ssh_agent_conf
            source ~/.ssh_agent_conf
            for _k in $(ls ${HOME}/.ssh/id_*); do
              ssh-add ${_k} || true
            done

          # デプロイ
          name: Deploy Master
          command: |
            bundle exec cap production deploy

補足

開発環境とCI環境でdatabase.ymlが異なる

横着しただけですが、開発環境のMySQLのログインパスワードと、CI環境のログインパスワードが違う場合、 database.yml も変わるかと思います。
(合わせれば良いだけの話ですが。)

環境変数を使う方法もあるようですが、私は `database.yml.ci` というファイルを作成して、コンテナ生成時に本来の database.yml と入れ替えるようにしました。

上のコードでいうと、下記の部分です。

      # テストデータベースの設定
      - run: rm ./config/database.yml
      - run: mv ./config/database.yml.ci ./config/database.yml
      - run: bundle exec rake db:create RAILS_ENV=test
      - run: bundle exec rake db:migrate RAILS_ENV=test

さいごに

冒頭でも書きましたが、CircleCIはかなり導入コストが低いため、あまりCI構築に時間をかけられない場合にお勧めします。

テストとデプロイでジョブを切ったりもできるようなので、ぜひお試しください。

naoki85

シェア
執筆者:
naoki85
タグ: Rails

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

3週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前