Circle CIのサイトでsign upし、githubの自分のrepositoryとsyncした後(別に後でなくても良いけど)、以下2つのファイルを(自分で)作成する。
1. アプリケーションディレクトリ/circle.yml
2. アプリケーションディレクトリ/circle/deploy_production.rb
1. アプリケーションディレクトリ/circle.yml
Original Document (circle.yml)
用途
- 普通はCircle CIのアカウントをセットアップするだけでCircle CIがアプリケーションの設定を理解してくれて、自動でテストなどを動かしてくれる
- がしかし、設定をすることで、明示的にCircle CIが何をすべきか指示することもできる
スクリプト例
circle.yml
dependencies: #「アプリケーションで使われている言語特有のセッティングのための」
pre: #「'dependencies'と書かれていることでCircle CIが勝手にコードから推測してくれて実行する作業の前に」
- sudo pip install awscli #「このコマンドを実行しろ(bundle installとか書かれていること多そう。)」
(buildが成功した後のみに起こる)
deployment: #「指定したウェブサーバーにディプロイしろ」
production: # (セクション名)
branch: 'deploy/production' #「buildに成功したものの中で、この名前とマッチする(最初の)branchをサーバーでrunしろ」
commands: #「このコマンドを実行しろ」
- ./scripts/circle/deploy_production.rb: #「このファイルを実行しろ」
timeout: 300 #「もし上記コマンドでこの秒数の間何も出力がなかった場合、このジョブを殺せ」
その他気をつける
- 上から順番に読まれて実行される
2. アプリケーションディレクトリ/circle/deploy_production.rb
用途
Circle CIがAWSサーバ(このコード&アプリケーションのコードを置くところ)にsshでアクセスできるようにするための認証コード
上記意味解説
- Circle CIはgithubから所望コードをbuildし、テストする役割を持つと同時に、そのテストして確かめたコードを、本番サーバー(eg. AWS)にbuildして、置く、という役割を持つ
- 本番サーバーにCircle CIをアクセスさせることになるのだが、本当に「Circle CIがアクセスしていますよ」ということを認証させないといけない
- しかしながら、Circle CIはある1つのIPアドレスにおいて動いているわけではなく、複数のIPアドレスに点在しており、しかもその数は多い。
- もしCircle CIのIPアドレスが1つなど小さい数の固定数であれば、最初からそのIPアドレスをサーバーに登録しておいて、認証すればいいが、IPアドレスが複数多数あり、そんな訳にはいかないので、以下の認証するためのスクリプトが必要
- 以下の認証するためのスクリプトは、端的に言えば、サーバーにアクセスしようとしているCircle CIのIPアドレスを取得し、(サーバー側でマニュアルに認証し?)、アクセスを許可した後、コードをbuildするなどの処理が終わった後に、そのアクセスを再び閉じる、というコード
前提
- 以下は普通にrubyのsyntax
- `で囲むとcommand lineの意味となる
circle/deploy_production.rb
ENV['AWS_DEFAULT_REGION'] = 'ap-northeast-1'
ip_addr = `curl -s icanhazip.com` #icanhazip.comはIPアドレスを取得するためのweb site
if ! ip_addr
ip_addr = `curl -s ifconfig.me`
end
ip_addr = ip_addr.chomp
security_group = 'セキュリティグループの番号'
code = <<EOS #ブロックで記述できるヒアドキュメントというrubyの書き方。以下を変数codeに代入
set -ex
trap "aws ec2 revoke-security-group-ingress --group-id #{security_group} --protocol tcp --port 22 --cidr #{ip_addr}/32" 0 1 2 3 15 #アクセスを閉じる。trapと書いてあると下記のコードの後に実行という意味だそうな
aws ec2 authorize-security-group-ingress --group-id #{security_group} --protocol tcp --port 22 --cidr #{ip_addr}/32
bundle exec cap production deploy
EOS
`#{code}`
if $? != 0 #成功であれば$?に0が入る。つまり失敗であったらraiseしてねと言っている
raise :some_exception
end