2012-02-03 35 views
89

我有我的应用程序(node.js)部署在VPS(linux)上。我使用git hub作为存储库。如何在git push上自动部署应用程序?如何在git push(GitHub和node.js)后自动部署我的应用程序?

+4

你检查了git hooks http://progit.org/book/ch7-3.html,还检查了github http://help.github.com/test-webhooks/ – 2012-02-03 17:36:10

+1

更新了上面的progit链接: http://git-scm.com/book/en/Customizing-Git-Git-Hooks – 2014-02-18 03:40:02

+0

Git 2.10将添加一个有趣的功能:推送选项http://stackoverflow.com/a/38770670/6309 – VonC 2016-08-04 14:58:43

回答

8

在我正在开发的一个项目中,我遵循Jez Humble精彩的书“持续交付”(非常值得一读)中介绍的指导方针。

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

这听起来很复杂,但并不是必须的,它确实使编写代码的整个过程变得安全无忧(无可怕的发布日子!)。

我为实时系统使用了完整的部署管道,并且使用了我编写的用于npm模块的减少版本,并且都共享相同的单击部署技术。

+0

&另一个+1为书推荐!我发现CI不会随便接近。 – Merrick 2013-10-04 18:25:30

+0

好吧,人们问一个简单的问题,你给出了一个完整的解决方案:)。我不得不说这是一个矫枉过正的问题。但是如果您已经在使用连续交付,也许这就是要走的路线。 – windmaomao 2015-03-19 16:13:29

59

例在PHP中:

导航到Github上到你的GitHub库添加单击 “管理”

点击选项卡 '服务鱼钩'=> '网络挂接网址'

,并添加

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'); 
} 

在你需要把常用的命令来从GitHub

+6

嗨,非常感谢。什么阻止Bob执行我的部署脚本? – Advanced 2013-05-17 13:07:49

+0

ps:你忘了关闭<?php – Advanced 2013-05-17 15:52:01

+16

@Advanced 1可能是脚本权限,执行标志... 2在PHP中添加结束标记是一种不好的做法。 – 2013-05-17 20:46:27

23

有检索您的网站build.sh是几个提到的Git钩子答案/评论,这对我在过去的工作中..所以这里是我的食谱,如果其他人需要更多细节。

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


设置你的后receive挂钩

在你的资料库: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会在推送到repo后刷新应用程序目录中的文件。


与节点主管

运行节点,您需要在您的计算机上安装节点主管作为全球节点模块:sudo npm install supervisor -g

现在只需运行与节点的节点应用它会监视您的工作目录中的文件更改:

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

+0

这很好,但有一点需要注意的是,如果您将新的npm添加到本地应用程序中,则还需要在服务器上为该模块执行npm install。如果你不这样做,你可能会有一个崩溃的应用程序。 – k00k 2012-04-25 17:42:56

+2

不能。我的本地应用程序依赖的任何节点模块都安装在我的项目的node_modules子目录中,这是我本地的GIT repo,因此当我添加,提交时,然后推送到远程服务器,它们也会被复制。 – 2012-04-28 16:57:12

+8

没错,但这意味着如果其中任何一个模块都有编译好的代码(例如mhash),它可能无法在另一个操作系统和/或体系结构的另一台服务器上运行。使用package.json跟踪您的依赖关系,然后在远程服务器上执行'npm install -l'的部署策略是非常明智的。这当然可以与使用post-receive钩子的方法相结合。 – k00k 2012-04-28 17:40:43

8

我刚刚出版了基于节点的解决问题的方法:node-cd

它包括在你的VPS运行一个简单的节点应用程序,将收到Github post-receive Hooks并执行一个你喜欢的脚本(例如一个会杀死你的应用程序的shell脚本,git pull,然后重新启动它)。

+0

+1,因为它是纯粹的node.js,所以海报不必添加任何东西到他们的堆栈,或者使用他们不舒服的语言同时,真的很好地布置代码 – 2014-02-22 18:56:10

3

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

这是一个非常简单的节点服务器,它可以在您配置的主机名和端口上运行,并且可以设置为处理GitHub发布接收Web挂钩。而实际的pul/test/deploy操作可以被自定义以执行任何你想要的操作。在当前的实现中,它是在nodeJS服务器脚本中内联指定的shell命令。还有一个非常简单的基于secret_key的安全机制。

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

我的临时服务器已经有节点安装并运行,所以写这件事是方便快捷。

+0

“http://www.yourdomain.com:8088/update?site=wwws&secret_key=YOUR_SECRET_KEY” - 真的?!“秘密”密钥在URL中清晰传递! – 2014-09-08 09:01:54

+1

有一个阿司匹林并安置朱利安当使用https时获取参数是加密的 – Gavin 2015-05-16 06:07:38

17

可能很晚才会在这里回应。但是我在github上发现了这个项目,似乎是以一种更简洁的方式做你想做的事情。

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

检查出来。也有兴趣知道别人怎么看待这个评论和upvotes。

干杯,
小号

+15

*“在这里可能很晚回复。”*永远不会太晚:)你实际上是对整个社区做出贡献的我们大多数谷歌;哇,只是罗在这些20k的意见中做出这种看法!),而不是那个单独的人在前段时间问过这个问题。时间本身是无关紧要的:只要相关的技术*是相关的,你的答案也将是。 (感谢提示,顺便说一句,检查出来......) – 2014-05-11 10:41:20

+1

感谢您的headUp! ;)当时它对我很好。现在我更愿意使用travis(travis-ci.org),(**我可以**的任何地方)进行自动化部署。 @lunakid – Saurabh 2014-05-11 15:03:29

1

我已经创建了自己的初步部署工具会自动从回购拉下新的更新 - https://github.com/jesalg/SlimJim - 基本上,它监听GitHub的后收到钩和使用代理触发更新脚本。

3

我发现项目很容易部署使用git。

git-play

我认为这是你正确的方法。

检查出来。

2

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

它基本上使用一个JSON配置文件来列出你期望从哪个回收站推出,你想在deploy上运行哪些命令,以及这些命令必须运行在哪个目录中。你只需要做根据你的喜好修改配置文件并运行脚本!

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

快乐推!

1

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

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

1

Deepl.io似乎是在这个领域新的和有希望的竞争者。

特点(从它的网站获取):从GitLab & GitHub的

  • 配置多个存储库
  • 配置每个仓库
  • 多个分支使用您自己的部署脚本,或者PHP

    • 捕捉网络挂接,外壳或两者兼有
    • 发送确认电子邮件
  • 1

    此外还有免费/便宜的服务,如REPOMAN.IO,几乎所有这些都为你自动化。

    相关问题