5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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
で差分が簡単に手に入るかと思います。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?