こんにちは、すぎもとです。
普段は別のブログに書いていますが、今回は社内のシステム環境の話だったのでこちらにポストしてみます。
Aegif のコーポレートサイトは静的サイトで構築されています。最近リニューアルしました。ところが記事の更新などがあったとき、マーケティングを担当にしている同僚が手で涙ぐましい修正をしていたことが判明しまして、JavaScript で一部の作業を自動化をすることにしたんですね。
そうやって、やはり複数人が係わるようになると、編集→更新の流れをもう少し楽にしたいなという話が出てきました。まずは社内の Git リポジトリ環境(GitLab)にサイトのソースを置くことに。でも、ここまでやったら、プッシュしたら自動で本サイトに反映したいということになりますよね。
Web サイトが置いてあるサーバは Git が使えないので、GitLab 側からFTPすることにしました。やったことは以下の通りです。
GitLab のあるサーバは Ubuntu 14.04 です。まずは git-ftp を導入します。デフォルトでやってみたら最新が落ちてこなかったので PPA を追加して、apt-getします。
# add-apt-repository ppa:resmo/git-ftp
# apt-get update
# apt-get install git-ftp
つぎに GitLab が管理している Git リポジトリにカスタムのサーバサイドフックを作成し、プッシュされたときに FTP されるように設定します。
GitLab の管理するリポジトリはサーバのローカルパスで言うと
/var/opt/gitlab/git-data/repositories/aegif/CorporateSite.git
みたいな場所に保管されます。このリポジトリ直下に
custom_hooks
ディレクトリを作成し、そのなかに post-receiveという名前でスクリプトを作成します。スクリプトは以下のような記述にしました。
#!/bin/bash
cd /path/to/tempdir/CorporateSite
git --git-dir=.git pull
git --git-dir=.git ftp push --branch master --user XXXX --passwd xxxxx ftp://xxxx.jp:21/pathtodir
このスクリプトのオーナーは git:git にしておき、実行権限を付けておきます(GitLabがキックするので)。なお Git コマンドを発行する行には上述の通り、 --git-dir=.git がないと怒られます。
注意点としては、普通の Git リポジトリなら custom_hooks 内で直接 git ftp できてしまうんですが、 GitLab が使う Git リポジトリは bare リポジトリなので、いったんサーバのローカル環境でで別の場所に取得してしてそこから FTP します。
ですので、サーバローカル内で手動 git clone を /path/to/tempdir/CorporateSite にしておきます。さらに FTP サーバ側に差分を送ることが出来るように、初回は手動で git ftp init をしてファイル群をアップロードしておきます。
以後はプッシュされると差分だけが上がるようになります。今回はステージング環境は存在しなかったので、master から直接本番環境にあげてしまっています。 けっこう時間がかかることが予想できたので nohupで起動させて放置しておきました。
nohup git ftp init --branch master --user XXXX --passwd xxxxx ftp://xxxx.jp:21/pathtodir > /path/to/git-ftp-log&
初回アップロードは1時間くらいかかりました。その後、試しにテストファイルを手もとからプッシュして、自社サイトの更新を確認しました。
こう書くとけっこう簡単に作業したか見えますが、思ったより時間がかかってしまいました。というのも git-ftp で出てくる記事が古いんですよね。おかげで、余計なライブラリとか入れちゃったり、bare リポジトリの存在をすっかり忘れて、アップロードできないと悩んだりして無駄に時間を費やしてしまいましたよ。
今こそほとんどワンライナーで出来ちゃいますが、昔はそこまで簡単じゃなかったようですね。イマドキの Web サーバはサーバのほうに Git が入ってたりしますし、そもそもサイト自体も動的なことがおおかったりするわけで、 FTP で更新するというので情報が少ないのも仕方ないですね。
今回、この試みで、うちの会社では技術者以外の同僚にも Git をつかってもらうことになりました。とりあえず GUI で使ってもらうべきだろうと SourceTree を入れてもらいましたが、 Mac 版と Windows 版でだいぶ構成が違ったり(更新担当者はどちらも使います)無償版でも無償ライセンスの登録が必要になっていたりと導入自体にハードルがあってなかなか大変。ひとまずはブランチなどを使わずに、「うっかり壊しても技術部門に相談してくれればもとに戻せるリポジトリ」みたいな扱いで master 直接プッシュでまずは運用をはじめてみました。
この非技術者による Git 運用についてはまた軌道に乗ったらお伝えできたらと思います。