はじめに
RailsでCircleCI環境を整えるまでの手順をまとめました。
CircleCIはバージョン2.0がありますが、
Dockerがないといけない?ようなので、バージョン1.0で準備しました。
circleCIとは
簡単に言うと、
githubのpushを検知して、自動でビルドからテスト、デプロイまで自動化してくれるツール。
(デフォルトだと全部ブランチ対象)
1コンテナは無料なので、時間が掛かってもよいのであれば無料枠で十分。
設定ファイル
必要なファイルは以下3つ
① circle.yml
② config/database.yml.ci
③ script/deploy-staging.sh
① circle.yml
circleCIを動かくための設定ファイル。
Railsのアプリケーションディレクトリ直下にファイルを作ります。(gemfileとかと同じ場所)
② config/database.yml.ci
テストするためのDB設定ファイル。Rspecを実行するために必要。
③ script/deploy-staging.sh
テストが終わったらステージング環境へデプロイするためのスクリプトファイル。
設定ファイルの中身
machine:
timezone:
Asia/Tokyo
ruby:
version:
2.3.0
dependencies:
pre:
- sudo pip install awscli
override:
- bundle install:
database:
pre:
- mv config/database.yml.ci config/database.yml
override:
- bundle exec rake db:create db:schema:load RAILS_ENV=test
- bundle exec rake db:migrate RAILS_ENV=test
test:
override:
- bundle exec rspec spec/
deployment:
staging:
branch: master
commands:
- sh script/deploy-staging.sh:
timeout: 1500
ポイント
AWSにデプロイするのにawscliを使用するために、
「sudo pip install awscli」を記述する。(デフォルトは古いらしい)
DB名は「test」じゃないと動かない。
test:
adapter: postgresql
encoding: unicode
database: test
pool: 5
#!/bin/sh
export AWS_DEFAULT_REGION="ap-northeast-1"
MYSECURITYGROUP="*"
MYIP=`curl -s ifconfig.me`
aws ec2 authorize-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
bundle exec cap production deploy
aws ec2 revoke-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
ポイント
MYSECURITYGROUPは、AWSのセキュリティーグループIDを指定する。
LFの改行コードで作成する。CRLFだと動かない。
その他設定
CircleCI側にAWSの秘密鍵を登録する。
AWS上で「cat ~/.ssh/id_rsa」で表示されるもの。
CircleCI側にAWSのアクセスキーとシークレットキーを設定
AWSの秘密鍵をAWSの認証キーとして登録。
AWS上で「cat id_rsa >> ~/.ssh/authorized_key」
Port 22をセキュリティグループで空けておく。