はじめに
個人的に作成しているアプリケーションのCIツールとして、CircleCIを使用しています。
1コンテナであれば無料で使えるようなので、個人制作でCIにあまり時間が使えない場合は重宝します。
今回は単純ですが、RailsアプリケーションのRSpec実行とCapistranoによるデプロイを設定したファイルを記載したいと思います。
導入するにあたって
CircleCIに関する記事は多く存在するので、ここでは詳細は割愛させていただきます。
ただ、導入した際に、私が感じたことをメモ程度でまとめておきます。
- GithubかBitbucketを使ってログインすると、関連するリポジトリを参照してくれるので初期設定がかなり楽。
- プロジェクトを作成すると、言語が選択できる。選択後、CircleCIの方でサンプルを表示してくれる。正直、それをコピペして作ればできる。
- 初期設定では、全てのコミットでCIが起動してしまうので、ある程度条件は絞った方が良いかも(全てでも良いのかもしれませんが、時間で制限もあるので。)。
- Dockerコンテナを使ってCI環境を作るので、Dockerを少しかじっておくとなんとなく理解できる。
項目B
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | 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
と入れ替えるようにしました。
上のコードでいうと、下記の部分です。
1 2 3 4 5 | # テストデータベースの設定 - 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構築に時間をかけられない場合にお勧めします。
テストとデプロイでジョブを切ったりもできるようなので、ぜひお試しください。