質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Q&A

解決済

1回答

1486閲覧

githubのwebhookのタイミングをmasterにPUSHした時だけ発火したい

sixth13

総合スコア33

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

0グッド

1クリップ

投稿2018/01/11 02:47

現在さくらサーバー(スタンダード)にて下記を参考にしてPUSHのタイミングで
さくらサーバーに自動デプロイすることができるようになりました。

http://berry22.com/blog/bitbucket-sakura-auto-deploy/

php

1<?php 2$user_id = '【さくらのサーバーID】'; 3$git_dir = '/home/' . $user_id . '/git/repo/【リポジトリ名】.git'; 4$work_tree = '/home/' . $user_id . '/www/【公開ディレクトリ】/'; 5// logファイル 6$log_file = '/home/' . $user_id . '/log/deploy.log'; 7// Gitコマンドパス 8$git_command = 'git'; 9 10$secret_key = '【記号以外の半角英数字でパスワードを設定】'; 11 12if ($_GET[key] === $secret_key){ 13 exec($git_command . ' --git-dir=' . $git_dir . ' fetch'); 14 exec($git_command . ' --git-dir=' . $git_dir . ' --work-tree=' . $work_tree . ' checkout -f master'); 15 $commit_hash = shell_exec($git_command . ' --git-dir=' . $git_dir . ' rev-parse --verify HEAD'); 16 file_put_contents($log_file, date('r') . " Ref: " . $ref . " Commit: " . $commit_hash . "\n", FILE_APPEND); 17}

しかし、様々なリポジトリでリモートへPUSHを複数人で行っているとその度にWebhookが
発火するためさくらサーバーへの自動デプロイがうまくいかなくなる現象が置きます。

(さくらの中を見ると.git/index.lockが生成される、この現象もわかりません。。
上記のファイルを削除して暫く経たないとすぐkillされるが時間が経ってから手動で下記を行うと反映できる)

git --git-dir=/home/【さくらのサーバーID】/git/repo/【リポジトリ名】.git --work-tree=/home/【さくらのサーバーID】/www/【公開ディレクトリ】/ checkout -f master

どのようにかけばgithubのwebhookのタイミングをmasterにPUSHした時だけにできますでしょうか。
大変お手数ではございますがご教示いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

github の webhook を発火させるタイミングは制御できなかったかと思います。
よって、github の webhook のタイミングを master に push した時だけに限定することはできません。

ただし、今回の場合は master に push された時のみ自動デプロイが実行されるようにすることが目標かと思います。

であれば webhook が実行された際に、どのブランチへの push かが判別できれば良いかと思います。

github では webhook を発火させる際に様々な情報を payload として json 形式で POST してくれますので、

php

1$json = json_decode($_POST['payload']);

で情報が取れてきます。
(どんな情報が取れるかは
https://developer.github.com/v3/activity/events/types/#pushevent
をご参照ください。)

ブランチ名は ref に refs/heads/{ブランチ名} の形で入っているので

php

1$target = $json -> ref;

としたらブランチの情報が取れてきます。
今回は master の時のみ実行なので、まとめて、

php

1<?php 2$user_id = '【さくらのサーバーID】'; 3$git_dir = '/home/' . $user_id . '/git/repo/【リポジトリ名】.git'; 4$work_tree = '/home/' . $user_id . '/www/【公開ディレクトリ】/'; 5// logファイル 6$log_file = '/home/' . $user_id . '/log/deploy.log'; 7// Gitコマンドパス 8$git_command = 'git'; 9 10$secret_key = '【記号以外の半角英数字でパスワードを設定】'; 11 12if ($_GET[key] === $secret_key){ 13 14 /*----------- ここから追加 -----------*/ 15 if (json_decode($_POST['payload'])->ref !== 'refs/heads/master') { 16 return; // ブランチが master 以外の場合は return して終了 17 } 18 /*----------- ここまで追加 -----------*/ 19 20 exec($git_command . ' --git-dir=' . $git_dir . ' fetch'); 21 exec($git_command . ' --git-dir=' . $git_dir . ' --work-tree=' . $work_tree . ' checkout -f master'); 22 $commit_hash = shell_exec($git_command . ' --git-dir=' . $git_dir . ' rev-parse --verify HEAD'); 23 file_put_contents($log_file, date('r') . " Ref: " . $ref . " Commit: " . $commit_hash . "\n", FILE_APPEND); 24}

以上のように書くことで、 master へのプッシュが発生した場合のみにデプロイを実行させることが出来るかと思います。

投稿2018/01/16 04:56

ezaki

総合スコア204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sixth13

2018/01/16 06:46

ありがとうございます。試してみます!
sixth13

2018/01/16 07:56

無事にmasterブランチのみで動作しました。Hookの中も見てみると確かにrefs/heads/masterになってました、勉強になります。 ありがとうございました。
ezaki

2018/01/16 08:17

お役に立てたようで良かったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問