【问题标题】:using git to deploy my node.js app to my production server使用 git 将我的 node.js 应用程序部署到我的生产服务器
【发布时间】:2012-10-04 07:19:26
【问题描述】:

我的开发机器上有一个本地 git 存储库。

我想使用 git 将代码推送到我的生产服务器。并在将代码推送到那里后触发 Web 服务器的重新启动。

执行此操作的命令是什么?我正在使用 debian。

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

生产主机名是 production.example.com 我已经设置了 ssh + 密钥。

【问题讨论】:

    标签: git node.js


    【解决方案1】:

    将代码直接推送到实时网站通常不是一个好主意。为此,您可以在公共目录之外的服务器上创建一个裸存储库。此存储库会将更改推送到您的 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>
    

    它的工作原理是,您编写一些代码并将其推送到裸存储库,该存储库使用其更新后挂钩将更改推送到实时存储库并重新启动服务器。

    【讨论】:

    • 如果您扩展到拥有多个生产服务器,这将如何工作?
    • 你必须编写一个部署脚本,最终在多个遥控器上运行这些命令。
    • 那么,当您最终还是要拉动生存时,为什么不直接推动生存呢?
    【解决方案2】:

    我建议在您的服务器上的 bare 存储库上使用 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 '.'”中提到的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      相关资源
      最近更新 更多