WinSCPでサイトをdeployするbatファイル

2016/03/21

前回の記事で記事を書くところが効率化(?)できたので、deployも効率化します。

Hugo+GitHub+werckerでblogもCIだぜ!みたいなのがトレンドっぽいですが、そこまで仰々しくなくていいのです。 と言うか、deploy先はsshログインできない格安レンタルサーバーなのです。

ということで、FTPするbatファイルを書くことに。

素のFTPならコマンドラインで使えますが、セキュリティ面でちと抵抗が。SFTPだったりFTPSだったりを使いたいのでWinSCPの力を借ります。

WinSCPにはwinscp.comというCUIアプリが同梱されているのでこれを使います。 使い方やコマンドはScripting and Task Automation :: WinSCPを参照。

事前準備。

  • WinSCP 5.7.7をインストールしておく
  • winscp.comにパスを通しておく
  • GUI版のWinSCPを起動し、接続先のSessionをパスワード込みで保存しておく
    • こうしておくとコマンドライン側でパスワード入力を省略できるっぽいです

実際のコマンド群はスクリプトファイルに書くのでbatファイルはとってもシンプル。 ついでなのでhugoでblogを生成するところも一緒にやってしまいます。

@echo off

rem blogを生成
hugo

rem 同期
set LOCAL="%~dp0"
winscp.com /script=command\deploy_command.txt /parameter %LOCAL%

スクリプトファイルはこんな感じ。

option batch abort
option confirm off

# 接続
open ftps://user@example.com

# ローカルパスを変更
lcd %1%

# リモートパスを変更
cd /

# 同期
synchronize remote -criteria=size -transfer=binary -delete public backport/blog

exit

set LOCAL="%~dp0"でbatファイルの実行パスをLOCALという変数にセットしています。 ローカル、リモートともに毎回パスを明示しないと安定して動かないようだったのでこんな感じになりました。

パス周りはbatファイルの置き場所次第で調整が必要です。 単一のPCでしか使わないなら絶対パスを決め打ちしちゃったほうが確実かも。

-criteria=sizeがちょっと悩ましいポイント。 hugoはファイルを毎回再生成するので-criteria=timeだとHTMLが全部アップロード対象になっちゃうんですよね。 -criteria=sizeだと差分だけアップになるんですが、万が一更新前後でファイルサイズが変わらなかったらアップされない。 checksumで比較するオプションはないみたいだし。当面は運用でカバーですかねー。気が向いたときに全部アップする、とか。

ともあれ、コマンド一発でdeployできるようになりました。




関連(するかもしれない)記事


おススメ