bitbucketからの自動デプロイ


gitでの話ですが、bitbucketにpushして自動でサーバにデプロイするまでの一連の流れをメモ
ネットで探すと見つかるのですが、ちょっとわかりにくかったので

開発初心者なのでいろいろよろしくないやり方も多いと思います
もしご指摘あれば頂けるとうれぴーです
こんなんでも誰かの役に立てばいいなと思いました

全体の流れとしては、
1. bitbucketにpush
2. (自動的に)bitbucketからサーバにPOST
3. PHPでPOST受けて、(自動的に)git pullする
って感じ

環境とか

下記の環境やら想定でやってます

  • bitbucketでgitでコード管理している
  • サーバ:さくらVPS 1Gプランのやつ
  • サーバでgit,PHPが動く

bitbucketの設定

  1. ログインしたら、右上の方にある歯車アイコンをクリック
  2. 左メニューのServicesをクリック
  3. 下のような画面になるので、プルダウンメニューからPOSTを選択し、Add serviseボタンをクリック
  4. すると画像のようにPOSTという項目が追加される
  5. URLにデプロイ先サーバのURL+deploy.phpを入力しSave

    例:http://yourdomain.com/deploy.php
    URLについては後で解説
    都合の良いものに変えちゃって下さい

この設定をすると、bitbucketにpushする度に指定したURLにPOSTしてくれます
ちなみに、今回は使っておりませんがPOSTの際にこんな感じのデータもやりとりしているので、もっといろいろやれそう

サーバ側の準備

これが結構めんどかった
開発初心者なので、いい勉強になりました
ちょいちょい sudo -u apache というのを使っておりますが、
これは権限の管理をapacheユーザやるためですねー

ここからはサーバコマンドライン
sudo -u apache ssh-keygen

作成先は /var/www/.ssh/
pass phraseはなし
作成したid_rsa.pubをbitbucketのDeployment keysに追加
さっきの歯車アイコンのとこにあります

サーバコマンドライン
sudo -u apache git clone [自動デプロイしたいbitbucketのリポジトリ]

サーバ側のプログラム

サーバ側にはPOSTを受け取り処理するPHPファイルを置きます

deploy.php
<?php

if($_SERVER["REQUEST_METHOD"] != "POST"){
    // GETによるアクセス
}else{
    // POSTによるアクセス
    $cmd = '. /var/www/html/update.sh';
    $retstr = system($cmd, $res);
    $fp = fopen("deploy.log", "a");
    fwrite($fp, date('c')."\n");
    if ($retstr === FALSE || 0 !== $res) {
        fwrite($fp, "cmd false\n");
    } else {
        fwrite($fp, $res."\n");
    }
    fclose($fp);
}
?>

このPHPファイルでは下記の/var/www/html/update.shを読み込んでます
git pullしてるだけです
現状だとどんなbranchがpushされてもgit pullします
特に触らなければbranchはmasterのままなので、masterが更新されたときだけWebには反映されます

update.sh
#!/bin/sh
cd /var/www/html/[rep-name]
/usr/bin/git --git-dir=/var/www/html/[rep-name]/.git pull

まとめ

とりあえずこれで、bitbucketにpushして自動的にサーバに更新を反映できます
超重要な注意点ですが、このまま使うと誰でもこのPHPにPOSTアクセスすると無条件にgit pullしちゃうという超危険な状態です
POST元がbitbucketのときだけgit pullするみたいな書き方しないとですね
(初心者なのでよくわからない)

デプロイって書いちゃいましたが、これはgitの更新だけですね^^;
アプリケーションだったら、app restart的な処理をupdate.shに書き加える必要があります
(現在nodeアプリ開発中ですが、うまくできない)

参考:gitにpushしたwebサイトを自動的に同期させる