git pushでバーチャルホスト設定やデプロイを自動で行う

ブランチを手軽に切れるのが魅力なGitちゃん。

ただ、Webアプリケーションとして、気軽に切った先進的で先鋭的で危ない感じのその新ブランチを他の人に動作を確認してもらうのは、ちょっと面倒。

開発者ならpullってdiffって見ろよって感じなんだけど、営業さんだったりディレクターさんだったりだとブラウザで確認できなくちゃね。というわけで、開発サーバにバーチャルホスト切って、サブドメインとかで設定するわけなんだけど、それが手間。

ブランチは気軽に切れるのに、環境は気軽に作れない。

post-receive を使おう

Gitにはpost-receiveという強力な仕組みがあるので、これを使います。

$git push origin new-branch

って新ブランチをリモートリポジトリにpushしたら、http://new-branch.example.com/ ってサブドメインで閲覧できるようになれば良い。

開発サーバのHTTPDは、nginxを利用し、ドキュメントルートは /var/www/vhosts/ 以下にサブドメイン名で設置するようにする。

まず、nginxのバーチャルホスト用設定ファイルのテンプレートを用意する。サブドメイン名をブランチ名として使う。

/etc/nginx/conf.d/virtualhost.conf.template

server {
    listen   80;
    server_name __BRANCH_NAME__.example.com;
    gzip on;
    gzip_types text/css application/xml application/x-javascript application/json;

    access_log /var/www/vhosts/__BRANCH_NAME__.example.com/logs/access.log;
    error_log /var/www/vhosts/__BRANCH_NAME__.example.com/logs/error.log;

    location / {
        root   /var/www/vhosts/__BRANCH_NAME__.example.com/htdocs/app/webroot/;
        index  index.php index.html index.htm;
        if (-f $request_filename) {
            break;
        }
        if (-d $request_filename) {
            break;
        }
        rewrite ^(.+)$ /index.php?q=$1 last;
        client_max_body_size 10M;
    }


    location ~ .*\.php[345]?$ {
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/vhosts/__BRANCH_NAME__.example.com/htdocs/app/webroot$fastcgi_script_name;
        fastcgi_intercept_errors on;
        include         fastcgi_params;
        client_max_body_size 20M;
    }
}

次に、nginxの設定ファイル生成 + Gitをcloneして新ブランチにcheckoutするようなスクリプトを作成する。引数としてカンマ区切りのブランチ名が渡ってくる想定。

autoload.sh

#!/bin/bash

createVirtualHost() {
    branchname=$1
    dirname=$branchname.exmaple.com
    echo $dirname

    cd /etc/nginx/conf.d/
    cp virtualhost.conf.template $dirname.conf
    sed -i "s/__BRANCH_NAME__/$branchname/g" $dirname.conf

    cd /var/www/vhosts/
    sudo -u webmaster git clone git@git.example.com:hoge $dirname
    cd /var/www/vhosts/$dirname
    sudo -u webmaster git checkout -b $branchname origin/$branchname

    /etc/rc.d/init.d/nginx restart
}

cd /etc/nginx/conf.d/

branchlist=$1
arr=$(echo $branchlist | tr "," "\n")
for x in $arr
do
    if [ ! -e ${x}.exmaple.com.conf ]; then
        echo $x
        createVirtualHost $x
    fi
done

あとは、post-receiveでautoload.shを叩けばいいだけなんだけど、Gitのリモートリポジトリサーバが開発サーバにない場合が多いので、SSHで開発サーバに入って叩くようにする。

create_virtualhost.php(Gitリモートリポジトリサーバ内)


exec('git branch', $branchLists);

$branchArr = array();
foreach ($branchLists as $val) {
	$val = str_replace(array(' ', '*'), '', $val);
	if ($val != 'master') {
		$branchArr[] = $val;
	}
}

exec('ssh user@exmaple.com autoload.sh ' . implode(',', $branchArr));

なぜかbashだとgit branchの結果がうまく取れなかったのでPHPを使ってる…。

/home/git/repositories/exmaple.com.git/hooks/post-receive

php /home/git/repositories/exmaple.com.git/hooks/create_virtualhost.php &

あとはpost-receiveに書いてあげればpushを受け取った時に自動的に実行される。

DNSのレコード登録だけが手動で設定する必要があるけど、AWSを使っているならRoute53とかでそれすらも自動設定できるようになると思う。もう少しスマートにやれる方法があれば良いな…。

いずれにしても、post-receive強力で魅力的。

Feed

最新記事

開発フローを独自進化させ続けている開発チームの話

こんにちは CTO の [@zaru](https://twitter.com/zaru) です。 スクラム開発をしている開発チームが、開発フローを独自進化させていて、それが良い取り組みだったので紹介しようと思います。 #...

235650?v=4
zaru
2017年11月20日

退職者を招いたLTイベントを開催した

こんにちは、ベーシック CTO [@zaru](https://twitter.com/zaru) です。 ベーシック開発部では毎月月末の金曜日にTGIFと称して、 ~~飲み会 + アナログゲームなイベント~~ 技術 LT 大会...

235650?v=4
zaru
2017年10月12日

山形ラボ、TGIFはじめました

こんにちは。株式会社ベーシック山形ラボの長谷川です。 いろんなところで書いたりなんだりしてますが、弊社には山形に「山形ラボ」というリモート拠点がありまして、そこで4人のエンジニアが働いております。 今回は その山形ラボで、...

10917612?v=4
roki1801
2017年10月10日