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

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

ただいまの
回答率

91.25%

  • Git

    915questions

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

  • GitHub

    538questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 37

sixth13

score 12

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

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

<?php
$user_id     = '【さくらのサーバーID】';
$git_dir     = '/home/' . $user_id . '/git/repo/【リポジトリ名】.git';
$work_tree   = '/home/' . $user_id . '/www/【公開ディレクトリ】/';
// logファイル
$log_file    = '/home/' . $user_id . '/log/deploy.log';
// Gitコマンドパス
$git_command = 'git';

$secret_key = '【記号以外の半角英数字でパスワードを設定】';

if ($_GET[key] === $secret_key){
    exec($git_command . ' --git-dir=' . $git_dir . ' fetch');
    exec($git_command . ' --git-dir=' . $git_dir . ' --work-tree=' . $work_tree . ' checkout -f master');
    $commit_hash = shell_exec($git_command . ' --git-dir=' . $git_dir . ' rev-parse --verify HEAD');
    file_put_contents($log_file, date('r') . " Ref: " .  $ref . " Commit: " . $commit_hash . "\n", FILE_APPEND);
}

しかし、様々なリポジトリでリモートへ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した時だけにできますでしょうか。
大変お手数ではございますがご教示いただければ幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

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

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

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

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

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

$target = $json -> ref;

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

<?php
$user_id     = '【さくらのサーバーID】';
$git_dir     = '/home/' . $user_id . '/git/repo/【リポジトリ名】.git';
$work_tree   = '/home/' . $user_id . '/www/【公開ディレクトリ】/';
// logファイル
$log_file    = '/home/' . $user_id . '/log/deploy.log';
// Gitコマンドパス
$git_command = 'git';

$secret_key = '【記号以外の半角英数字でパスワードを設定】';

if ($_GET[key] === $secret_key){

    /*----------- ここから追加 -----------*/
    if (json_decode($_POST['payload'])->ref !== 'refs/heads/master') {
        return; // ブランチが master 以外の場合は return して終了
    }
    /*----------- ここまで追加 -----------*/

    exec($git_command . ' --git-dir=' . $git_dir . ' fetch');
    exec($git_command . ' --git-dir=' . $git_dir . ' --work-tree=' . $work_tree . ' checkout -f master');
    $commit_hash = shell_exec($git_command . ' --git-dir=' . $git_dir . ' rev-parse --verify HEAD');
    file_put_contents($log_file, date('r') . " Ref: " .  $ref . " Commit: " . $commit_hash . "\n", FILE_APPEND);
}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/16 15:46

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

    キャンセル

  • 2018/01/16 16:56

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

    キャンセル

  • 2018/01/16 17:17

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

    キャンセル

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

ただいまの回答率

91.25%

関連した質問

同じタグがついた質問を見る

  • Git

    915questions

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

  • GitHub

    538questions

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