gitを使ったデプロイ方法

  • 167
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

以前にさくらVPSにGitの中央リポジトリを置く(for Mac) - Qiitaという記事を書きましたが、タイトルと内容がアレなので書き直します。

目標

開発環境からgit pushするだけでデプロイ完了

環境

  • Local : MacOS 10.10.2
  • Server: CentOS release 6.6 (さくらVPS)

概要

スクリーンショット 2015-03-27 11.26.12.png

  • localで開発してgitで管理。ここにローカルリポジトリがある。(図Z)
  • リモートリポジトリをVPSに置く(図A)
  • VPSの別の場所に本番実行用のリポジトリをクローンする(図X)
  • GitHubBitbucketを使っている場合はリモートリポジトリを2つにする。(使わなくてもOK)(図B)
  • Local(Z)でpushしたら、VPS側のlocal(X)は自動でpull & プロセスの再起動をする

簡単に言うと、ZからXにデプロイするのにAを経由するということです。

下準備

.ssh/configの設定をしておく

Macはもともとターミナルから簡単にSSHでサーバーにログインできますが、以下の設定をするともっと簡単になります。

~/.ssh/config というファイルを作ります。

.ssh/config
host sakura
  HostName     ***.***.***.**
  Port         12345
  User         myname
  IdentityFile ~/.ssh/id_rsa

HostName :IPアドレス or ドメイン

Port :接続用のPort番号

User :ログインユーザー名

IdentityFile :ssh鍵の場所

以上の様に設定していると
ssh sakura
だけでログインできるようになります。
そして
sakura:/home/hoge/
という風にパスを指定することができます。

参考: ssh 接続を簡単にする ~/.ssh/config | dogmap.jp

手順

サーバーにリモートリポジトリを作成する

サーバーにssh接続して適当な場所にリモートリポジトリ(A)を作成します。

 $ ssh sakura
 SAKURA Internet [Virtual Private Server SERVICE]
 $ cd /home/user1/gitRemote
 $ git init --bare hogeProject.git

ローカル(Z)に戻り、リモートリポジトリを設定します。

$ git remote add origin sakura:/home/user1/gitRemote/hogeProject.git

すでにリモートリポジトリが存在する場合は

もしすでにGitHubBitbucketを設定している場合にremote addすると弾かれるので以下の設定をします。

これをするとgit pushした時にA,B両方のリモートへ同時にpushできます。

ローカル(Z)の.git/configにAのurlを追加してoriginを2つにします。

/// 変更前
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github:hoge/hogeProject.git
/// 変更後
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github:hoge/hogeProject.git
    url = sakura:/home/user1/gitRemote/hogeProject.git

これでpush originした時にそれぞれのremoteへ同時にpushできます。

pushしてみる

ここまででリモートリポジトリの準備はできているはずなので、試しにpushしてみます。

ローカル(Z)から

$ git push origin master

VPSで確認してみましょう。

$ ssh sakura
SAKURA Internet [Virtual Private Server SERVICE]
$ cd /home/user1/gitRemote/hogeProject.git
$ git log

VPSでcloneする

本番実行ファイルを設置します。

適当な場所(X)に移動してgit cloneします。

もちろん本番環境(VPS側)での作業です。

$ cd ~/myProject
$ git clone /home/user1/gitRemote/hogeProject.git

これで/home/user1/myProject/hogeProjectにファイル設置完了です。

git hookの追加

pushした時にVPS側で自動pullする設定をします。

Localでpushする=remoteでreceiveする(受ける)ということなので、hooks/post-receiveを設定します。

VPS側のremote(A)に書きます。Local(Z,X)ではないので注意。

まずデフォルトでhooks/post-receive.sampleというファイルがあるのでこれをリネームします。

$ cd /home/user1/gitRemote/hogeProject.git
$ mv hooks/post-receive.sample hooks/post-receive

vimでもnanoでもemacsでも好きなエディタで編集します。

$ vim hooks/post-receive

hooks/post-receiveの内容

post-receive
cd /home/user1/myProject/hogeProject
git --git-dir=.git pull

注意点としては、単にgit pullと書くと「そこリポジトリじゃねぇよ!」と怒られますのでgit --git-dir=.git pullとします。

post-receiveに実行権限が無い場合は設定しておきます。

(post-receive.sampleからリネームした場合は不要)

$ chmod a+x hooks/post-receive

これで設定完了です。適当にlocalでファイルを編集して、commit & pushしてみてください。
自動でXに移動してpullまでしてくれます。

それ以外の操作をしたい場合(例えばPM2でプロセスを再起動させたい時など)は以下の様に書くとOKです。

post-receive
export PATH=$HOME/.nodebrew/current/bin:/usr/local/bin:$PATH
cd /home/user1/myProject/hogeProject
git --git-dir=.git pull
pm2 startOrRestart /home/user1/myProject/hogeProject/pm2_deploy.json

単にpm2 startOrRestartと書くとパスが通ってない場合があるので「PM2というコマンドはありませんよ」みたいなエラーが出ます。

上記ではnodeのパスをexportしています。

まとめ

  1. Aでgit init --bare
  2. Zでgit remote add
  3. すでにgitHub等にリモートを設定している場合は.git/configを編集してoriginに追加
  4. Zのリポジトリをgit commit & push
  5. Xでgit clone (A)
  6. Aのhooksを編集

ここまで設定しておくと、あとはZでpushするだけでデプロイできるようになります。

おまけテンプレート

hooks/post-receive.sampleの名前変更

mv hooks/post-receive.sample hooks/post-receive

hooks/post-receiveの基本設定

post-receive
export PATH=$HOME/.nodebrew/current/bin:/usr/local/bin:$PATH
cd /path/to/project
git --git-dir=.git pull