Node.js
capistrano

capistrano2で独自のビルドスクリプトを走らせる

More than 1 year has passed since last update.

やりたいこと

githubから取ってきたソースを圧縮してデプロイ先に転送する時に、javascriptをbuildした結果を一緒に送りたい。

前提

  • 諸事情によりcapistrano2
  • javascriptはapp/assets以下ではなく、frontフォルダ以下で管理して、ES6で書いてる
  • 最終的にはapp/assets以下にbabelでビルドした結果を置いて、assets pipelineに載せたい(digestつけたい)

解決策

build_scriptを使おう。
http://www.rubydoc.info/gems/capistrano/2.15.0/Capistrano/Deploy/Strategy/Copy

deploy.rb
set :build_script, 'cp -r node_modulesのインストール先 node_modules && npm install && gulp build && cp -r node_modules node_modulesのインストール先'

build_scriptは、ソースをgzして転送する前に取得したソースのルートディレクトリ上で任意のコマンドを実行できる。githubをリポジトリとして使っているのであれば、git cloneしたものを圧縮する前にbuild_scriptで指定した任意のスクリプトを走らせられるイメージ。

git cloneしてきたものは/tmpフォルダ以下に保存され、デプロイが終わるとディレクトリごと消される。つまり、npm installすると0からインストールしなおすことになりいまいち。そこで、あらかじめ/tmp以外の場所にデプロイ時に使うモジュールをインストールするディレクトリを用意しておき、build_script内で都度コピーしてきている。

シンボリックリンクを使わない理由は、gulp build時のモジュールの依存解決ができずmodule not foundになるものがあったため。うまい方法がわからず、とりあえず実ファイルをコピーするようにした。

capistrano3では?

そもそもcapistranoがnpmに対応しているので、きっとこんなことやらんでも済むのかなー。
https://github.com/capistrano/npm/