【Git】開発環境からリモートリポジトリにPushして本番環境に自動反映




開発環境で動作確認して、OKだった場合に本番環境へそのまま反映できたら手間が少なくて便利ですよね。今回は、以下の手順をGitで行う方法を解説します。

  1. 開発環境のローカルリポジトリから同じサーバー内に置いたリモートリポジトリにPush
  2. リモートリポジトリから同じサーバー内の本番環境に自動反映

目次

各ディレクトリのパスについて

今回は、3箇所で作業を行います。下記の設定で行います。

ローカルリポジトリ(開発環境)

  • パス:~/dev
  • 備考:開発環境のファイルが入っています

リモートリポジトリ

  • パス:~/product.git
  • 備考:慣習でリモートリポジトリのルートディレクトリ名は.gitを付けます

本番環境

  • パス:~/product
  • 備考:本番環境のファイルが入っています
ディレクトリ構成

①開発環境からリモートリポジトリ

リモートリポジトリproduct.gitの作成

#ディレクトリを作って入る
cd ~/
mkdir product.git
cd product.git 

#リモートリポジトリをつくる
git init --bare (--shared)

7行目はリモートリポジトリを作成するときのコマンドですが、–bareは「空の」という意味を持つオプションで、リモートリポジトリにするときに利用します。ワーキングディレクトリを持ちません。

また、–sharedオプションは複数人で使用するときに設定するオプションで、付けるか付けないかでパーミッションが変わります。例えば、–sharedがついているとローカルリポジトリからリモートリポジトリに対する強制上書きプッシュ(git push -f origin master)が拒否されるようになります。

今回の場合、リモートリポジトリにPushするのは開発環境のローカルリポジトリただ1つなので付けなくてもいいでしょう。

開発環境のローカルリポジトリ設定

cd ~/dev

(※ローカルリポジトリを作っていない場合はここから最後まで)
git init
git add -A
git commit -m 'First Commit'

(※ローカルリポジトリがすでにある場合はここから最後まで)
git remote add product ~/product.git
git push product master

一番のポイントは、9行目でローカルリポジトリにリモートリポジトリを登録するところです。

git remote add (リモートリポジトリ名) (リモートリポジトリのパス)

で指定します。リモートリポジトリ名はデフォルトではoriginになりますが、今回のようなシチュエーションだと複数のリモートリポジトリを持つことが多いので、productという名前で登録しました。

②③リモートリポジトリから本番環境のローカルリポジトリ

②と③が一緒になっていますが、実は②と③は一緒に出来るのでまとめました。

リモートリポジトリの設定

cd ~/product.git/hooks
vi post-receive

まずはリモートリポジトリのディレクトリに入ってpost-receiveというファイルを作成します。

hooksディレクトリにpost-receiveというシェルスクリプトを書くことで、リモートリポジトリにPushが来た際にpost-receiveが自動実行されます。

!#/bin/bash

cd ~/product
git --git-dir=.git pull origin master

ここでは、リモートリポジトリにPushが来たら、本番環境~/productに移動して、git pullすることで自動反映を実現しています。

Pullはfetch + mergeですので、②と③を同時にやることになります。

chmod +x post-receive

最後にpost-receiveに対して実行権限を与えます。パーミッション周りが上手く設定できていないエラーがよく出るので、お気をつけください。

ちなみに、シェルスクリプトの実行ユーザはそのまま変わらず自分がやったことになります。(実行者がgitなどにならない)

本番環境(ローカルリポジトリ)の設定

最後に本番環境のローカルリポジトリの設定を行います。

cd ~/product

#ローカルリポジトリを作成
git init
git remote add origin ~/product.git
git pull

本番環境のローカルリポジトリは1つしかリモートリポジトリを持たないでしょうからoriginで登録しました。最後にpullをすることでリモートリポジトリの中身を持ってきます。以上で設定は終わりです!

リポジトリをそれぞれ別のサーバーに置く場合

今回は開発環境・リモートリポジトリ・本番環境がすべて同じサーバーという前提でした。

もし、ローカルリポジトリやリモートリポジトリを別のサーバーに置く場合は、

git remote add (product or origin) ssh@(IPアドレス) (Gitリポジトリまでのフルパス)

のように、git remote addの部分を変更することで実現できます。

まとめ

開発環境で動作確認したら、すぐにデプロイが出来るのでとても便利ですね。アクセス権の設定でつまづきやすいので、くれぐれもご注意ください!