Help us understand the problem. What is going on with this article?

bitbucketからの自動デプロイ

More than 3 years have passed since last update.

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

abeyuya
Rails, AWS, Firebase, Swift, Objective-C, Serverless Framework, Node.js, JavaScript, Typescript, React.js, ReactNative
http://nkk.hatenablog.com/
sikmi
しくみ製作所株式会社は、世の中の「しくみ」を素敵にするためのソフトウェア開発集団です。オフィスのない弊社は、メンバー全員リモートワークです!
https://sikmi.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away