このコーポレートサイトはCIにwercker使ってて、この間自動デプロイするようにした。
関連記事
ざっくり概要
- デプロイツールはcapistano3を使用
- デプロイ先のipは
deploy/production.rb
でaws-sdkを使って取得 - プライベートリポジトリからのソースの取得はSSH Agent Forwadingで行っている
- デプロイ先のipは
- デプロイ開始時、終了時にslackに通知
- masterのテストが通ったらで
wercker.yml
に記述したデプロイタスクが動くようにしてある- 基本的な話はこのあたりが参考になる
- 要は、werckerがCI用に立てたUbuntuのインスタンスからcapistranoを叩くようにすればいい
事前準備
- 必要な情報を
PIPELINE
に登録しておく- 秘密鍵
- プライベートリポジトリアクセス用
- ec2
- AWSのアクセスキー
cap production deploy
する時に環境変数に入れて叩くようにしてる- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- slackのwebhook url
- 秘密鍵
デプロイタスク
wercker.ymlの中身を見た方が早いと思うので載せる
deploy:
steps:
- script:
name: make .ssh directory
code: mkdir -p "$HOME/.ssh/corporate_site"
- create-file:
name: write deploy ssh key
filename: $HOME/.ssh/corporate_site/deploy.rsa
overwrite: true
hide-from-log: true
content: $DEPLOY_KEY
- script:
name: set permissions for deploy ssh key
code: chmod 0400 $HOME/.ssh/corporate_site/deploy.rsa
- create-file:
name: write aws ssh key
filename: $HOME/.ssh/corporate_site/corporate_site.kp.pem
overwrite: true
hide-from-log: true
content: $AWS_PEM
- script:
name: set permissions for aws ssh key
code: chmod 0400 $HOME/.ssh/corporate_site/corporate_site.kp.pem
- script:
name: add ssh agent
code: |
eval `ssh-agent`
ssh-add $HOME/.ssh/corporate_site/deploy.rsa
- script:
name: deploy
code: AWS_ACCESS_KEY_ID=$KEY_ID AWS_SECRET_ACCESS_KEY=$KEY_SECRET bundle exec cap production deploy BRANCH=master
解説
- make .ssh directory
$HOME/.ssh/corporate_site
ディレクトリを作成- 秘密鍵を置くディレクトリを作ってる
- write deploy ssh key
$HOME/.ssh/corporate_site/deploy.rsa
というファイルを作成する- 内容は事前に
PIPELINE
で登録したDEPLOY_KEY
を使用する
- set permissions for deploy ssh key
$HOME/.ssh/corporate_site/deploy.rsa
のパーミッションを0400に変更
- write aws ssh key
$HOME/.ssh/corporate_site/corporate_site.kp.pem
というファイルを作成する- 内容は事前に
PIPELINE
で登録したAWS_PEM
を使用する
- set permissions for aws ssh key
$HOME/.ssh/corporate_site/corporate_site.kp.pem
のパーミッションを0400に変更
- add ssh agent
- ssh-agentを起動し、
$HOME/.ssh/corporate_site/deploy.rsa
を登録する
- ssh-agentを起動し、
- deploy
- デプロイタスクの実行
- 環境変数
AWS_ACCESS_KEY_ID``AWS_SECRET_ACCESS_KEY
には事前にPIPELINE
で登録した値を使用している
ハマった所
ssh-agent
起動してなくてちょっとハマった。capistranoのログにはこんなエラーが吐かれる。
Permission denied (publickey).
fatal: Could not read from remote repository.