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で適当に
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コマンド書けばよさそうです
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
で差分が簡単に手に入るかと思います。