MANA-DOT

PIXEL ART, PROGRAMING, ETC.

githubのwebhookを使って、push時に自動でサーバーを更新させる

github-logo

このサイトのテーマはgithubで管理しています。

ただgithub上でソースを管理し

ローカルで修正 → githubにpush → Webサーバーでpull

としても便利なのですが、githubにはwebhookという機能があり、githubレポジトリに変化があった時に任意のURLを叩いてもらうことができます。 この機能を使うことでレポジトリにpushした時に自動的にサーバーを更新することができます。

Webサーバーの設定

まず、Webサーバーにgithubから叩いてもらうプログラムを置きます。 今回はこのサーバーにはWordpressのためのPHPが入っているので、PHPで以下のように書きました。

hook.php

<?php

$LOG_FILE = dirname(__FILE__).'/hook.log';
$SECRET_KEY = '** secret **';

if ( isset($_GET['key']) && $_GET['key'] === $SECRET_KEY && isset($_POST['payload']) ) {
    $payload = json_decode($_POST['payload'], true);
    if ($payload['ref'] === 'refs/heads/master') {
        `cd /path/to/repository; git pull origin master`;
        file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." ".$_SERVER['REMOTE_ADDR']." git pulled: ".$payload['head_commit']['message']."\n", FILE_APPEND|LOCK_EX);
    }
} else {
    file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." invalid access: ".$_SERVER['REMOTE_ADDR']."\n", FILE_APPEND|LOCK_EX);
}

さすがに誰でも叩けてしまうのは気分が悪いので、気休め程度にsecret_keyを用意し、secret_keyが一致するときのみ処理を行います。

githubはpayloadとうパラメータでコミットに関する情報をPOSTしてくるので、これを見てmasterの時のみgitのpullを行うようにしています。

また、適当にログも吐かせています。

githubの設定

テーマを管理しているレポジトリのsettingsを開き、

Service Hooks → WebHook URLs

と開き、URLに上で用意したプログラムのURLを入れます。

webhook

これで、githubにpushした時に、自動で上のプログラムが叩かれ、webサーバー上のレポジトリにpullされ、サイトが更新されます。

参考