話題の記事

node.jsアプリのデプロイにやさしい grunt-rsync

2013.02.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

ちょっとデプロイしてスマホで確認したい、皆に見てもらって感想が欲しい、とにかく直ぐにデプロイしたい。そんな時に便利なgrunt.js用のタスクのgrunt-rsyncです。

rsyncコマンド知ってますか?

僕は知りませんでした(汗。ファイル群の同期を取る用途のコマンドです割と古くからあるみたいです。多くのUnix系環境にデフォルトで入っているようです。名前の通り、ファイルの同期を取るのがこのコマンドの仕事で、ローカル同士でもリモートともSCP経由などで同期を取れるようです。
詳しくはWikiで。

grunt-rsyncパッケージ

rsyncwrapperというrsync用のパッケージを使用しているgrunt用タスクです。もっとシンプルにrsyncをラップしている grunt-rsync-2 というのも存在しますが、コピーに失敗してもがエラーが出なかったのでこちらの方がいいと思います。
https://github.com/jedrichards/grunt-rsync
制限としてrsyncがコピー元、コピー先どちらにも存在する必要があります。また、sshでログインする際に公開鍵認証などでパスワードが無い状態でログインできるように設定しておく必要があります。

少し設定

grunt-rsyncのインストール

$ npm install grunt-rsync

rsyncコマンドの確認

おそらくだいたい入っていますが、一応コピー元、コピー先で必要なので確認します。

$ rsync --version

.ssh/config の設定

ssh -i オプションで鍵の場所を指定しなくてもログインできるように~/.ssh/config を以下のように設定します。

host 54.248.225.1xx
 User loginuser
 port 22
 Hostname 54.248.225.1xx
 IdentityFile ~/.ssh/hoge-key.pem
 IdentitiesOnly yes

接続確認

$ ssh 54.248.225.1xx

接続できれば成功です。

grunt.js の設定

gamodule.exports = function( grunt ) {
  'use strict';
  grunt.initConfig({
    copy: {
      target: {
        files: {
          'dist/': ['config/**', 'libs/**', 'models/**', 'public/**', 'routes/**', 'views/**', '*.js', '*.json'],
        }
      }
    },
    rsync: {
      dist: {
          src: "./dist/",               // コピー元ディレクトリ
          dest: "~/app",                // コピー先ディレクトリ
          host: "54.248.225.1xx",       // コピー先ホスト
          recursive: true,              // 再帰的にディレクトリを走査する
          syncDest: true,               // コピー先に存在しないファイルを削除する
          exclude: [".git*","*.scss"],  // 除外ファイル
      },
    }
  });    
  grunt.loadNpmTasks('grunt-rsync');
  grunt.registerTask('dev', 'copy rsync');
};

こんな感じで dev という名前でタスクの設定をしました。 例ではデプロイ用にdistに一旦集めたファイルをリモートにコピーしています。

$ grunt dev
Running "rsync:dist" (rsync) task
./dist/ > 54.248.225.1xx:~/app done
rsync ./dist/ 54.248.225.1xx:~/app --rsh=ssh --recursive --delete --delete-excluded --exclude=.git* --exclude=*.scss

Done, without errors.

おおっ、rsyncが成功したようです。(リモート側も確認しましょう) かなり便利ですね〜。

まとめ

シェルスクリプトやJenkinsでも代用できるとは思いますが、Node.js環境での親和性の高さ、設定の簡単さなどでオススメできます。プロジェクトのはじめにこのタスクを設定して楽ちん開発しましょう。
ちなみに次期バージョンの0.4xからはCoffeeScriptで設定が書けるようなので、ますます好きになちゃいまっくすぅ〜