弊社のコーディング代行サービスでは、GitLabを使い、ソースコードを管理しています。
お客様への確認用に、テストサーバにファイルをアップしているのですが、これが手作業でのアップロードだと、非常に手間ですので、GitにPushしたデータを自動でテストサーバにアップロードするプログラムを作成したので、備忘録も兼ねて記載します。

Apacheの実行ユーザと同じ名前のGitLabアカウントを作成

このプログラムの全体像としては、
1.GitのSSHのURLを、データベースに登録
2.そのデータベースに登録されたGitのSSHを、定期的にApache上でCloneもしくは、Pullして、サーバ上にファイルを展開

するというものです。
まずは、Apache上でCloneできるようにするために、Apacheの実行ユーザと同じ名前のGitLabアカウントを作成
キーペアを作成して、公開鍵をGitLabに登録。秘密鍵は、実行ユーザのhomeディレクトリに、.ssh/フォルダを作成してそちらにアップロードします。
そうすることによって、公開鍵認証で、GitLabにアクセスできるようになります。

Apacheの設定

弊社のテストサーバで、
/var/www/fog/html/○○/
のディレクトリにアップロードすると、勝手に下記のURLで表示されるよう、ApacheのVirtualHostの設定をします。
https://○○.demo.fog.tokyo/

/etc/httpd/のconfファイルに追記


DocumentRoot /var/www/fog/html/
ServerName demo.fog.tokyo
ServerAlias demo.fog.tokyo *.demo.fog.tokyo
VirtualDocumentRoot /var/www/fog/html/%1/
# Other directives here

追記後、Apache再起動

# service httpd restart

こうすることで、

/var/www/fog/html/○○/
のディレクトリにアップロードすると、勝手に下記のURLで表示されるようになります。
https://○○.demo.fog.tokyo/

シェルスクリプトの作成

下記のシェルスクリプトを、
/var/www/fog/html/
の公開ディレクトリ直下に配置します。

#!/bin/bash

#############ここから#############

# デプロイするプロジェクトの名前
proj_name=$1

# リモートリポジトリのURL
remote_path=git@○○○○/$1.git

# デプロイするブランチ
branch=$2

# 本番環境へのSSHログイン情報(ユーザ名@ホスト名)
host=git@○○○○

#############ここまで#############

# プロジェクトのディレクトリがあるか確認
# なければclone、あればpullをおこなう
if [ ! -e ${proj_name} ]; then
git clone ${remote_path}
echo 'cloning success!'
else
cd ${proj_name}
# pullもしくはfetch&reset --hardを使う
# 競合を起こさないよう、強制的に最新のリモートリポジトリに合わせる
git fetch origin
git reset --hard origin/${branch}
# git pull origin ${branch}
echo 'deployment success!'
fi

シェルスクリプトを実行するPHPファイルを設置

PHPの、exec()関数を使って、上記で記載したシェルスクリプトを実行することで、自動で、Clone及びpullができるようになります。