デプロイサーバの役割
デプロイとは、主にネットワークを通じて提供されるWebアプリケーションなどのシステム開発工程において、システムを利用可能な状態にすることである。
こちらより引用
よくあるのがこんな構成で踏み台サーバにシェルスクリプトやCapistranoが仕掛けられていて、
各サーバA,B,Cにログインしてgit pull origin master
とかするやつです。
最近だとansibleとかも使う会社もあるみたいです。
他にも見かけるのが上記の踏み台サーバがjenkinsおじさんとかdrone.ioだったりする構成です。
またクラウドでは、Githubと連携できるCircleCIやTravisCIなんてのもあります。
そこで今回紹介するのはCircleCIやTravisCIの競合のwerckerです。
ここではHello-worldをConoha VPSに展開できるようにしてみます。
ちなみにwerckerの料金は個人で使う分には基本的に無料と言っていいレベルだと思います。
http://www.wercker.com/pricing
環境
開発
- Mac
- Node.js v7.9.0
- pm2 2.4.5
- git 2系
デプロイするサーバ
- Conoha VPS (CentOS7)
- Node.js v7.9.0
- pm2 2.4.5
- git 2系(RHEL系のyumだと1系しか入りません)
※pm2はCapistranoのようなものです
テスト用プロジェクトを作成
おなじみのNode.jsのExpressでサンプルプロジェクトを作成します。
$ npm install -g express
$ npm install -g express-generator
$ express hello-world
...
$ cd hello-world
pm2用のデプロイファイルを作成
$ npm install -g pm2
$ pm2 ecosystem
ecosystem.config.jsを編集
$ cat ecosystem.config.js
var user = encodeURIComponent(process.env.GITHUB_USER);
var password = encodeURIComponent(process.env.GITHUB_PASSWORD);
var keyPath = process.env.SSH_PRIVATE_KEY_PATH || "~/.ssh/id_rsa";
module.exports = {
/**
* Application configuration section
* http://pm2.keymetrics.io/docs/usage/application-declaration/
*/
apps : [
// First application
{
name : "hello-world",
script : "npm",
args : "start",
env: {
PORT: 3000
},
env_production : {
NODE_ENV: 'production',
}
}
],
/**
* Deployment section
* http://pm2.keymetrics.io/docs/usage/deployment/
*/
deploy : {
production : {
"key" : keyPath,
"user" : "ichiwa",
"host" : [process.env.HOST],
"ref" : "origin/master",
"repo" : "https://"+user+":"+password+"@github.com/ichiwa/hello-world-pm2-wercker.git",
"ssh_options" : "StrictHostKeyChecking=no",
"path" : "/home/ichiwa/hello-world-pm2-wercker",
"post-setup" : "npm install",
"post-deploy" : "pm2 restart ecosystem.config.js --env production"
}
}
};
historyに残ったりとか問題がありますが、werckerを経由しなくてもこのコマンドでローカルマシンからVPSにデプロイは可能です。
$ SSH_PRIVATE_KEY_PATH="~/.ssh/id_rsa" GITHUB_USER=XXX GITHUB_PASSWORD=XXX HOST=XXX pm2 deploy ecosystem.config.js production update
つまりこれをwerckerにやってもらうイメージです。
※蛇足ですが、pm2ではデプロイ先を複数指定できます。
"host" : ["XXX.XXX.XXX.XXX", "YYY.YYY.YYY.YYY", "ZZZ.ZZZ.ZZZ.ZZZ"],
wercker.ymlの作成
$ cat wercker.yml
box: node
build:
steps:
- npm-install
- npm-test
- script:
name: echo nodejs information
code: |
echo "node version $(node -v) running"
echo "npm version $(npm -v) running"
setup-production:
steps:
- mktemp:
envvar: SSH_PRIVATE_KEY_PATH
- create-file:
name: Create private key
filename: $SSH_PRIVATE_KEY_PATH
content: $SSH_PRIVATE
overwrite: true
hide-from-log: true
- script:
name: Install pm2 package
code: npm install -g pm2
- script:
name: Setup production
code: |
pm2 deploy ecosystem.config.js production setup
deploy-production:
steps:
- mktemp:
envvar: SSH_PRIVATE_KEY_PATH
- create-file:
name: Create private key
filename: $SSH_PRIVATE_KEY_PATH
content: $SSH_PRIVATE
overwrite: true
hide-from-log: true
- script:
name: Install pm2 package
code: npm install -g pm2
- script:
name: Deploy production
code: |
pm2 deploy ecosystem.config.js production update
werckerのPipeline
上記のファイルで指定されているPipelineは
- build
- setup-production
- deploy-production
の3つです。
build
はデフォルトであるPipelineです。 npm test
を実行します。
setup-production
は秘密鍵を作成して、pm2 setup
コマンドでソースを配置しています。※初回に一度だけ
実行後にecosystem.config.js
のpost-setup
で指定されたコマンドnpm install
が実行されます。
deploy-production
も同様にpm2 update
コマンドでソースを更新しています。基本的にブランチが更新されたらこれを使ってデプロイしていきます。
ecosystem.config.js
のpost-deploy
で指定されたコマンドpm2 restart ecosystem.config.js --env production
が実行され、プロセスが再起動されます。
これでローカルマシンですべきことは完了です。
Githubにあげておきます。
デモソース
wercker にて
※werckerにはすでにGithubと紐付いたアカウントがある前提で勧めます。
Application作成から要点のみ説明
- Repositoryは先程作ったものを選択
- 作成後、すでにwercker.ymlはあるのでビルドする。
- その後、Workflows→Add new Pipeline
-
setup-production
とdeploy-production
を作成する - Environmentから使う環境変数を追加する(認証鍵はGenerate SSH Keysから作る)
デプロイするVPSにて
werckerで作成した認証鍵を追加する
$ vi ~/.ssh/authorized_keys
werckerで作成した公開鍵をコピペする
$ chmod 644 ~/.ssh/authorized_keys
~/.ssh
がない場合は鍵を作成しておく
$ ssh-keygen
これでwerckerの秘密鍵でログインができるようになる。
werckerに戻る
デプロイしてみる
- すでに成功しているRunsからデプロイするビルドを選ぶ。
- Actions→
setup-production
を実行する。(初回だけ)
その後はAction→deploy-production
でデプロイができるようになる。
おしまい
最後に
ここでやったのは本番へのデプロイだけですが、各Pipelineはつなげることもできるため、Buildが成功したら、開発環境へ自動デプロイみたいなこともHOSTとか変更したりすればできます。
本番へ自動デプロイするのは商用サービスではしないと思うので、あえてそうはしていません。
そういえば最近、OracleがWerckerを買ったみたいですね、、、
Oracleのことだから料金が上がるかもですね(偏見)
ハマった話
最初はubuntu(debian系)でやったから正常に動いたと思って安心していたら、
centos(RHEL系)でやったらなぜか3つくらい前のコミットをデプロイするという
yumのGit(1系)のバグに出くわしてハマりました... orz
https://github.com/Unitech/pm2/issues/2623