Git + CI + lftp で自動アップロードする方法

このエントリーをはてなブックマークに追加

最近、制作において手動で FTP のアップロードをすることが全くなくなった(´°ム°`)です。

Git を使い始めたら、 FTP を使うことがほぼなくなったのですが、依頼内容によっては FTP でアップロードまでしなければならない時があったりします。

そんな場合、最近では Git に Push したら CI が自動でそれを検知して lftp でミラーリングアップロードされるようにしています。

まだ FTP でアップロードしているの???

制作会社によっては、 FTP でのアップロードはまだまだ使われているので、案件によっては、アップロードするまでを対応しなければならないこともあったりします。

しかし、手動でのアップロードだと、複数人での作業だと気をつけていても先祖返りの問題おきたり、誰かがアップロードしたのを取り込まなきゃ行けなかったり、何かと面倒です。一人で使ったとしても、アップ漏れやディレクトリ違いなんかが起きることもよくありました。

そんな問題を起こすのはもういやになったので、今は全部自動化させてアップロードできるようにしています。

Git + CI

ここは今回は余談程度。

昨年 VPS を契約してからは、GitLab と GitLab CI を入れて、pushされたらデモサーバーに展開(rsync等)されるような仕組みを構築しました。

2013 年を振り返って勉強したツールなどのまとめ

CI ツールは、インストールなしで使うなら Travis CI とか サーバーにインストールして使うのなら、Jenkins 先生なんかが有名なのですが、自分は GitLab を導入した際に、 GitLab CI も導入してみたので、これを使っています。

GitLab CI

機能的に言えば Jenkins 先生のほうがはるかにできることは多いのですが、そこまで必要ないのと、動作が軽めのものを利用したいというのもあり、 GitLab CI を活用しています。

何より、GitLab との連携が楽ですからね。

CI って必須???

先に CI が必須かどうか書いておこうと思うのですが、結論からいうと、不要です。

Git さえあれば事足りるはずです。

Git にはフックがあるので、必要なフックにコマンドを書いてしまえばいいだけだったりします。

Git - Git フック

なので CI の導入が面倒な方はフックを利用してみてください。

簡単な方法としては、下記が参考になるかと思います。

git hookでサイトを更新、やってみた - Qiita

サーバー側でも $ git pull してしまうのが早いですよね。

Git とか CI 使うとかのことはこのへんまで。

lftp とは?

ダラダラ前置きかいてしまったのですが、本題はここ、lftp について。

lftpとは???

LFTPは、UNIXおよびUnix系システム向けのコマンド行ファイル転送プログラム(FTPクライアント)の1つ。Alexander V. Lukyanov が開発し、GNU General Public License でリリースされている。

FTPだけでなく、プロトコルを含んだURLの指定でFTPS、HTTP、HTTPS、HFTP、FISH、SFTPも使える。特に便利な機能は、FXP(クライアントを経由せずに、2つのFTPサーバ間でデータを転送させるプロトコル)をサポートしている点である。

引用元:Lftp - Wikipedia

コマンドで FTP のアップロードができるよ!というクライアント。FTPのコマンドでは足りないので、最新版をすべてアップロード!みたいなミラーリングでアップロードするような場合は、 lftp を使えばコマンド一つで終わります。

lftp でミラーリングアップロードするコマンド

私の場合は下記のようにしてアップロードしています。

lftpのミラーリングアップロードコマンド

lftp -u username,password -e "mirror -Rev -X .htaccess htdocs/. public_html/." server.com

上記の例は、server.com のサーバー にusernameとpassword を使ってアクセスして、 ローカルの htdocs の中身を public_html に .htaccess を除いて ミラーリングアップロードということをするコマンドになります。

少し細かい部分説明をすると、 最初の -e は mirror コマンドに複数のオプションを付けられるようにする lftp のオプションです。 また、 そのあとの -Rev は mirror のオプションです。 -R がローカルからサーバーへのミラーリングにするオプション(入れないとサーバーからローカルへのミラーになるので注意)で、 まんなかの -e がローカルにないファイルをミラー先でも削除をするオプションで、最後の -v が 動作のプロセスを全部出力してくれるオプションです。そのあとの -x はスキップするファイルの指定。

オプションや lftp の詳しい使い方は、下記を参考にしていました。

blog.paz-para.com » Blog Archive » lftpでミラーリング(2)

自分はこの lftp のコマンドを、Git の push を契機に動かして、Git にいれた最新の状態がサーバーにアップロードされるようにしています。

FTP で 必要ファイルのみ手動でアップロードするのもいいのですが、ヒューマンエラーは起きてしまうものなので、出来る限りそれを少なくするためにも、サーバーへのアップロード方法を見なおしてみてはいかがでしょうか?