git push之后如何自动部署我的应用程序(GitHub和node.js)?


92

我在VPS(Linux)上部署了我的应用程序(node.js)。我正在使用git hub作为存储库。如何在git push上自动部署应用程序?


4
您是否检查过git hooks progit.org/book/ch7-3.html,还检查了github help.github.com/test-webhooks
Pawel Dubiel

1
上面的progit链接更新:git-scm.com/book/en/Customizing-Git-Git-Hooks
代码

Git 2.10将会添加一个有趣的功能:推送选项stackoverflow.com/a/38770670/6309
VonC

Answers:


63

PHP中的示例:

导航到github到您的github存储库中,然后单击“管理员”

单击标签“服务挂钩” =>“ WebHook URL”

并添加

http://your-domain-name/git_test.php

然后创建git_test.php

<?php 
try
{
  $payload = json_decode($_REQUEST['payload']);
}
catch(Exception $e)
{
  exit(0);
}

//log the request
file_put_contents('logs/github.txt', print_r($payload, TRUE), FILE_APPEND);


if ($payload->ref === 'refs/heads/master')
{
  // path to your site deployment script
  exec('./build.sh');
}

在build.sh中,您将需要放置常用命令以从github检索您的站点。


6
嗨,非常感谢。是什么阻止Bob执行我的部署脚本?
先进的

16
@Advanced 1可能是脚本权限,执行标志... 2在PHP中添加结束标记是一种不好的做法。
Pawel Dubiel

3
@Advanced确保Bob不执行脚本的一种技术是确保POST请求来自Github的服务器。检查发出请求时发送的HTTP标头。您也可以创建一个不可猜测的“秘密” URL。
2014年


1
@ Arius2038曾经听说过“您每天都学到新东西”吗?好吧,这是我今天的“新事物”。感谢分享!
Purefan

23

过去曾有几次提到Git挂钩作为答案/评论,这对我有用。.所以如果有人需要更多细节,这是我的食谱。

我结合使用git post-receive钩子node-supervisor来完成简单的自动部署(假设您在该机器上使用git远程存储库)。


设置您的接收后挂钩

在您的存储库中: sudo vi hooks/post-receive

它看起来应该像这样:

#!/bin/sh
GIT_WORK_TREE=/home/path/to/your/www
export GIT_WORK_TREE
git checkout -f

设置文件权限: chmod +x hooks/post-receive

推送到仓库后,Git将刷新您应用目录中的文件。


使用Node-Supervisor运行Node

您需要在计算机上将Node-Supervisor作为全局节点模块安装: sudo npm install supervisor -g

现在,只需使用node-supervisor运行您的节点应用程序,它将监视您的工作目录中文件的更改:

supervisor /home/path/to/your/www/server.js(请注意,supervisor而不是node)。


很好,但是要注意的一件事是,如果将新的npm添加到本地应用程序,则还需要为服务器上的该模块执行npm安装。如果不这样做,您可能会崩溃。
k00k 2012年

2
否。我的本地应用程序依赖的任何节点模块都安装在我的项目的node_modules子目录中,这是我的本地GIT存储库,因此,当我添加,提交并推送到远程服务器时,它们也会被复制。
Wes Johnson

8
是的,但这意味着如果这些模块中的任何一个包含已编译的代码(例如,像mhash),它可能就不会在具有不同操作系统和/或体系结构的另一台服务器上运行。使用package.json跟踪依赖关系,然后npm install -l在远程服务器上执行部署策略很聪明。当然,这可以与使用后接收挂钩的方法结合在一起。
2012年

1
并且您可以直接将Git工作树添加到git checkout命令中:git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f(而不是创建变量并将其导出到脚本中
JasonB,2013年

问题是关于Github的。
诺亚

18

在这里回复的时间可能很晚。但是我在github上找到了这个项目,并且似乎可以做的很简单,但是却可以做到。

https://github.com/logsol/Github-Auto-Deploy

看看这个。也将有兴趣知道其他人在评论和投票方面对此有何看法。

干杯,
S


15
“在这里回复可能很晚了。” 不算太迟。:)实际上,您是在为整个社区做出贡献(我们大多数Google员工;哇,只看那2万个浏览量!),不是一个人在“前一段时间”问过这个问题。时间本身是无关紧要的:只要所讨论的技术是相关的,您的答案也将是相关的。(感谢小费,顺便说一句,签出...)
Sz。

