これは自分用の備忘録です。画像はありません。
他のサイトの説明が難しすぎて、文字だけでもヒントが欲しいという私と同じレベルの人はどうぞ。
何があっても責任は取れませんがご参考までに。
一応Gitについては本やドットインストールなどで勉強した。
Gitのインストール、リポジトリ、ステージング、コミット、プッシュ、プル、フェッチなど何となくわかった。
でもその環境を作るのはどうすればいいの?という話は、本やネットにはあまり詳しく載っておらず理解がしにくい。
ここでいう環境とは、自席のPCでXAMPPなどのテスト環境で開発して、例えばさくらVPSなどクラウド上にLAMPP環境で本番として開示するということ。
本番とはホームページでもウェブサービスでも何でもいい、今回はウェブサーバとしての機能のこと。
開発環境は、XAMPPのドキュメントルート。
本番環境は、例えばCentOSのApacheの/homw/hoge/www/直下に本番ソースを置く。
それをつなげる。
開発環境から本番環境やステージングに反映するのをデプロイというらしいのだが、本番ソースにプッシュすればいいと思ったら大間違いで、ノンベアリポジトリには直接プッシュできないよとか、ベアリポジトリが必要とか、聞いたことのない用語で煙にまかれてしまう。
今回、外注の業者にECサイトをお願いすることになり、gitのデプロイ構築のやり方を教えてもらったので、備忘録として残しておく。
私の環境
いきなりVPSなどのクラウドサーバでは説明が難しいので、手持ちのノートパソコンにCentOSを入れて代用する。以後サーバと呼ぶ。
登場人物は、CentOS7を入れたサーバ(実はノートパソコン)と、私の自席のパソコン(Windows10)の2つだけ。
ここでは関係無いが、ウェブサーバはApacheを使う。
ユーザはhogeユーザとする。hogeユーザは既存の標準ユーザのことです。仮名でhogeと言っているだけ。
CentOSのサーバは、Apacheを使い/home/hoge/wwwをドキュメントルートとしてウェブサーバとして動作させる。
ドキュメントルートはhogeユーザのディレクトリの直下にする。
ローカルは、自席の私のパソコンでXAMPPで開発する。
ドキュメントルートはC:\xampp\htdocs。SSHはTeraterm、GitはSourceTreeを使用する。
私のPCのXAMPPで開発して、OKならばCentOSのサーバ(本番)にアップロードするという流れ。
本番サーバのソースコードを直接メンテすることはしない。
CentOSの本番サーバは常に誰かがアクセスしている恐れがあるので普通はやらないよね。開発環境で開発して本番にデプロイ。
本当はステージングサーバを用意するんだろうけど、ざっくり状況はこんな感じ。
尚この方法は、両方のドキュメントルートを空の状態からスタートしますので、XAMPP内の開発ソースは事前に避難しておきます。
CentOSサーバでの作業
まず、CentOSのサーバにGitを入れるところから。SSHでhogeユーザでログインします。
そして、Gitを入れるためルートに変身します
$ su -
Gitをインストールします
# yum -y install git
但しこのやり方だと最新版は入らない。
最新版は追加機能もあるらしいのでそちらの方が良いという人はググってみてください。私はそんなに使いこなせそうにないので現在の安定板1.8で我慢します。
次に共有リポジトリ(ベアリポジトリ)を作るために、そのディレクトリを作成します。
共有リポジトリは後で説明します。
/opt直下に共有リポジトリ(ベアリポジトリ)用のディレクトリを作成する。別に/opt以外でも構いません、今回は/optとし、ディレクトリの名前はrepo.gitとします。
# mkdir -p /opt/repo.git
このコマンドは/optディレクトリの下にrepo.gitディレクトリを作れという命令です。
-pをつけていると、/optがもし存在しなかったとしても、/optディレクトリごとgitディレクトリを作ってくれるというもの。
共有リポジトリは「名前.git」という名前である必要があります。名前はなんでもいいですが、それは決まりです。
作った/opt/repo.gitはこのままではrootユーザが所有者なので、hogeユーザにする。
# chown hoge:hoge /opt/repo.git
もとのhogeユーザに戻る
# exit
作ったgitディレクトリに移動する。
$ cd /opt/repo.git
ベアリポジトリを作成
$ git init --bare --share
これを実行して、empty shared Git repository in /opt/repo.gitと表示されれば成功。
/opt/repo.git内になにやらファイルやディレクトリがたくさんできているはず。
–bareはベアリポジトリを作るという意味。
あと–shareにしておかないと、私以外の人が別のPCでメンテしたい場合にアクセスできないみたい。
次はPCの設定をするけど、またこちらの操作もするので、SSHは閉じないでおく。
PCからSourceTreeを操作する
次は、WindowPCからGitのクライアントツールであるSourceTreeの設定をする。
インストールはググってHPからダウンロードして次へ次へで終了。
画面上にある+でタブを作り、Cloneのアイコンをクリックする。
そしたら3つくらい入力するところが出てくるが、上にリモートリポジトリ、下がローカルのドキュメントルートを指定する。
上に入力する文字は、ssh://ユーザ名@IPアドレス:22/先程作ったベアリポジトリのパスになる。最初のSSHはSSHで通信するということ。:22というのはSSHの標準ポート番号だ。
今回の場合は、ssh://hoge@192.168.0.1:22/opt/repo.gitを入力する。タブキーで移動すると、何やらグルグル回って、これはGitリポジトリですと表示される。
されなければ入力が間違っているなどの理由のため、再度確認する。
(もしKeyがどうのこうの聞いてきたらOKで答える)
先程のCentOSの設定でSSHを使っていたのなら、SSHが使えないということはないので、入力間違えなどがなければうまく行くはずです。
たまに、SourceTreeのバグで、グルグルが全然終わらないときがあります。そのときは一旦終了して同じ操作をやり直してください。
OKなら次に、2行目の保存先のパスを入力する。これはローカルのパスです。
保存先のパスはXAMPPでコードを置いている場所。
私の場合はC:\xampp\htdocsになる。
3行目は自動的に入ります。後は何もしない。
以上を入力したら下にあるクローンのアイコンをクリックする。
冒頭に説明したがC:\xampp\htdocsの中身は空である必要があります。
空になっていなければクローンできませんと怒られるので、別のところに避難して再度実行しましょう。
これで、CentOSと自分のPCがSourceTree経由でなんとなく連結する。
ここで疑問点
ここで普通は疑問に思う。
今までの一連の作業でPCとCentOSのサーバがつながったようだが、本番で動かすと言ったドキュメントルートである肝心要の/home/hoge/wwwは今まで何も触れていない。
なんで/opt/repo.gitなんて全然関係のないものを作って、ローカルとつなげる意味があったのだ?と思うのだが、実は意味があるらしい。
それは、みんなで突き合う場所は、本番ソースの場所とは別に、共有リポジトリというものを作らなければいけないらしい。
仮に3人でソースを突き合うとして、A氏PC、B氏PC,C氏PC、本番サーバの4つしか登場人物がいなくても、もう一つ共有リポジトリという場所を作って、そこを噛まさないといけない掟。
要するにこう↓いうことであって、
A氏→ ——————–
B氏→ | 共有リポジトリ | → 本番ソース
C氏→ ——————–
こう↓でなないらしい。
A氏→ ——————————-
B氏→ | 本番ソース & リポジトリ |
C氏→ ——————————-
なぜならA・B・Cの3人が同時に同じPUSHをしたらどうだろう。おそらくぶっ壊れる。ぶっ壊れないまでも不整合になるということ。
ということは、次に、作った共有リポジトリ(/opt/repo.git)と、本番のドキュメントルートである/home/hoge/wwwとをつなげてあげないといけない。
次にその設定をする。
またCentOSサーバの設定
次はさきほどの共有リポジトリと、CentOSの本番ドキュメントルートとをつなげる作業をする。
hogeのホームディレクトリに移動する
$ cd ~
クローンを作成する
$ git clone /opt/repo.git www
すると、/home/hogeの中に、wwwというディレクトリができる。パスは/home/hoge/wwwということ。このwwwというのをドキュメントルートとする。
これはcloneコマンドの名前どおり共有リポジトリのクローンになる。
一応中身を確認しておく(wwwディレクトリに移動し、ファイル一覧を表示する)
$ cd www $ ls -a
おそらく.gitというディレクトリがwwwの中に出来ているはず。それでOK。
しかし、これだけでは不十分。なぜなら、自席PCからCentOSにある共有リポジトリ(/opt/repo.git)にアップ(実際の名前はPush)したときに、いちいち手動で共有リポジトリから本番のドキュメントルート(/home/hoge/www)に、引っ張ってあげないといけないから。でないと本番にソースが反映しない。これを自動化して初めて設定終了となる。
その自動化の仕組みをフックと言うみたい。引っ掛けるという意味なのかな。
共有リポジトリ(ベアリポジトリ)のフックに移動
$ cd /opt/repo.git/hooks
共有リポジトリの中にhooksというディレクトリがあるのでそこに移動します。
そこにファイルを作成します。viコマンドでvimというエディタを開きつつpost-receiveという名前でファイルを作成します。
$ vi post-receive
このpost-receiveという名前は変えないで下さい。この名前でないと動作しません。
Linuxはエディタがとても独特なので、vimの使い方が解らなければこちらをご覧ください。
post-receiveの中身は・・
#!/bin/sh cd /home/hoge/www/ git --git-dir=.git pull
とする。最後は改行してもしなくてもどちらでもOK。
中身の解説は、本番ソースのドキュメントルートに行き、共有リポジトリから引っ張る(pull)するという意味だ。これをpost-receiveというタイミングである、SourceTreeからPushした後に実行する。これが自動化の仕組みのようだ。
post-receiveの権限を変更
$ chmod 755 post-receive
忘れてはいけないのは、スクリプトファイルは他のユーザから実行できるように、実行のパーミッションを設定してあげないと動かないのだ。
設定は以上。
またパソコンに戻ってSourceTreeで確認する
設定は以上だが、ちゃんとパソコン側でコミットした内容が本番に移動できるかを確認する。
ローカルのC:\xampp\htdocsに何かテスト的にファイルを作り(今回はtest.txtとした)
SourceTreeでステージング&コミットを行います。
(ステージングやコミットが解らない人は、デプロイよりも先にそっちを勉強してくださいっていま言うなと言われそう)
そして右下にあるプッシュボタンを押してPushする。
すると共有リポジトリの/opt/repo.gitにPushされて、hooksにあるpost-receiveのフックが効いて、本番ソースが書き換わる。
最後にCentOS側で本番ソースに反映されているか確認
最後に本番ソースのドキュメントルートにファイルが追加されているか(変更が利いているか)確認する。
$ ls /home/hoge/www
これで先程Pushしたtest.txtが確認できればOK。
後は避難していたコードをローカルのドキュメントルートに入れて、ステージング+コミット+プッシュすれば、サーバ側にローカルのコードが同期されるので完成です。
一応全手順を2回繰り返しやりましたが、うまくいったので大丈夫だと思います。
これは開発会社に教えていただいたやり方とは若干逸脱してますが、まぁこれで大丈夫でしょうと思います。
最後にフックの仕組みについて
フックの仕組みについて説明しておきます。
フックとは共有リポジトリに対して何らかの操作が行われたときに発火してコマンドを実行させる仕組み。
post-receiveという名前にしたのは理由があって、この名前でhooks内に作れば、共有リポジトリにpushされたタイミングでpost-receiveに書かれたコマンドを実行してくれることになる。
書いているコマンドとは、今回は3行。
#!/bin/sh
これはぶっちゃけ無くても良いですが、念のため付けて置いてください。
cd /home/hoge/www/
cdはchange directory。ディレクトリを/home/hoge/wwwに移動します。
git –git-dir=.git pull
さきほどcdでディレクトリが移動しました。現在地は本番ソースのある場所/home/hoge/wwwです。
その上で、このコマンドで、プルをします。
ということは解りますよね。共有リポジトリ/opt/repo.gitから現在いる場所/home/hoge/wwwにソースを引っ張ってくるということです。
それをローカルPCからプッシュしたタイミングで行うということです。
- ローカルでプッシュする
- 共有リポジトリでローカルのプッシュを受け取る
- hookが発火する
- 発火内の、ディレクトリを移動するコマンドが実行され、本場ソースがカレントディレクトリになる。
- 発火内の、プルコマンドが実行され、共有ディレクトリから本場ディレクトリにプルされる。
以上が流れです。
本番ソース側で直した場合
ここまでくると勘のいいひとなら気付くと思いますが、ローカル・共有リポジトリ・サーバの関係は、
——————–
ローカル → | 共有リポジトリ | → 本番ソース
——————–
ではなく、
——————–
ローカル → | 共有リポジトリ | ← 本番ソース
——————–
になります。hookにより本番側からプルしているわけですから。
ゆえにローカルも本番ソースも立場は対等ということです。
だから本番ソース側からもコミットして共有リポジトリにpushすることも当然できます。
ただ、その際はhookが効かないので、ローカル側はプルしないといけませんが、ただそれだけの話です。
- サーバ側で、本番ソースをvimで改変して
- サーバ側で、ステージング、コミット、プッシュ
- ローカル側で、プル
こういう同期になります。
以上です。
間違っているところや、こういう表現の方が解りやすいですよ、というのがあれば教えてください。
ご覧くださりありがとうございました。
コメント