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

Adv*_*ced 92 git push github githooks node.js

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

Paw*_*iel 63

PHP中的示例:

导航到github进入你的github存储库添加点击"管理员"

点击标签'Service Hooks'=>'WebHook网址'

并添加

http://your-domain-name/git_test.php
Run Code Online (Sandbox Code Playgroud)

然后创建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');
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Advanced 1可能是脚本权限,执行标志... 2在PHP中添加结束标记是一种不好的做法. (16认同)
  • 嗨,非常感谢你.什么阻止Bob执行我的部署脚本? (6认同)
  • @Purefan不是开玩笑:) http://stackoverflow.com/questions/3219383/why-do-some-scripts-omit-the-closing-php-tag (5认同)
  • @Advanced确保Bob不执行脚本的一种技术是确保POST请求来自Github的服务器.查看发出请求时发送的HTTP标头.您还可以创建一个无法猜测的"秘密"网址. (3认同)
  • @Arius2038 听说过“你每天都在学习新东西”吗?好吧,这就是我今天的“新事物”。感谢分享! (2认同)

Wes*_*son 23

有几个提到Git钩子作为答案/评论,过去对我有用..所以这是我的配方,如果其他人需要更多的细节.

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


设置您的接收后挂钩

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

它应该看起来像:

#!/bin/sh
GIT_WORK_TREE=/home/path/to/your/www
export GIT_WORK_TREE
git checkout -f
Run Code Online (Sandbox Code Playgroud)

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

在推送到repo后,Git将刷新app目录中的文件.


使用Node-Supervisor运行节点

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

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

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

  • 是的,但这意味着如果这些模块中的任何一个具有已编译的代码(例如mhash),则它可能无法在另一个不同操作系统和/或体系结构的服务器上运行.使用package.json来跟踪您的依赖关系,然后在远程服务器上执行`npm install -l`的部署策略是智能的.这当然可以使用post-receive hooks与你的方法结合使用. (8认同)
  • 没有..我的本地应用所依赖的任何节点模块都安装在我的项目的node_modules子目录中,这是我的本地GIT仓库,因此当我添加,提交,然后推送到远程服务器时,他们也会被复制. (2认同)

Sau*_*abh 18

可能很晚才回到这里.但是我在github上找到了这个项目,似乎做了你想做的事,但是以更清洁的方式.

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

看看这个.也有兴趣知道其他人在评论和赞成票方面的想法.

干杯,
S

  • *"在这里可能很晚才回来."*永远不会太晚.:)你实际上是在为整个社区做贡献(我们大多数人都是googlers;哇,看看那些20k的观点!),而不是那个单独的人"问过一段时间".时间本身就是无关紧要的:只要有问题的*技术*是相关的,你的答案也是如此.(感谢小费,BTW,检查出来......) (15认同)

小智 8

在我正在开发的项目中,我遵循Jez Humble的精彩书籍"持续交付"中所涵盖的指导原则(非常值得一读).

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

这听起来非常复杂,但并非必须如此,并确实使编写代码的整个过程成为安全无忧的生产方式(没有可怕的发布日!).

我使用实时系统的完整部署管道,以及我编写的npm模块的缩减版本,并且两者共享相同的一键式部署技术.


A21*_*21z 8

我刚刚发布了一个基于节点的解决方案来解决你的问题:node-cd

它包含一个在你的VPS上运行的简单节点应用程序,它将接收Github后接收Hook并执行你喜欢的脚本(例如一个shell脚本会杀死你的app,git pull,然后重启它).