LoginSignup
150
153

More than 5 years have passed since last update.

bitbucketからの自動デプロイ

Last updated at Posted at 2013-03-02

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サイトを自動的に同期させる

150
153
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
150
153