imoniの開発Blog

    このブログのソースコードを、BitbucketのWebhooksを使って、 サーバーに自動デプロイできるようにした方法を紹介したいと思います。

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


    サーバーでGitを初期設定

    まずは、Gitをインストールします。

    yum install git

    CentOS7のyumのGitはバージョンが古いです、最新が良ければ、 ダウンロードしてくる必要があります。

    古くても今回の動作はすると思います。

    次に、リポジトリを置くディレクトリを用意します。

    mkdir /git

    用意したディレクトリに移動し、リモートリポジトリのミラーを作成します。

    cd /git
    git clone --mirror https://<ユーザー名>:<パスワード>@bitbucket.org/<ユーザー名>/<リポジトリ名>.git <リポジトリ名>.git
    

    この時、ユーザー名とパスワードも入力しておくと、今後、このリポジトリを操作するときに、 ユーザー名とパスワードを求められなくなります。


    手動デプロイ

    では、とりあえず、フェッチしてから手動でデプロイしてみます。

    cd /git/<リポジトリ名>.git
    git fetch
    GIT_WORK_TREE=/var/www/<公開ディレクトリ> git checkout -f <masterブランチ>
    

    これでデプロイ出来ました。


    PHPで書くと

    上記、「手動デプロイ」でやったことを自動でするために、同じ操作をPHPですることになります。

    PHPで書くと、

    exec('cd /git/<リポジトリ名>.git && git fetch');
    exec('cd /git/<リポジトリ名>.git && GIT_WORK_TREE=/var/www/<公開ディレクトリ> git checkout -f <masterブランチ>');
    

    となります。


    PHPファイルを作成

    では実際に動作するPHPファイルを作成したいと思います。

    <?php
    if ($_GET['key'] !== '<自動デプロイパスワード>')
    {
        return;
    }
    exec('cd /git/<リポジトリ名>.git && git fetch');
    exec('cd /git/<リポジトリ名>.git && GIT_WORK_TREE=/var/www/<公開ディレクトリ> git checkout -f <masterブランチ>');
    

    <自動デプロイパスワード>は、BitbucketのWebhooksから通知を送るために必要になります。

    このファイルを、/var/www/<公開ディレクトリ>に置いてください。

    ※ここでは、だいぶ簡単なコードにしていますが、ログを残す処理などを入れると便利です。


    各ディレクトリの所有者を変更

    Apacheで操作するディレクトリの所有者をApacheに変更します。

    cd /git/<リポジトリ名>.git
    chown -R apache:apache .
    cd /var/www/<公開ディレクトリ>
    chown -R apache:apache .
    

    BitbucketのWebhooksを設定

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

    「設定」→「Webhooks」を選択して、「Add webhook」ボタンを押します。

    「Title」は管理しやすい適当な名前にして、「URL」は

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

    として、「Save」ボタンを押します。

    これで、このリポジトリでpush操作をすると、サーバーに通知が行って自動デプロイが走るようになりました。

    ※ただ、masterブランチ以外へのpush操作でも動作してしまいます。

    masterブランチへのpushであることを判別する処理が必要ですね。

    それはまた次回やりたいと思います。


    コメント

      コメントを投稿する