gitをxserverに設置しgit pushで自動で本番環境にアップロードするための方法【初心者向け】

はまってしまったので、自分の整理もかねて紹介。
初心者向けとしたけれども、これをやろうとする人にそんな初心者はいないかもしれないけど。。

環境:MAC OS 10.11.4

参考にした記事はこちら。
エックスサーバーにGitを導入する手順
git pushで本番環境に”自動デプロイ”できる環境を作ってみよう!

エックスサーバーにGitを導入する手順の補足

「エックスサーバーにGitを導入する」部分は問題なく完了。
この記事でgitを導入する部分について

以下のように紹介されていた。

remote
$ wget https://github.com/git/git/archive/master.zip
$ unzip master.zip
$ cd git-master
$ autoconf
$ ./configure --prefix=/home/【サーバーID】/opt --with-curl=/home/【サーバーID】/opt --with-expat=/home/【サーバーID】/opt
$ make all

make 中に msgfmt が見つからないとエラーが出ました。
/bin/sh: msgfmt: command not found

とのことだが、私の場合はエラーは表示されなかったが、gitはうまくインストールされていなかった。
結局エラーを無視するというコマンドとして以下を利用することで、うまくgitをインストールすることができた。

$ make -i all
$ make -i install

本番環境にgitを設定する。

引き続きgitを本番環境に設定する。
私の場合は参考記事と若干ゴールが異なり、以下を目標としていた。

「gitで管理するファイルはpublic_html配下だけではなく、ドメイン直下のファイルもgitで管理する」

イメージ
example.com
  -public_html(公開するファイル)
  -application(呼び込み専用のファイル。セキュリティの問題を考え、直接アクセスできない場所に配置する。)

多くのサイトで紹介されているのはpublic_html配下にgitを置くやり方なので、今回は一つ上の階層にgitを置くやり方を紹介している。

まずは本番環境に接続したらターミナルから以下のコマンドを入力する。
ここでは「example.com」というドメインで行うことを想定する。

remote

$ cd ~/example.com
$ git init
$ git add .
$ git commit -m "first commit"

これはexample.com直下のファイルは全てgitで管理するということを意味する。もちろんgitで管理する必要のないファイルも含まれてしまうが、それらは後から.gitignoreで対象外にすると良いだろう。puclib_html以下だけを管理すれば良いという場合は、public_html配下でgit initを行えば良い。

remote

$ cd ~/example.com/public_html
$ git init
$ git add .
$ git commit -m "first commit"

ベアリポジトリの作成

次にベアリポジトリを作成する。ベアリポジトリとは、共有用のリポジトリでベアリポジトリは作業用のスペースを持たないということを意味する。

ベアリポジトリについて詳しく知りたいのならこの記事が参考になる。
ベアリポジトリとノンベアリポジトリ:理論編〜GitでWordpressのテーマを管理

ローカルからの更新は直接公開用のファイルを編集するのではなく、一旦ベアリポジトリに変更情報を送り、そこから公開用のファイルがgit pullするという流れを取るのが一般的らしい。

remote

$ cd ~/example.com/
$ git clone --bare --shared ~/example.com example.git
Cloning into bare repository 'example.git'...
done.

これは先ほどgit initしたリポジトリをクローンして、example.gitという名前のベアリポジトリとすることを意味している。〜.gitとしているのは慣例でそうなっているとのこと。
example.gitとなっているとファイルのように思えるが、これはディレクトリを表している。

post-receiveの設定

example.gitの中身をlsコマンドで確認するとhooksフォルダがあるのがわかる。

remote

$ ls
HEAD  branches	config	description  hooks  info  objects  packed-refs	refs

このhooksフォルダに移動してpost-receiveを作成する。

remote

$ cd example.git/hooks
$ vi post-receive

post-receiveはgitのリファレンスサイトを見てみると

post-receive フックは処理が終了した後で実行されるもので、他のサービスの更新やユーザーへの通知などに使える。

とある。要するに、ローカル環境からgit pushしてexample.gitを更新した場合に実行されるファイルということになる。このファイルでは以下の処理を組み込む。

1. .gitがあるフォルダに移動
2. そのフォルダからexample.gitに対してpullを行う。

post-receiveファイルに保存する内容は以下のようになる。

#!/bin/bash
 
cd ~/example.com
git --git-dir=.git pull ~/example.com/example.git master

viコマンドで編集しているが、ファイルを開いたら「i」でINSERTを行い、保存時は「:wq」とコマンドする。
(もっと詳しく知りたい場合は「viコマンド」などで検索するといい。)

「–git-dir=.git」は移動先のフォルダでgitコマンドを使うという意味っぽい。

このコマンドは本番環境でgit管理している場所から、pushで変更されたexample.gitをpullして変更を反映するということを意味している。

post-receiveには実行権限が必要なので、以下のコマンドも実行する。

remote

$ chmod +x post-receive

ローカルの設定

次にローカルの設定を行う。
まずはローカルにサーバーのgit情報をcloneする。

すでにローカルに開発しているデータがある場合は、一旦退避しておき、自動デプロイがうまくいってからファイルを戻してgit pushしたほうがいいかもしれない。
※私の場合、すでにローカルで開発しているフォルダがあったので、最初このcloneを行わず、ローカル環境から「git remote add」してうまくいかず、どハマりしてしまった。

local

$ git clone xsrv:~/example.com/example.git

自動更新されるかテストする。

最後にローカル環境でファイルを作成し、pushする。

local

$ cd example.com
$ touch blankfile
$ git add -A
$ git commit -m "add blankfile"
$ git push origin master 

まとめ

おさらいすると・・・

1.本番環境のgitで管理した場所でgit initを行う。
2.ベアリポジトリをサーバー上の公開していない場所に作成する。
(手順1.で作成した.gitをcloneする)
3.ベアリポジトリの「hooks/post-receive」を設定する。
(手順1.で作成した場所からベアリポジトリをpullする)
4.ローカル環境からベアリポジトリをcloneする。
5.ファイルを変更したらベアリポジトリにpushする。

このように見直してみると、ベアリポジトリを中心に、本番環境gitとローカルgitでやりとりするように設定されているのがよくわかる。

今回の手順ではexample.comに更新情報を送り、同じディレクトリの情報を再帰的に更新するという流れになっており、なんだか無駄なような気もする。とはいえ、この辺の仕組みにはあまり詳しくないので、変な応用はしたくないのでこの手順でよしとしよう。

しかし大分はまったなぁ。はまった時間は聞かないでほしい。

最後に

もしうまくいかないでこの記事にたどり着いた方がいれば、とにかく紹介した手順通りにやってみることをおすすめする。いきなり応用しようとするとどこでつまづいているのかがわからなくなるからだ。基礎あっての応用ということを忘れないようにしよう!(ということを自分に言い聞かせたい!)