经过一番研究,我确实找到了一个解决方案,实际上它似乎也起作用。几乎没有记载和有点马车 - 但它应该自我更新的NodeJS应用程序的基本宗旨的工作:http://registry.npmjs.org/gitlabhook
这是我如何编码它(直接从我的代码获得):
var fs=require("fs");
module.exports = function() {
// Dynamically write this config.
var obj = {
tasks: {
"*": [
"cd '"+config.base+"'",
"git pull",
"git submodule update",
"npm install",
"node lib/updater.js '%m'"
],
}
}, str = JSON.stringify(obj), glConf = config.base+"/config/gitlabhook.json";
log.info("BIRD3 Autp updater: Generating config to "+glConf);
fs.writeFileSync(glConf, str);
// Set it up
var gitlabhook = require("gitlabhook"),
gitlab = gitlabhook({
host: config.host,
configFile: "gitlabhook.json",
configPathes: [ config.base+"/config" ],
logger: log,
});
log.info("BIRD3 Auto updater: Starting");
gitlab.listen();
BIRD3.on("update", function(){
setTimeout(function(){
log.info("BIRD3 Auto updater: Exiting to allow update.");
process.exit(2);
}, 200);
});
log.info("BIRD3 Auto Updater -> Online!");
}
要解释:
- 配置是一个全局对象,存储应用程序特定的东西。 config.base等于主脚本的路径。
- BIRD3是应用程序的名称。
- BIRD3对象是通过整个应用程序共享的EventEmitter。
updater.js
向redis服务器发送一条消息 - 通过应用程序的另一半,它将转换为适当的事件。
- 我正在生成.json文件,仅仅是因为我即将移动服务器。为了保持动态,我决定处理这个问题。
- Gitlabhooks需要单独提供的配置文件名和目录。在调用过程中提供任务对象将导致不查找配置文件。回调接收到一个对象,其布局如下:https://gist.github.com/IngwiePhoenix/d08629af01ce93e39e4b
我看到这个模块有很大的潜力,并希望它可以进一步发展。
但是,如果您有其他解决方案也可以使用,请分享它。我相信其他可能会阅读此内容的人会发现它很有用,因为它是连续部署的一个很好的功能。
我认为gitlab的web钩子将非常适合这个。例如,gitlabhook模块可以监听钩子,但是我自己实现这个功能时遇到了一些问题。我自己做了一件非常黑的东西,但会对更合适的解决方案感兴趣。 – 2014-09-03 22:51:40
这似乎是一件有趣的事情,但它看起来像钉子吗?我的意思是,你有使用应用程序自我更新?有很多经过验证和测试的连续部署工具,不需要增加Node应用程序的复杂性。 – Zlatko 2014-09-05 13:10:12
@Zlatko:我已经看到了一些工具,但从未理解它们是如何工作的。如果我看到一个,它谈到自动发布新版本等......它让我困惑。所以我寻求一个解决方案,听起来更像我所需要的 - 可以更新自身并重新启动的代码。但是,如果你有一个好的软件来推荐,那么我会仔细研究它。 – 2014-09-05 18:03:24