git pushを使用して、小さなWebアプリケーションをサーバーにすばやくデプロイします

コンテキスト


小規模なWebプロジェクトをサポートするとします。 git、デバッガー、その他の便利な機能を備えた開発サンドボックスがあります。 サイトは既に実行されており、コードはサンドボックスからリモートサーバーにコピーされます。 コードには、時々(そして場合によっては)更新と修正が必要です。 変更はすべてサンドボックスで自然に実行されます。 そして、ここで疑問が生じます:サーバー上のコードを可能な限りシンプルで便利に更新する方法は?

最初に思い浮かぶソリューションは、単純なgit pushコマンドです。リモートリポジトリにプッシュし、サーバー上のコードの更新バージョンを取得します。 しかし、それほど単純ではありません。


熱意に合わせて、サーバー上のリポジトリを設定し、Webサーバーから.gitフォルダーを慎重に非表示にします。 ただし、すべてがそれほど単純なわけではありません。サンドボックスの最初の変更後、大切なgit pushサーバーマスターは次のようなものを返します

remote: error: refusing to update checked out branch: refs/heads/master remote: error: By default, updating the current branch in a non-bare repository remote: error: is denied, because it will make the index and work tree inconsistent remote: error: with what you pushed, and will require 'git reset --hard' to match remote: error: the work tree to HEAD. remote: error: remote: error: You can set 'receive.denyCurrentBranch' configuration variable to remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into remote: error: its current branch; however, this is not recommended unless you remote: error: arranged to update its work tree to match what you pushed in some remote: error: other way. remote: error: remote: error: To squelch this message and still keep the default behaviour, set remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. 


このメッセージの一般的な意味は次のとおりです。「作業ツリーがブランチの状態に対応しないため、非ベアリポジトリの現在のブランチにプッシュすることはできません」。

裸のリポジトリの場合、このようなエラーは発生しないことに注意してください。 しかし、このタイプのリポジトリは、私たちの目的にはまったく不適切です。

また、現在のブランチにプッシュしなくてもエラーは発生しません。 この操作の結果は、必要なものからさらに遠くなります。

コンセプト


この問題を解決するために、フック(トリガー)を使用してリポジトリで実行された操作に応答するgitの機能を利用します。

まず、サーバーに再度ログインして、本番ブランチを作成します
 git checkout -b production 


ファイル.git / hooks / post-receiveを編集します。 コンテンツは次のようになります。
 #!/bin/sh cd .. env -i git merge --ff-only master 


この設定により、リモートリポジトリを現在の運用ブランチに残すことができます。 そして、このリポジトリへの各プッシュは、実稼働環境でmasterブランチのマージを呼び出し、実際に作業ディレクトリ内のファイルを更新します。

スクリプトを実行する許可を設定することを忘れないでください:
 chmod +x .git/hooks/post-receive 


喜んでサンドボックスに戻ります。 これで、シンプルなgit push server masterコマンドでプロダクションを更新できます

素敵な追加


.git / hooks / post-receiveファイルの最後に、スクリプト呼び出しを追加できます。スクリプト呼び出しを実行するには、コードを完全に展開する必要があります。 たとえば、キャッシュのクリア、ロケールファイルの組み立て、データベースの更新など...

インスピレーションの源


Source: https://habr.com/ru/post/J151997/


All Articles