Golangで書かれたWebアプリをWerckerでVPSにデプロイした話

今回はGoで書かれたWebアプリケーションをWerckerを使ってビルドとデプロイをしたのでその時のWerckerのデプロイ設定などについて書いていきたいと思います。

はじめに

開発環境

前提条件

  • Githubで開発しているリポジトリがあること
  • すでにWercker側でApplicationの作成をしていて、PushするとBuildフェーズが通るようになっていること

Werckerの全体像

WerckerのPipelineという概念があります。 下記画像のようにBoxという仮想環境の中でBuildフェーズとDeployフェーズが順番に実行され、その中でstep と呼ばれる個別の処理で発生します。
今回はmasterにpushされたタイミングでBuildフェーズとDeployフェーズが実行されるように設定します。

f:id:kazumasaSS:20170615124847p:plain

Wercker側でDeployフェーズの追加

werckerのアプリケーションのページに移動します。 開くとWorkFlowsというタブがあるのでそれを選択します。

f:id:kazumasaSS:20170615123440p:plain

続いて選択して移動したページにAdd new pipelineと書いてあるボタンがあるので選択します。

f:id:kazumasaSS:20170615123441p:plain

新しいpipelineのNameを入力します。今回はDeployフェーズの追加なので deploy と入力しましょう。 YML Pipeline Nameも同様で良いです。
Hook Typeですが、今回はBuildフェーズが通った後にDeployフェーズを実行するため Default を選択しましょう。 f:id:kazumasaSS:20170615124319p:plain 必要な項目を全て入力したら Create しましょう。
作成すると下記画像のようにdeployが追加されるので確認してみてください。

f:id:kazumasaSS:20170615133437p:plain

秘密鍵の設定

VPSにログインするために秘密鍵の設定をする必要があります。先ほどの画像の deploy をクリックして詳細のページに飛びます。
詳細のページに移動すると Generate SSH Keys というボタンがあるのでそれを押すと秘密鍵の生成ができます。

f:id:kazumasaSS:20170615123446p:plain

鍵の名前は自由でいいのですが、今回は DEPLOY_KEY とします。 RSAですが、2048と4096がありますが、どちらでも構いません。

f:id:kazumasaSS:20170615133937p:plain

Create を押すと公開鍵と秘密鍵のペアがこのように生成されます。
DEPLOY_KEY_PUBLIC は後でVPSの方で鍵を設定するのに必要なのでコピーしておきます。 f:id:kazumasaSS:20170615134741p:plain

VPS側の設定

VPSの方にSSH接続し、今回Deployする用のユーザーを作成します

#今回はdeploy用のユーザーはwerckerとします
$ adduser wercker

# wheelグループにwerckerを追加
$ gpasswd -a wercker wheel
$ su - wercker
$ cd ~/
$ mkdir .ssh

# ここで先ほどコピーした公開鍵を貼り付ける
$ vi .ssh/authorized_keys
$ chmod -R 700 .ssh
$ chmod 644 .ssh/authorized_keys

# deploy用のディレクトリの用意
$ mkdir /srv/rsync
$ chmod 755 /srv/rsync

これで一旦VPS側の設定は終わります。

wercker.ymlにDeployフェーズを追加

次にwercker.ymlを編集していきます。

box: golang
build:
    steps:
        - setup-go-workspace
#何かしらの処理(今回はBuildフェーズの詳細については省きます)

deploy:
  steps:
# デプロイするファイルの表示
    - script:
        name: deploy info
        code: find .
# VPSのIPもしくはドメインを入力しましょう
    - add-to-known_hosts:
        hostname: IPアドレスもしくはドメイン名
#ここでは先ほど登録した鍵の変数名を入力しましょう
    - add-ssh-key:
        keyname: DEPLOY_KEY

# 今回はrsyncというファイル同期ができるコマンドを使って転送します
    - install-packages:
        packages: rsync

# 転送
    - script:
        name: rsync
        code: rsync -azvv --delete -e "ssh -v -o StrictHostKeyChecking=no -o UserKnownHostsFile=no" $WERCKER_ROOT/* wercker@ IPアドレスもしくはドメイン名 :/srv/rsync

以上でwercker.ymlの設定は終了です。

Buildフェーズが通ったらDeployフェーズが実行されるようにする

これまででほとんどの設定は終了しました。あとはBuildフェーズ後にDeployフェーズが実行されるようにすればいいだけです。
もう一度アプリケーションのページから WorkFlows のページに飛んでください。 WorkFlowsのページから下記画像のように+ボタンを押してpipelineを追加することができます。
これはWorkFlowと言って1つのCIのプロセスを複数のパイプラインに分割することのできる機能です。これを使ってbuildフェーズの後にdeployフェーズの追加をしてあげます。
on branch でDeployフェーズが実行されるブランチを決めることができます。今回はmasterにします。
Execute pipeline はdeployを選択しましょう。 f:id:kazumasaSS:20170615141419p:plain

これでGithubからmasterにpushされたらdeployされるようになりました。

追記

デプロイ用に作ったユーザーのロックされているとデプロイできないです。

passwd -S デプロイ用のユーザー

passwdコマンドでユーザーがロックされていないか確認して見ましょう