使用 jenkins 在 EC2 上运行的 pm2 不起作用?

问题描述 投票:0回答:3

我正在 AWS EC2 服务器上运行我的节点应用程序。 为了持续集成,我在 EC2 上安装了 Jenkins,jenkins 连续轮询代码提交,并在提交发生时执行脚本中编写的一些命令。

最后一个命令是

pm2启动server.js

一切正常,构建显示成功,但稍后当我访问 URL 时,该网站不显示。

我在节点服务器前面有一个 nginx 服务器,它给出了 502 网关错误

检查后我意识到节点应用程序没有运行,所以我检查了 pm2 日志并发现这种情况发生 -

2016-08-12 07:53:28: [[[[ PM2/God 守护进程启动 ]]]]

2016-08-12 07:53:28:端口 /var/lib/jenkins/.pm2/pub.sock 上的总线系统 [READY]

2016-08-12 07:53:28:端口 /var/lib/jenkins/.pm2/rpc.sock 上的 RPC 接口 [READY]

2016-08-12 07:53:28:以-fork模式-启动执行序列,应用程序名称:服务器id:0

2016-08-12 07:53:28: 应用名称:服务器id:0 在线

2016-08-12 07:53:28: pm2 已被信号杀死,退出前转储进程列表...

2016-08-12 07:53:28: 删除进程0

2016-08-12 07:53:28:停止应用程序:服务器 ID:0

2016-08-12 07:53:28:具有 id [0] 和 pid [25822] 的应用程序 [服务器],通过信号 [SIGTERM] 以代码 [0] 退出

2016-08-12 07:53:28:Proc 不再定义或正在被杀死

2016-08-12 07:53:28: [PM2] 平静退出

pm2 一启动就被杀死了,不知道为什么,尝试从 npm 重新安装 pm2 不起作用。

Ubuntu 14.04 LTS

节点 v4.4.7 LTS

npm v2.15.8

pm2 v1.1.3

工作暂停,请立即寻求帮助。

node.js jenkins amazon-ec2 pm2
3个回答
2
投票

答案在 Dusan Bajic 给出的评论中,如果有人使用节点应用程序在 EC2 上与 jenkins 进行持续集成,并且 pm2 发生类似的事情,只需在启动 pm2 之前在脚本中添加此行即可。

导出 BUILD_ID=dontKillMePlease

而不是

pm2启动server.js

使用

pm2重启server.js

server.js 是您的应用程序,否则如果在 jenkins 中提交并且它再次运行脚本,构建将会失败,因为 pm2 已经在运行 server.js 并且不会停止。


1
投票

来自 ProcessTreeKiller

为了可靠地终止构建期间由作业生成的进程,Jenkins 包含一些本机代码来列出此类进程并杀死它们

...

如何运作

ProcessTreeKiller 利用了以下事实: 默认情况下,新进程会获取其环境变量的副本 产卵/创建过程。

它在执行进程中设置特定的环境变量 建立工作。稍后,当用户请求停止构建作业时 process 它获取计算机上运行的所有进程的列表,并且 他们的环境变量,并查找环境变量 它最初是为构建作业的过程设置的。

然后,在其环境中具有该环境变量的每个作业 终止。

如果您的构建想要让守护进程留在后面运行...

实现此目的的一个便捷方法是更改环境变量 Jenkins 的 ProcessTreeKiller 正在寻找的 BUILD_ID。这会 导致 Jenkins 假设您的守护进程不是由 Jenkins 生成的 建造。例如:

BUILD_ID=dontKillMe /usr/apache/bin/httpd


0
投票

在较新版本的 Jenkins 中,BUILD_ID 已弃用。而是使用 JENKINS_NODE_COOKIE=dontKillMe

在我的 Jenkinsfiles 中,我像下面这样使用它

stage('Run') {
            steps {
                script {
                   sh 'export JENKINS_NODE_COOKIE=dontKillMe; pm2 --name SampleApp start npm -- start'
                }
            }
        }

如果您调用 shell 脚本,请在 shell 脚本文件中添加 JENKINS_NODE_COOKIE=dontKillMe。

© www.soinside.com 2019 - 2024. All rights reserved.