WP-Dというブログがありまして、そちらで2ヶ月ほど前に「もうFTPを利用することは止めて、Gitを使おう。そのほうがメリットが多いよー」 という記事がはてなブックマークでホッテントリ入りするということがありました。
ブコメの反応をまとめると……
- DevOpsとかいってんのに世間はまだこのレベルか嫌になるな
- FTPとGitって違うじゃん、何言ってんの
- サイトの管理をGitでできるわけないじゃん
という感じでした。
この記事を書いたメガネさんはデザイナー/ディレクター出身で黒い画面を勉強中、言葉足らずな部分はあったと思いますが、それらの心ないブコメを読み、大変傷つきました。そして傷心のあまり失踪、渋谷セルリアンタワーの屋上でカラスについばまれている無惨な腐乱死体として発見されました。まあ、嘘なんですけど。
それはともかく、上記で紹介した方法はGitにpushした後にサーバにログインしなければなりません。僕はコマンドラインが嫌いなので、できればサーバにログインせず、git pushした瞬間にターミナルを終了し、あとは勝手にやっといてよと思うわけです。で、そういうのを作りました。
プラグイン名: Giploy
名前はGiployといいます。Githubリポジトリで管理してます。ライセンスはMIT。できることはこんな感じです。
- サーバに存在するテーマとプラグインのうち、gitリポジトリであるものを管理対象として登録できる
- 管理対象になったリポジトリからGithubサービスフック用のURLが発行される
- URLをサービスフックに登録すると、Githubから通知を受け取り、リポジトリをpull(submoduleがあれば、submodule update)する
- pullの結果をメール送信
これだけです。
実際の使い方
このサイトで試してみました。テーマはGithubで管理しているので、そちらを使います。サーバにはすでにリポジトリをクローン済み。wp-content/theme/takahashifumiki
というディレクトリがgitリポジトリですね。
まず、PHPがgitを呼び出せるようにGitのバイナリパスを保存します。PHPからだとサーバのユーザ設定によってはwhich使ってもgitの場所がわかんないことがあるので、がんばって入力します。
続いて、「登録」というリンクからディレクトリを選択して保存すると、リポジトリ一覧に表示されるようになります。ここでGithubに登録する通知用URLが取得できます。
さて、ここまでできたらGithubに移動してこのURLを保存します。場所はリポジトリのSettings > Webhooks & Services > Add webhook と移動し、Payload URLです。設定サンプルはプラグインの管理画面に書いてありますが、次の通りです。
- Payload URL
- WordPressで発行されたURL。
- Payload Version
- どっちでもいいです。
- Which events……
Just the push event
を選んでください。一応、pushイベントにだけ反応するようにしていますが、そんなに試していないので、何が起きるかわかりません。
これで準備完了。では、試しにコミットしてみます。僕のサイトのトップページにはAboutと書いてあるのですが、About meという表記に変えてみましょう。
コミットすると、無事変わっていますね。ファイルをアップロードしたりする必要はありません。
メールも届きました。僕のサーバはメールサーバを外部においており、しかもpostfixを変な風にいじったので届きませんでしたが……
というわけで、非常に動いているっぽいですね。お疲れさまでした。
今後の開発
僕が必要だと思った機能は持っているので、公式リポジトリにはアップせず、細々とメンテしていこうかと思っています。いずれにせよ、火曜日に思い立って水曜日に完成という感じなので、人柱を募集しています。
個人的にあってもいいかなという機能は次の通りです。
- ブランチの切替(ステージング環境と本番環境でブランチ変えたり。Gitflow的な使い方)
- Githubからのインストール(GithubのリポジトリURL入れるとクローンしてくれる)
- プライベートリポジトリとの連携
[429] [429] Client error: `POST https://webservices.amazon.co.jp/paapi5/getitems` resulted in a `429 Too Many Requests` response: {"__type":"com.amazon.paapi5#TooManyRequestsException","Errors":[{"Code":"TooManyRequests","Message":"The request was de (truncated...)
補足
使用技術について
Gitとの連携は teqneers/PHP-Stream-Wrapper-for-Git というのを使っています。execコマンドのラッパーですかね。
リポジトリの登録やGithubとの連携はほとんどWordPressの標準APIでまかなっていますが、gitコマンドだけはこれを利用しています。
標準出力で戻ってくるgitからの応答を正規表現でなんとかしたりするのは辛いので、大したことはやっていません。
セキュリティについて
セキュリティはこれぐらいやりました。
- IPフィルタリング(Githubからのみ受け付け。GithubにはIPフィルタリング以外の方法使えと書いてありましたが、めんどくさかったので)
- Nullバイト対策
- ディレクトリトラバーサル対策
Windowsサーバはあまり考慮していません。なんにせよ、穴があってもごめんなさいとしか言いようがありません。
また、.gitフォルダの保護についてはサーバの設定でなんとかしておいてください。Nginxならデフォルトで.gitをdenyしてるかと。
それ以前に自分のリポジトリにFacebook SDKのクレデンシャルが思いっきり書いてあって、びっくりしました。弱いのはgitではなく、人の心。