LoginSignup
6
4

More than 5 years have passed since last update.

Circle CIを使用するためのコード解説

Last updated at Posted at 2016-03-05

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
6
4
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
6
4