1
感谢您的抬头!;)当时对我来说很棒。现在,我更喜欢使用travis(travis-ci.org)(在任何可能的地方)进行自动部署。@lunakid
Saurabh Kumar

8

在我目前正在开发的一个项目中,我遵循Jez Humble出色的著作“ Continuous Delivery”(非常值得一读)中涵盖的指导原则。

这意味着使用某种形式的连续集成服务器(我使用Thought软件的Go社区免费版)创建部署管道,该服务器负责首先检查代码的质量,复杂性和运行单元测试。然后,它可以遵循部署管道,从而推送到生产服务器。

这听起来很复杂,但不是必须的,它确实使编写代码的整个过程变得安全且无忧(无需担心发行日!)。

我为实时系统使用了完整的部署管道,为我编写的npm模块使用了简化版本,并且两者共享相同的一键式部署技术。


和另外+1推荐书!我发现不要随意接触CI。
梅里克

好吧,人们问一个简单的问题,您给出一个完整的解决方案:)。我不得不说这太过分了。但是,如果您已经在使用连续交付,那么也许这就是可行的方法。
windmaomao 2015年

8

我刚刚发布了针对您问题的基于节点的解决方案:node-cd

它包含一个在VPS上运行的简单节点应用程序,该应用程序将接收Github接收后挂钩并执行您喜欢的脚本(例如,将杀死您的应用程序,git pull并重新启动它的shell脚本)。


+1是纯Node.js,因此发布者不必在堆栈中添加任何内容,也不必使用不熟悉的语言。此外,代码布局也非常好
code_monk 2014年

3

这是另一个简单的nodeJS实现。

这是一个非常简单的节点服务器,可在您配置的主机名和端口上运行,并可设置为处理GitHub post receive web hooks。实际的pul / test / deploy操作可以进行自定义以执行您想要的任何事情。在当前实现中,这是一个在nodeJS服务器脚本中内联指定的shell命令。同时,还有一个非常简单的基于secret_key的安全方案。

https://github.com/shyam-habarakada/rscds

我的登台服务器已经安装并正在运行节点,因此编写此脚本既快速又容易。


yourdomain.com:8088/…”-真的吗?URL中以明文形式传递了“秘密”键!没有人应该使用它。
朱利安·奈特

1
吃阿司匹林,安顿朱利安。使用https时,获取参数被加密。
加文

3

我发现易于部署的项目使用git。

混战

我认为这是适合您的方式。

看看这个。


2

如果您需要基于python / tornado的解决方案,我编写了一个脚本来处理来自Github的Webhook Services的 POST请求。您可以在https://github.com/Akobi/ops/tree/master/autodeploy中找到它

它基本上使用JSON配置文件来列出您希望从中推送哪些存储库,要在部署时运行的命令以及必须在哪个目录中运行。您所要做的就是根据自己的喜好修改配置文件并运行剧本!

另外,我使用Nginx作为反向代理,将这些POST转发到我的脚本。您可以在“ nginx”文件夹下的同一Github存储库中找到Nginx配置。

快乐推!



1

我已经创建了自己的基本部署工具,该工具会自动从存储库中提取新更新-https: //github.com/jesalg/SlimJim-基本上,它会监听github post-receive-hook并使用代理触发更新脚本。


1

我是https://commando.io的创始人,最近我们宣布通过一项服务与GitHub集成。通过集成,您可以在推送到GitHub存储库时在服务器上运行执行。这是在推送代码时自动运行部署脚本的绝佳机会。

执行是您在Commando.io内部编写的脚本,可以用bash,perl,python,ruby,go或node.js编写。要了解更多信息,并查看running的示例执行脚本git pull,请参阅我们的博客文章公告:http : //blog.commando.io/run-executions-via-github-push/


1

Deepl.io在这个领域似乎是新的有前途的竞争者。

功能(来自其网站):

  • 从GitLab和GitHub捕获Webhooks
  • 配置多个存储库
  • 每个存储库配置多个分支
  • 使用您自己的部署脚本,PHP,shell或同时使用两者
  • 发送确认邮件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.