Web hookとか色々ありますが、うまくいかなかったりで悪戦苦闘していました。。
試しにcronを使ってWEBサーバの更新ができたのでメモとして残しておきます。サーバ周りは初心者です。
規模が大きいものや本番環境は、CIとかきちんと使ったほうがいいと思います。
そのへんは、これから勉強していきたいなと思います。
(今回は、静的な開発環境を想定して考えました)
今回はGitabリポジトリでソース管理をして、cronでWEBサーバも更新する仕組みを作りました。
cronは5分おきにしました。
以下のような感じになります。
サーバー準備
- gitコマンドがインストールされている
WEBサーバにアクセスして秘密鍵と公開鍵を作成
対象のサーバからGitlabのリポジトリをcloneできるように秘密鍵と公開鍵を作成します。
ssh ◯◯@hogehoge.net // sshでログイン(ログインユーザはsudo権限が必要)
sudo -s // rootユーザに切り替える
su - アカウント // rootユーザからアカウントに切り替える
対象サーバのアカウントに切り替えたら、鍵を作成します。
$ cd ~/
$ mkdir .ssh (.ssh ディレクトリが作成されていない場合、作成済みの場合は cd ~/.ssh/)
$ ssh-keygen(鍵の保存先は、「.ssh/id_rsa」パスフレーズは空「Return」)
$ cat ~/.ssh/id_rsa.pub (表示されるキーをコピー)
作成した公開鍵をGitlabに登録
コピーしたキーをGitlabのリポジトリに登録をする
Setting → Deploy Keys → New Deploy Keys
WEBサーバ側にリポジトリをcloneさせる
リポジトリ側では、ファイルをあげた状態にする(アップされたか確認するため)
まずは、リポジトリを格納するディレクトリに移動します。
自分は、公開ディレクトリではないユーザディレクトリの直下にcloneをしました。
※公開サーバへそのままcloneしてしまうと/.git/ができてしまいます。--mirrorのオプションをつけてcloneし公開ディレクトリへcheckoutする形にしました。(参考記事通り)
$ cd [リポジトリを格納するディレクトリ]
$ git clone --mirror [リポジトリURL] [オプション:作成するリポジトリ名]
WEBサーバ側にシェルスクリプトを設置する
まずは、シェルスクリプトの作成を行います。
シェルスクリプトはpre-push.shという名前で、リポジトリのhooksの中に入れました。
※作成ユーザは、WEBサーバのアカウント
$ cd [--mirrorで作成したリポジトリのパス]
$ vi hooks/pre-push.sh
#!/bin/sh
cd [--mirrorで作成したリポジトリのパス]
git fetch
GIT_WORK_TREE=/home/dev-ideacd git checkout -f master
作成したスクリプトに実行権限を与えます。
$ chmod +x pre-push.sh
WEBサーバ側にcronを設定する
rootユーザでcrontabの設定を行います.
# crontab -u [WEBサーバのアカウント] -e
5分おきにcronが走るように設定
*/5 * * * * [--mirrorで作成したリポジトリのパス]/hooks/pre-push.sh