VPSに移行した時にやったシリーズです。なお、このサイトはさくらのVPSを使用していますがsshでデプロイしてるのでどのVPS(もしくはクラウド)でもやり方はほぼ同じになると思います。

目次

  1. 概要図
  2. werckerでの準備
    1. deployのパイプラインを作成する
    2. deployのパイプラインの権限を変更する
    3. SSH鍵を作る
    4. 環境変数を足す
    5. デプロイするブランチを限定する
  3. VPS側の設定
    1. デプロイ用のユーザーを作成する
    2. 公開鍵認証の設定をする
  4. wercker.ymlを作成する
  5. 実行
  6. なんでtar + sshで転送しているのか

概要図


下記が現時点のデプロイフロー及び動いている概要図です。 ちなみに、いろいろあって既にこのデプロイ方法はやめてます

まあ、なんかごちゃごちゃした図ですが、このうち今回はGitHubにpushした後にwerckerに通知しVPSにデプロイする部分について書きます。

werckerでの準備


今回はGitHubと連携します。といってもGitHubとの連携はUIでポチポチやればいいので特に書きません。

deployのパイプラインを作成する

werckerはパイプラインという概念で処理をまとめることができます。GitHubと連携した段階でデフォルトでbuildというパイプラインが出来上がっています。今回はこれに加えてdeployというパイプラインを追加します。なお、このパイプラインをくっつけたものをWorkflowと呼んでるようです。

「Add New pipeline」でパイプラインを追加します。「hook type」はDefaultを選択します。

deployのパイプラインの権限を変更する

ワークフロー全体のアクセス権がprivateの場合は特に変更は必要ない(と思いますが)そうでない場合はdeployパイプラインのパーミッションをExecute pipelinesに変更します。
こうしないと、ログが丸見えでsshのポートやユーザーや秘密鍵の値まで誰でも見れる状態になってしまいます。

こうすることで他のパイプラインがpublicの場合でも他のユーザーからはdeployのパイプラインのログは見れないようになります(たぶん)

SSH鍵を作る

「Environment」タブを選択して公開鍵認証用のカギを生成します。

私は既にprotectedにしているので値が見えませんが、初期では公開鍵(PUBLIC)のキーの値は見えています。この値は後でVPS側で使用するので、値をコピーしておきます。

ちなみに、パイプラインごとに鍵を生成できるようなので「Environment」タブで作成するよりパイプラインごとに作成したほうが良いかもしれません。 おそらくですが 権限がpublicになっているパイプラインで「Environment」タブで作成した鍵を使用するとログで値が見えてしまう気がします。

環境変数を足す

次に、その他見えたらマズイ値をdeployパイプラインの環境変数に追加します。
この環境変数はパイプラインのパーミッションをExecute pipelinesにしていないとログで見えてしまうので、必ずdeployパイプラインのパーミッションをExecute pipelinesにしておいてください。

私はsshで使用するポート番号とユーザーの環境変数を作成しました。

デプロイするブランチを限定する

デフォルトだとどのブランチをpushしてもデプロイがはじまってしまうので、デプロイするブランチを限定します。

buildパイプラインの「Ignore branches」で 無視するブランチ を指定します。
私はmastersettingsの2ブランチなのでsettingsを無視するように設定しました。

VPS側の設定


次にVPS側の設定を行います。

デプロイ用のユーザーを作成する

まず、VPS側でデプロイに使用するユーザーを作成します。werckerの環境変数で作成したユーザーで作成します。

1
useradd <werckerの環境変数で作成したユーザー>

公開鍵認証の設定をする

作成したユーザーのホームディレクトリで下記コマンドでディレクトリと鍵を作成します。

1
2
3
4
$ mkdir .ssh
$ chmod 700 .ssh
$ cat id_rsa.pub > .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys

その後authorized_keysに、wercker側で作成した公開鍵の値を貼り付けます。

wercker.ymlを作成する


最後にwecker.ymlを作成します。以下のようなものを作成しました。

1
build:
    steps:
      - wercker/install-packages@0.0.4

      - install-packages:
        packages: cmake

deploy:
    steps:
      
      - add-to-known_hosts:
          hostname: yoshinorin.net

      - mktemp:
          envvar: PRIVATEKEY_PATH    

      # werckerで設定したsshの秘密鍵の環境変数を基に秘密鍵を生成
      - create-file:
          name: Create private key
          filename: $PRIVATEKEY_PATH
          content: $DEPROY_KEY_PRIVATE
          overwrite: true

      # デプロイ前に不要なファイルを削除
      - script: 
          name: Remove no need assets
          code: |
           rm -rf CNAME
           rm -rf .gitignore
           rm -rf hexo-rpp-negativewords.txt
           rm -rf wercker.yml

      # 「/pipeline/source/」ディレクトリにソースがあるのでそれをtar + sshでサーバーに転送
      - script:
          name: Transfer data
          code: |
            PORT=${PORT}
            USER=${USER}
            tar cvz /pipeline/source/* | ssh -i $PRIVATEKEY_PATH -p $PORT -o StrictHostKeyChecking=no -o UserKnownHostsFile=no $USER@yoshinorin.net tar zxv -C /home/$USER/deploy/

buildのステップのところはぶっちゃけいらないと思いますが、私は以降もごちゃごちゃやる(予定)なのでbuildステップに上記のような記述を行っています。

deployステップですが、werckerで生成したsshの鍵をステップ内で生成して「tar + ssh」で転送しています。まあ、内容はざっと見てください。この時にログにsshの秘密鍵の値を含めた環境変数の値がそのまま表示されています。なのでこのステップの権限は…(ry

このyml作成時に下記の記事を参考にさせて頂きました。ありがとうございます。

JekyllをBitbucketからwercker通してさくらVPSにビルドする(後編)

実行


後は前述の「wercker.yml」をリポジトリのルートディレクトリに放り込んでpushしたらデプロイできるはずです。
できなかったらwerckerのログを見ましょう。

なんでtar + sshで転送しているのか


最初はwerckerからgit pushしようかと思いましたが「.git」ディレクトリで容量食いそうなのとか、いらんファイルも転送したくないという思いがありませんでした。
次にscpで転送しようとしましたが、タイムアウトになりました。まあ、アーカイブもせずに放り込もうとしていたので時間が掛かると言えばそりゃそうです。1パイプライン60秒でタイムアウトになるようです。

そこでいろいろ調べた結果、下記のサイトにたどり着き「tar + ssh」が最も良いかな?という判断に至りました。

SSH越しに巨大なファイルを転送する

ちなみに、scpでやった時のコマンドは下記です。

1
scp -i $PRIVATEKEY_PATH -P $PORT -o StrictHostKeyChecking=no -o UserKnownHostsFile=no -r $(pwd)/compressed.tgz $USER@yoshinorin.net:deploy/