imoniの開発Blog

    前回でBitbucketのWebhooksを使って、 自動デプロイできるようになりました。

    しかし、masterブランチ以外のpush操作でも自動デプロイ処理が走ってしまいました。

    なので、今回、特定のpush操作でのみ、自動デプロイ処理が動作するようにしたいと思います。

    ※ここで紹介するサーバーのOSはCentOS7、WebサーバソフトはApacheです


    HTTPヘッダでの判別を考える

    まずは、HTTPヘッダでの判別を考えたいと思います。

    リポジトリのページを開きます。

    「設定」→「Webhooks」を選択して、前回追加した Webhookの「View requests」を押します。

    任意の行の「View details」を押します。

    「Request」の「Headers」に表示されているのが、HTTPヘッダのようです。

    「X-Event-Key」、「User-Agent」、「X-Hook-UUID」、「Content-Type」が判別に使えそうです。

    という判別ができそうです。


    PHPでHTTPヘッダを判別

    では、上記の判別を、PHPで書きたいと思います。

    <?php
    $headers = getallheaders();
    if($headers == false)
    {
        return;
    }
    if($headers["User-Agent"] !== 'Bitbucket-Webhooks/2.0')
    {
        return;
    }
    if($headers["X-Hook-UUID"] !== <表示されていたUUID文字列>)
    {
        return;
    }
    if($headers["X-Event-Key"] !== 'repo:push')
    {
        return;
    }
    if($headers["Content-Type"] !== 'application/json')
    {
        return;
    }
    
    // 以下は前回の自動デプロイ処理
    ...
    

    getallheadersでHTTPヘッダを取得できます。取得が失敗した場合はfalseが返ります。

    それぞれのヘッダ項目の比較に、先程表示されていた値を使います。

    この判別処理により、ブラウザのURL欄で

    http://<公開Webサイトのドメイン名>/<PHPファイル名>.php?key=<自動デプロイパスワード>

    を入力しても、自動デプロイ処理が走らなくなります。



    JSONデータでの判別を考える

    上記の処理で、JSON形式のデータが受け取れる判別までできました。

    ここからは、JSONデータでの判別を考えます。

    HTTPヘッダを確認したページで、「Body」の「Show request body」を押します。

    JSONデータのフォーマットが表示されるかと思います。

    {
      "push": {
        "changes": [
          {
            "forced": false,
            "old": {
                ...
            },
            "created": false,
            "commits": [
                ...
            ],
            "truncated": false,
            "closed": false,
            "new": {
              "type": "branch",
              "name": "master",
              ...
            }
          }
        ]
      },
      "repository": {
          ...
      },
      "actor": {
          ...
      }
    }
    

    「push」の「changes」の「new」にある、「type」、「name」が判別に使えそうです。

    という判別ができそうです。


    PHPでJSONデータを判別

    では、上記の判別を、PHPで書きたいと思います。

    <?php
    ...
    // 以上がHTTPヘッダ判別処理
    
    $json_string = file_get_contents('php://input');
    $json = json_decode($json_string);
    if($json->push->changes[0]->new == null)
    {
        return;
    }
    if($json->push->changes[0]->new->type !== 'branch')
    {
        return;
    }
    if($json->push->changes[0]->new->name !== 'master')
    {
        return;
    }
    
    // 以下は前回の自動デプロイ処理
    ...
    

    file_get_contentsとjson_decodeでJSONデータを取得できます。

    これで、masterブランチへの変更であるか、が判別できるようになりました。


    いろいろな処理を加えて便利にしていこう

    以上で、判別処理も加えた自動デプロイ処理ができました。

    他にも、「ログを残す機能」など、追加したら便利な機能もあると思います。

    自分でイケてる処理にしていってください。


    コメント

      コメントを投稿する