fbpx

メニュー

Megacat v2

Githubにpushしたら自動テーマ更新する恐怖のWordPressプラグインを作った

高橋文樹 高橋文樹

この投稿は 10年半 前に公開されました。いまではもう無効になった内容を含んでいるかもしれないことをご了承ください。

WP-Dというブログがありまして、そちらで2ヶ月ほど前に「もうFTPを利用することは止めて、Gitを使おう。そのほうがメリットが多いよー」 という記事がはてなブックマークでホッテントリ入りするということがありました。

ブコメの反応をまとめると……

  • DevOpsとかいってんのに世間はまだこのレベルか嫌になるな
  • FTPとGitって違うじゃん、何言ってんの
  • サイトの管理をGitでできるわけないじゃん

という感じでした。

この記事を書いたメガネさんはデザイナー/ディレクター出身で黒い画面を勉強中、言葉足らずな部分はあったと思いますが、それらの心ないブコメを読み、大変傷つきました。そして傷心のあまり失踪、渋谷セルリアンタワーの屋上でカラスについばまれている無惨な腐乱死体として発見されました。まあ、嘘なんですけど。

それはともかく、上記で紹介した方法はGitにpushした後にサーバにログインしなければなりません。僕はコマンドラインが嫌いなので、できればサーバにログインせず、git pushした瞬間にターミナルを終了し、あとは勝手にやっといてよと思うわけです。で、そういうのを作りました。

プラグイン名: Giploy

名前はGiployといいます。Githubリポジトリで管理してます。ライセンスはMIT。できることはこんな感じです。

  1. サーバに存在するテーマとプラグインのうち、gitリポジトリであるものを管理対象として登録できる
  2. 管理対象になったリポジトリからGithubサービスフック用のURLが発行される
  3. URLをサービスフックに登録すると、Githubから通知を受け取り、リポジトリをpull(submoduleがあれば、submodule update)する
  4. pullの結果をメール送信

これだけです。

実際の使い方

このサイトで試してみました。テーマはGithubで管理しているので、そちらを使います。サーバにはすでにリポジトリをクローン済み。wp-content/theme/takahashifumiki というディレクトリがgitリポジトリですね。

まず、PHPがgitを呼び出せるようにGitのバイナリパスを保存します。PHPからだとサーバのユーザ設定によってはwhich使ってもgitの場所がわかんないことがあるので、がんばって入力します。

Gitのバイナリへのパスを保存
Gitのバイナリへのパスを保存

続いて、「登録」というリンクからディレクトリを選択して保存すると、リポジトリ一覧に表示されるようになります。ここでGithubに登録する通知用URLが取得できます。

通知用URLを取得
通知用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という表記に変えてみましょう。

AboutをAbout meに変更
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ではなく、人の心

すべての投稿を見る

高橋文樹ニュースレター

高橋文樹が最近の活動報告、サイトでパブリックにできない情報などをお伝えするメーリングリストです。 滅多に送りませんので、ぜひご登録お願いいたします。 お得なダウンロードコンテンツなども計画中です。