Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

どんな劣悪環境でも負けないためにvimrcをダウンロードできるようにした。

世の中には「gitがインストールされていない」というおぞましい環境が存在します。弊学の演習室とかね。そういった、dotfilesを使うことすらできない劣悪環境でプログラミングしなければならないとき、せめてvimrcだけでも使えるようにしておこうと思って整備しました。

今回実装したもの

必要最低限の設定を詰め込んだ1ファイルのvimrcをダウンロードできるようにしました(僕向けにカスタマイズしてあるので他の人が使うことは前提にしておりません)。このファイルを~/.vimrcとして置くだけで最低限の快適さを得ることができます。

https://pandanoir.net/vimrc

こちらからダウンロードができるようになっています。GitHubのWebhooksを使っているので、常に最新の状態になっています。

仕組み

  1. dotfilesが更新されたらWebhooksが起動する
  2. 指定したURLにPOSTリクエストが飛ぶ
  3. Secret KeyをつかってGitHubからのリクエストか確認
  4. git pullする
  5. vimrcを1つのファイルにまとめる(普段は編集しやすいように複数ファイルに分かれている)

このようになります。どうせなので、WebhooksをPHPで書くやり方も解説します。

1. WebhooksにURLを登録する

まず、更新をチェックしたいリポジトリのSettingsに行きます(自分のリポジトリでないと設定できません)。すると、Webhooksという項目があるのでクリックします。

f:id:panda_noir:20190812174445p:plain

Add hookを押すと以下の画面になります。ここで入力したURLにPOSTが飛ぶので、好きなURLを設定してください。

Secret Keyは公式にも書いてありますが、ruby -rsecurerandom -e 'puts SecureRandom.hex(20)'を使うなどして生成してください。

f:id:panda_noir:20190812174457p:plain

これでGitHub上の設定は終了です。

2. 受け取るプログラムを書く

今回はPHPで書きますが、他の言語でも処理の流れは変わりません。

<?php
$SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

$sig = array_key_exists('HTTP_X_HUB_SIGNATURE', $_SERVER) ? $_SERVER['HTTP_X_HUB_SIGNATURE'] : "";
$request_body = file_get_contents('php://input'); // シグネチャを確認するために必要
$hmac = "sha1=" . hash_hmac('sha1', $request_body, $SECRET_KEY);
if (!hash_equals($sig, $hmac)) {
    // ハッシュが一致していなかった
    echo "permission denied.";
    http_response_code(403) ;
    exit;
}
// ここで実行したい処理を行う
echo "successed!";

公式にはSecret Tokenをハードコーディングするなとありますが、めんどくさかったのでハードコーディングしました(ここ以外で使う予定も特になかったので)。

HMACを使ってhashを計算して一致しているか確認しているだけのコードです。

参考