#目標
LaravelでGit push をwebhookで自動化したい。
私は未解決です。が、一部解決したことだけ書いています。
#失敗1 webhook.phpへのパスが通らない
自動化phpの作り方は検索すると何件か出てきたので参考にやってみましたが、そのphpファイルをどこに置くか、URLはどうなるのかので苦戦しました。
みなさん、そこのところ黒塗りにして隠しているので困りました。
Webhookの設定欄の近くで以下のように404が出ている時はおそらくパスが通っていない。
解決策
さくらサーバー側のディレクトリで、
~/home/ユーザー名/www/プロジェクト名
のプロジェクト名フォルダの直下にwebhookの書いてあるphpを置く。
(www/以下ならどこでも良さそうですがここではLaravel開発を前提にプロジェクトフォルダがあるものとしています。)
するとURLが
http://ユーザー名.sakura.ne.jp/プロジェクト名/deploy.php
Payload URL のところに記入して登録する。
とりあえずこのファイルのパスは通ったようなので次はphpファイルの中身だろうか。
#解決法(2019/10/31追記)
上記のタイムアウトが起きた原因は公開鍵をGithubに登録していなかったからでした。
今までシェルでsshログインしてターミナルでpullしていましたが、webhookで自動化する場合はユーザー名とパスワードが入力できない(できるかもしれないが現状、私はそのphpコマンドがわからない。)
そのため、githubがイベントを通知してさくらネットのdeploy.phpが起動してもパスワードがないのでpermission deniedになっていたようです。
さくらネットのサーバー内で公開鍵と秘密鍵のセットを作り、githubのsettingページの鍵登録欄に公開鍵(テキストベースの文字列)をコピペして登録することで、githubとさくらネットの間でパスワード入力が免除されます。
deploy.phpの何がおかしいかまではログで教えてもらえないのでハマりました。
公開鍵の設定のやり方はこのページの一番下に参考にしたページのリンクを貼っておきましたのでそちらをみてください。かなり詳しく書いておられます。
ちなみにphpコードが構文エラーなどでコケている場合は下のように500エラーが表示されます。
なので、それが出ないでタイムアウトする場合はphp自体は反応しています。
deploy.phpの中身についてはサイトによって色々書かれていますが、
<?
echo "<p>webhook start</p>";
exec('cd /home/アカウント名/www/gitpullしていたディレクトリ名/',$op);
print_r($op);
exec('git pull');
echo "<p>webhook finish</p>";
?>
これだけで動きます。echoとprintは確認用にログ出してるだけなので実質二行です。
他の方は一行にまとめてる人が多いです。
exec()メソッドはクォーテーションの中の文字列をそのままターミナルに吐き出しているだけです。
つまり、1回目のexecで今までgit pullしてパスワード入力していたところに行って、
2回目のexecでプルしてるだけです。
もしコケる場合、execを消してechoの行だけにしてプッシュしてみてください。
ここのBody欄のログは自動プッシュに成功したかどうかじゃなくて、deploy.phpのprint系メソッドのログを出力しているだけなので、echoだけでテストするとイベントが通知、発火できているかどうかを確かめられます。
#参考にしたページ