使用Git将我的Node.js应用部署到生产服务器

3

我在开发机上有一个本地的git仓库。

我想使用git将代码推送到生产服务器,并在代码被推送到生产服务器后触发web服务器的重启。

请问应该使用哪些命令?我正在使用debian系统。

/var/www/example.com 是我的本地仓库。

生产环境主机名为production.example.com,我已经设置好了ssh密钥。

2个回答

4

直接将代码推到运行中的网站通常不是一个好主意。为此,您可以在公共目录之外的服务器上创建一个裸仓库。该仓库将向您的Live网站仓库推送更改,并像“门卫”一样保护您的网站。要设置这些内容,请在您的运行中的网站目录周围创建一个仓库:

$ cd ~/www
$ git init
$ git add .
$ git commit -m"initial import of pre-existing web files"

创建完成后,进入一个不可通过HTTP访问的目录。为了保持简单,我们将这个空目录称为“HUB”,网站目录称为“LIVE”。在此处初始化一个裸仓库:

$ cd; mkdir site_hub.git; cd site_hub.git
$ git --bare init

然后,从您的现场网站工作目录内,将此裸仓库添加为远程仓库,并推送现场网站的主分支。
$ cd ~/www
$ git remote add hub ~/site_hub.git
$ git remote show hub
* remote hub
  URL: /home/rizwan/site_hub.git
$ git push hub master

你需要钩子来提交更改到实时存储库。在HUB存储库中创建一个post-update钩子:

#!/bin/sh

echo
echo "**** Pulling changes into Live [Hub's post-update hook]"
echo

cd $HOME/www || exit
unset GIT_DIR
git pull hub master

exec git-update-server-info

在这个钩子函数中,你可以编写代码,在拉取完成后重启服务器。

此外,在LIVE仓库中创建一个post-commit钩子函数,将对网站所做的更改发送回HUB。

#!/bin/sh

echo
echo "**** pushing changes to Hub [Live's post-commit hook]"
echo

git push hub

在您的本地计算机上,将HUB存储库添加为远程存储库,并将更改推送到它:
git remote add hub <hub-repository-url>

这是如何工作的:您编写一些代码并将其推送到裸仓库,该裸仓库使用其 post-update 钩子将更改推送到实时仓库并重新启动服务器。


如果扩展到多台生产服务器,这将如何运作? - Xerri
你需要编写一个部署脚本,最终在多个远程主机上运行这些命令。 - automaticAllDramatic
那么,既然最终你还是要从拉取到实际上线,为什么不直接推送到实际上线呢? - Ian Warburton

2
我建议在您的服务器上的仓库上使用post-receive钩子,并包含以下内容:
GIT_DIR=/path/to/bare/repo/.git 
GIT_WORK_TREE=/var/www/www.example.org git checkout -f

通过向裸仓库推送,您不会遇到工作树与正在推送的内容不同步的问题(因为裸仓库没有工作树)。然后,您可以通过 post-receive 钩子直接在现场站点目录结构上检出您的裸仓库。
这类似于“git GIT_WORK_TREE post-receive hook deployment remote”。设置 GIT_DIR 可以避免 "Git checkout in post-receive hook: “Not a git repository '.'”" 中提到的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接