Posted at

windowsサーバーでgithubのWebhooksから自動で同期する

More than 1 year has passed since last update.


githubにプッシュするとサーバーで自動デプロイしてほしい

本番サーバにデプロイする時にクライアントでpushして本番サーバにログインしてgit pull

ってのは面倒くさい

いろいろググると出て来るのはLinuxサーバーでPHPを扱うパターンの話

Windowでやるためのメモ書き


サーバーのIPの穴あけ設定

githubのIPはhttps://api.github.com/meta

で取得できるらしいので

githubのAPIで叩かれる穴あけの設定をする必要があります


IISの設定

後述しますが管理者権限でgitコマンドを実行したいのでアプリケーションIDを

私の環境だとApplicationPoolIdentityからadministratorに変える必要がありました

①アプリケーションプールの追加



②WEBHOOKなど適当な名前で設定



③追加後右クリックで詳細設定を開く



④プロセスモデルにあるIDをクリックしてカスタムアカウント設定



⑤administratorに変更


APIの設定

叩かれるプログラムを書くのですが

私はC#.Netで適当に


Default.aspx.cs

public partial class _Default : System.Web.UI.Page

{
protected void Page_Load(object sender, EventArgs e)
{
やりたいこと
}
}

こんな感じの受信装置を作りました。

使い慣れた言語を使えばよいと思います


やりたいことの設定

git コマンドを実行したいのでgit for windowsのインストール時に

コマンドプロンプトからgitコマンドの許可(git.exeにPathを通す)してあるなら

コマンドプロンプトを起動してgitコマンド書けばよさそうです


C#.Netでの例

System.Diagnostics.Process p = new System.Diagnostics.Process();

p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardInput = True
p.Start()
System.IO.StreamWriter sw = p.StandardInput;
sw.WriteLine("cd C:\クローンしたフォルダ");
sw.WriteLine("git pull");
sw.WriteLine("exit");
p.Close()

受信装置をwwwrootにおいてさっき設定したIISのアプリケーションにする


Webhooksの設定

https://github.com/(チーム)/(リポジトリ)/settings/hooks

で設定できる。リポジトリのsettingsタブをクリックしてWebhooks

Payload URLにさっき作った受信装置のURLを書いて

Just the push event.にチェックの上登録

登録時にgithubからテストでキックされるので結果を確認する


fetchが上手くいかないことに気がつく

上記の設定だとgit fetchが上手くいかないのでpullもうまくできない

いろいろ調べたがwindowsの仕様でログインしているユーザーが居ない時に

ネット接続等に制限が有りできないらしい

サーバーに常にログインしている状態にしておくことで解決。

私はサーバーで作業が終わったらサインアウト等したいので

タスクスケジューラで無名ユーザーに何かを常にやらせておくことで誰かがログインしている状態を維持しています


その他


github WebHooksのSecretを使いたい

JSON形式で送られてくるPayloadを取得してHMACSHA1を使ってkeyと暗号化したものが

X-Hub-Signatureのヘッダー情報と一致していれば良いらしいが

なぜかうまくできない。ググると出て来るRubyで書かれているコードやPHPのコードをC#に移植したが上手くいかなかった。今後の課題。

私は

Payloadにある "commits": ["author": {"name":"ほげほげ"}]で特定のユーザーのCOMMITだけに反応するようにできるのでそれを鍵扱いにしています。URLにGETでKEYを足すのも簡単で良い。


特定のブランチのプッシュにだけ反応してほしい

Payloadの"ref"にブランチの情報があるので比較すると良い


自動で同期した差分が欲しい

コマンド実行のgit pullのところでpullせずに

git fetch -p

git diff HEAD origin/master >> diff.txt

git reset --hard origin/master

で差分が簡単に手に入るかと思います。