Qiita初投稿です。自分の理解の整理も兼ねて。
早速始めます。
目標
GitにPushしたら自動でサーバーにデプロイできるようにする。
Herokuを今まで使っていたのだが、ラズパイで自分でサーバーを建てたので同じ仕組みを実現したい。
概要
###作業の流れ
サーバー側
- Gitリポジトリ作成
- デプロイ先にclone
- 自動化のためのフック作成
クライアント側(こちらで開発)
- Gitリポジトリ作成
- Git remoteの設定
- pushしてデプロイ!
環境
- Raspberry Pi 4 Model B
- Git 2.2
- Apache
- MacBook Pro
- Git 2.24
※サーバー側、クライアント側共にGitをインストールしておく
※サーバー・クライアント間でSSHで接続できるようにしておく
開始
定義
ここでは下記のように進めます。各自読み替えてください。
- Gitリポジトリを置く場所
- /hoge/fuga/git
- Gitリポジトリ名
- sample.git
- デプロイ先
- /var/www/piyo/sample
まずはサーバー側でGitリポジトリを作る
サーバー側の任意の場所に移動してGit用のディレクトリを作成します。
cd /hoge/fuga/git
mkdir sample.git
cd sample.git
git init --bare
git init
でGitリポジトリの初期化ができる。オプションの--bare
は他のリポジトリからpushできるようにするために必要。
--shared
オプションを付ければ、グループで共有するときに便利らしいが、今回は使わない。必要な場合は参考文献の記事を参照。
脱線)ベアリポジトリ・ノンベアリポジトリとは
違いはワーキング・ディレクトリ(実際のファイルがあるディレクトリ)を持つか持たないか。
- 実際のファイルを持つノンベアリポジトリで開発したものを、
- 更新情報だけを持つベアリポジトリにpushして管理する
- ベアリポジトリの更新時にフックが発火し、デプロイ先にpullされる(実際のファイルが作られる)
ここの話はこの記事が詳しい。
ベアリポジトリとノンベアリポジトリ:理論編〜GitでWordpressのテーマを管理
note
Gitリポジトリを管理者権限で作成した場合は、所有者を変更しなければpushできない。
SSHでログインするユーザーに変更しておく。
例)pi@192.168.1.1
でSSH接続するならば、ユーザーpi
に所有者を変更する。
cd /hoge/fuga/git
sudo chown pi.pi -R sample.git
次にクライアント側でGitリポジトリを作成
デプロイしたいファイルがある階層に移動し、Gitリポジトリを作る。こちらは実際のファイルを持つノンベアリポジトリなので、--bare
は付けない。
cd /path/to/your/app
git init
remoteの設定
クライアント側にファイルの送信先の設定をする。ファイルの転送にはSSHを使うため、サーバー・クライアント間でSSHの設定を済ませておく。
git remote add origin ssh://ユーザー名@IPアドレス/hoge/fuga/git/sample.git
例えばユーザー名がpi
、ローカルネットワークのIPアドレスが192.168.1.1
であれば、ssh://pi@192.168.1.1/hoge/fuga/git/sample.git
ポートを指定する場合は、ssh://pi@192.168.1.1:22222/hoge/fuga/git/sample.git
のようにする。
pushしてみる
これから更新するたびに下記の動作をすることになる。そのうち指が超高速で動くように。
git add .
git commit -m "First Commit"
git push origin master
デプロイ先にclone
サーバー側に戻る。git pullする設定をする前に、まずはファイルを展開したい場所にcloneしてやる必要がある。
cd /var/www/piyo
git clone /hoge/fuga/git/sample.git
中を見るとgit pushしたファイルがあるはず。
cd sample
ls
自動化のためのフック作成
フックとはGitリポジトリに特定のアクションが起きたときに発火するスクリプト。
post-receiveというファイルをhooks内に作る。
cd hoge/fuga/git/sample.git/hooks
nano post-receive
#!/bin/sh
cd /var/www/piyo/sample
git --git-dir=.git pull
これ以外にもスクリプトを書くこともでき、私は変更を反映するためsudo systemctl restart apache2
と書き足した。
作ったら実行権限を与えてやる。
chmod +x post-receive
コマンドを打って動くかどうか確認。
./post-receive
もう一回、git add .
git commit -m "piyopiyo"
git push origin master
の一連の流れをやってみてちゃんとデプロイされてるか試してみて、新しいファイルがあればOK。
ダメだったら、デプロイ先のディレクトリにSSHでログインするユーザーに書き込み権限があるか等を確認してみる。
以上、最後まで読んでいただきありがとうございました。
間違いがあれば、コメントで知らせていただけると助かります。
参考文献
- グループで管理したい場合はこの記事の最後を見ると良い