git pushしたときにFTPしたりgruntタスクを実行する。

FTPしか使えないレンタルサーバーでの案件でGitを入れようとするとき、ソースの管理って結構大変だったりします。なので、git pushしたときに自動でFTPすると、非常に便利でした。

このgrunt-githooksと、grunt-ftpushを使ってこんなGruntfileを作ります。

module.exports = (grunt) ->


  grunt.loadNpmTasks "grunt-ftpush"
  grunt.loadNpmTasks "grunt-githooks"


  grunt.initConfig

    ftpush: {
      build: {
        auth: {
          host: 'example.com',
          port: 21,
          authKey: 'pass'
        },
        src: '',
        dest: '/path/to/dir',
        exclusions: ['.*','node_modules/*','.sass-cache/']
        keep: [],
        simple: true,
        useList: false
      }
    }

    githooks: {
      options: {
        dest: '.git/hooks',
        hashbang: '#!/bin/bash',
        template: './node_modules/grunt-githooks/templates/shell.hb',
        startMarker: '## GRUNT-GRUNTHOOKS START',
        endMarker: '## GRUNT-GRUNTHOOKS END'
      },
      setup: {
        'pre-push': 'deploy'
      }
    }

  grunt.registerTask 'deploy', ["ftpush"]

これを設定したら、以下のコマンドを実行します。

$ grunt githooks

これで.git/hooks/pre-pushが作成され、pushしたときにgrunt deployが実行されるようになります。grunt deployにこのコードだとFTPしか設定してありませんが、サーバーにアップロードする前にCSSやJSのコンパイル・結合・圧縮などを実行するとより、使い勝手がいいと思います。

例:https://github.com/torounit/torounit2015/blob/master/Gruntfile.coffee

サーバーによってはftpushではなく、grunt-rsync等を使ったほうが良い場合も多いですが基本はこんな感じで、push時にサーバーと同期を取る事ができます。

やっぱりいろいろ自動化しておくと便利で良いですね。ファイルの同期は手動でやるとだいたいろくな事が無いので、自動化の威力がいろいろ感じられて良いかなと思います。

note

  • gitにsourcetreeを使う場合、環境変数が読まれないので、command not found: grunt とか言われる場合があります。その場合、githooksのテンプレートをいじって、bashrcとかをexportすると良い感じになります。