Site icon Tips Note by TAM

共用サーバーにGitリモートリポジトリを設置、pushで公開できるようにする

Gitを使える共用サーバーにリモートリポジトリを設置し、リポジトリにpushがあった時にサイトのデータを更新する。
という設定をいたしました。
その設定方法をご紹介します。

1. さいしょに

サーバーの要件は次の通りです。

  • サーバーに対してSSH接続できる。
  • サーバーにGitがインストールされている。

以下説明は、次の構成例を前提に説明しております。

  • サーバーのホスト名: tips-note.sample
  • git共用リポジトリ: /var/git/repos/test1
  • WebサイトDocumentRoot: /var/html
  • WebサイトURL: http://tips-note.sample/

2.サーバー側のGIT設定

サーバーにssh接続してログイン後、以下の設定を行います。

a. 共用リポジトリを作成します。

$ mkdir -p /var/git/repos

# 共用リポジトリ作成時は --bare オプションをつける。
$ git init --bare /var/git/repos/test1

共用リポジトリとは
ワーキングツリーを持たないリポジトリ形式です。多人数でgitの情報を共有する場合によく利用します。
参考: https://git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server

b. pushされた時に実行するスクリプトを調整します。

gitは、操作されたタイミングでスクリプトを実行するgithooksという仕組みがあります。
pushの場合ですと、pushを受け、完了後に実行されるpost-receiveスクリプトがございます。
共用リポジトリ側にhooks/post-receiveという名前でスクリプトを設置すると有効になり、実行されます。
リポジトリ作成時に標準でサンプルが入っております。基本はそれを有効化して利用します。

# git作成時のサンプルは.sampleとして配置されているのでリネームして有効か、調整します。
$ mv /var/git/repos/hooks/post-receive.sample /var/git/repos/hooks/post-receive
$ vi /var/git/repos/hooks/post-receive

githooksとは
参考: https://git-scm.com/docs/githooks

調整したpost-receive

#!/bin/sh

#リポジトリ名
reponame=test1

#サーバー上のWebサイトドキュメントルート物理パス
docrootdir=/var/html

#サーバー上のgit共用リポジトリ物理パス
baregitdir=/var/git/repos/${reponame}

# gitがPWDでなくGIT_DIRを優先してカレントディレクトリを決定するため意図的に破棄。
unset GIT_DIR

#Webサイトのドキュメントルートを作成。
if [ ! -e ${docrootdir} ]; then
    mkdir -p ${docrootdir}
    echo "create docroot directory."
fi

#ドキュメントルートディレクトリをgitリポジトリとして初期化する。
#..ここのリポジトリはデプロイ用で、共用リポジトリではありません。
if [ ! -e ${docrootdir}/.git ]; then
    if [ -e ${docrootdir}/vendor-original-dir ]; then
      #サーバーの仕様で操作できないサーバー独自ファイルやディレクトリがある場合、
      #ここでgitignoreに登録する。
      echo "vendor-original-dir/*" >> ${docrootdir}/.gitignore
    fi

    cd ${docrootdir}
    #サーバー独自のファイルがある場合、直接cloneできないため、各ステップの処理を明示的に実行する。
    git init
    git remote add origin ${baregitdir}
    git fetch
    git checkout -t origin/master
    echo "initialize git."
fi

#ドキュメントルートのファイルをgitのmasterブランチの状態で更新する。
git -C ${docrootdir} fetch origin;
git -C ${docrootdir} reset --hard origin/master;

3. クライアント側でテスト

pushしてサイトを確認します。

$ git clone tips-note.sample:/var/git/repos/test1
$ cd test1
$ echo "Hi!" > ./index.html
$ git add ./index.html
$ git commit -m "initial commit."
$ git push origin master

ブラウザでhttp://tips-note.sample/を開いて、pushしたindex.htmlの「Hi」が見えていれば完了です。

4. さいごに

利用するサーバーにより、許可されている操作や権限が異なります。
実際に運用する際は、デプロイ先の.gitディレクトリを参照不可にするなど配慮が必要です。
ご利用のサーバーに応じてご調整くださいませ。