0

gitでシンプルなデプロイ環境を作る

Git
338
Like
2
Comment
Like

zaburo
Edited at 2017-02-02

Stock
gitで最低限のデプロイ環境を作る際のメモ。
いろいろなCIツールを使うまでもない、小規模なコンパイルいらずのWebアプリのデプロイ環境を作る。
CIツールを使う場合でも基礎となる知識なので整理しておく。

やりたいこと

ローカルで開発。
リモートにpush
pushを拾って、公開ディレクトリにpull
イメージ

図で書くとこんな感じ。

今回は、独自のリモートリポジトリを使うが、ここがGitHubとかでもいい。

前提条件

ローカル、リモートにgitがインストールされていること(Mac想定)
リモート(サーバ)にはsshで透過ログインできること
手順

まずは、push,pullの流れを手動でやってみる。

リモートリポジトリの用意(リモート)

とりあえず、外からは非公開かつ、チームがアクセスできるディレクトリを用意し、リモートリポジトリにする。

cd /var/www
sudo mkdir test.git
cd test.git
git init –bare
必要に応じて、適切なグループ権限等を設定する。通常はチームメンバーに対する書き込み権限が必要でしょう。みんなに共有する場合は、

git init –bare –shared
とかのほうが早い。

ローカルの作業場の作成とリモートの登録

まずは、作業フォルダとpushするテストファイルを作っておきます。

mkdir test
cd test
git init
echo “hello” > index.html
git add .
git commit -m “1st commit”
commitしたものが無いとエラーになるのでコミットしておきます。

リモートリポジトリを登録するには、

git remote add origin ssh://servername/var/www/test.git
とする。前提でも書きましたがが、sshログインができることが前提です。

とりえずpushしてみる

とりあえず、pushできるかやってみます。

git push origin master
エラーが出たなら対処します。

とりあえずpull(clone)してみる。

最初は、リモートリポジトリも何も登録されていないのでcloneしてみます。

cd /var/www/html
git clone /var/www/test.git test
ブラウザでアクセスしてみると、

hello

と表示されている。
あとは、pushをhookして、自動的にpullするようにすれば良い。

リモートサーバからのclone

上記の例では、ローカル経由でcloneしたが、通常は、リモートリポジトリと最終デプロイ先であるサーバは分離されていることが普通である。その場合、

git clone ssh://username@servername/var/www/test.git
という書式でcloneすればいい。このとき、もちろんサーバ間でsshログインできるよう鍵の設定が必要である。

自動化してみる

自動化は、pushを検知して、それをトリガーにして、pullを実行する。

パスフレーズ有りのssh鍵を使う場合は、自動化の中にpassphrase入力自動化のロジックが必要になり面倒です。ssh-agent,sshpass等を使うか、passphrase無しの鍵を使うのが無難です。
パスフレーズを要求しないようにする

鍵をいじれる環境なら、

cd ~/.ssh
mv id_rsa id_rsa.old
openssl rsa -in id_rsa.old id_rsa
chmod 600 id_rsa
とする。

リモートリポジトリのpost-receiveを設定する

リモートリポジトリには、各種イベントをhookして、スクリプトを実行する仕組みがあります。pushを検知して何かをやるには、post-receiveというのを定義します。

cd /var/www/test.git/hooks
vi post-receive
で、post-receiveファイルを定義します。

post-receive
#!/bin/sh

cd /var/www/html/test
git –git-dir=.git pull
としします。デプロイ先のディレクトリに移動し、そこでgit pullをします。ただ、書き方は上記の用に少し特殊。
CIツールは、このシェルスクリプトが巨大化したものだと思っていていいだろう。

post-receiveファイルは実行形式でる必要があるので、

chmod a+x post-receive
として実行権限を与える。ちゃんと動くか、

./post-receive
などとして単独で実行してみる。動くようなら、あとは一連の動きを試す。

一連の動きを試してみる

最初にローカルで作ったindex.htmlを編集し、add, commit, pushをしています。

#編集
git add .
git commit -m “hoge”
git push origin master
リモートサーバ上のファイルが更新されていればOKです。

本番サーバがある場合にも、本番サーバのDocument rootでpull(clone)すればいいでしょう。
以上。

パーミッションについて

チームで開発する場合、メンバーに適切なパーミッションを付与する必要がある。気をつけるのは、

1.リモートリポジトリに対する権限
2.デプロイ先対する権限

の2つ。

1.の場合、

error: insufficient permission for adding an object to repository database ./objects
とか言われる。これは、–sharedにしておけば解決できる。

2.の場合、

error: cannot open /var/www/html/test/.git/FETCH_HEAD: Permission denied
などと言われる。

どちらも、メンバーが所属するグループを作成し、該当のフォルダ、ファイルに対して、

chgrp -R groupname dir
chmod -R g+w dir
などとすればいい。

メモ

リモートリポジトリの確認

git remote
リポジトリ等の内容の確認

git config -l
リモートリポジトリの削除

git remote rm origin
などとする。

Tweet

zaburo
3845Contribution
Following
人気の投稿

gitでシンプルなデプロイ環境を作る
Bootstrap Form おさらい
Bootstrap3.x.で何かやるときの最低限のメモ
管理画面を作る:AdminLTE 基本編
Laravelの標準Authentication(Auth)の動きを調べてみる
やりたいこと
イメージ
前提条件
手順
リモートリポジトリの用意(リモート)
ローカルの作業場の作成とリモートの登録
とりえずpushしてみる
とりあえずpull(clone)してみる。
リモートサーバからのclone
自動化してみる
パスフレーズを要求しないようにする
リモートリポジトリのpost-receiveを設定する
一連の動きを試してみる
パーミッションについて
メモ
リモートリポジトリの確認
Like
338

Stock
Edit request
Linked from these articles
Linked from Laravel5のプロジェクトをGitで管理するabout 1 year ago
Linked from gitでpushと同時にデプロイする場合の注意about 1 year ago
Linked from さくらVPS+Redmine+Gitで自動デプロイ環境を構築9 months ago
Linked from gitの設定 (ssh認証失敗, gitweb, …)4 months ago
Tweet

musyu2005
0contribution
2016-05-10 11:55
Like
1
興味深い記事をありがとうございます。
「リモートリポジトリのpost-receiveを設定する」で、具体的なファイル名、内容が提示されていたので、ありがたかったです。
ただ、
>などとして単独で事項してみる。
とありますが、
>などとして単独で実行してみる。
のtypoではないかと。

3upjp
190contribution
2017-01-31 11:04
Like
1
.gitがウェブ上に公開される可能性があるので
pullでデプロイはやめた方がいいと思った
Post a comment
EditPreview

Select an image – 0B/2MBPost
© 2011-2017 Increments Inc.TermsPrivacyHelpContactAboutUsersTagsBlogAPITeamKobito Feedback