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

4dbbbstv  于 5个月前  发布在  Jenkins
关注(0)|答案(3)|浏览(67)

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

pm2 start server.js

一切正常,构建显示成功,但后来当我访问该网站的网址不显示。
我在node server前面有一个nginx服务器,它给出502 Bad Gateway
在检查时,我意识到节点应用程序没有运行,所以我检查了pm2日志,发现发生了这种情况-
2016-08-12 07:53:28:[ PM2/God daemon launched ]**

2016-08-12 07:53:28:BUS系统[READY] on port /var/lib/jenkins/.pm2/pub.sock
2016-08-12 07:53:28:RPC接口[READY] on port /var/lib/jenkins/.pm2/rpc.sock
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:App [server] with id [0] and pid [25822],exit with code [0] via signal [SIGTERM]
2016-08-12 07:53:28:Proc不再定义或正在被杀死

2016-08-12 07:53:28:[PM2]和平解决**
pm2一开始就被杀了,不知道为什么,尝试从npm重新安装pm2没有工作。
Ubuntu 14.04 LTS
Node v4.4.7 LTS
npm v2.15.8
pm2 v1.1.3
工作暂停,请立即提供帮助。

kmpatx3s

kmpatx3s1#

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

export BUILD_ID=dontKillMePlease

而不是

pm2 start server.js

使用

pm2 restart server.js

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

7ajki6be

7ajki6be2#

ProcessTreeKiller
为了在构建过程中可靠地杀死由作业产生的进程,Jenkins包含了一些本地代码来列出这些进程并杀死它们
...

如何运作

ProcessTreeKiller利用了这样一个事实,即默认情况下,新进程会获得其生成/创建进程的环境变量的副本。
它在执行生成作业的进程中设置特定的环境变量。稍后,当用户请求停止生成作业的进程时,它将获取计算机上运行的所有进程及其环境变量的列表,并查找最初为生成作业的进程设置的环境变量。
然后,终止其环境中具有该环境变量的每个作业。

如果您的构建想要留下后台程序运行...

一个方便的方法是更改Jenkins的ProcessTreeKiller正在查找的环境变量BUILD_ID。这将导致Jenkins假设您的守护进程不是由Jenkins构建产生的。例如:
第一个月

zrfyljdw

zrfyljdw3#

在较新版本的Jenkins中,BUILD_ID已弃用。请改用JENKINS_NODE_COOKIE=dontKillMe
在我的Jenkins文件中,我像下面这样使用它

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

字符串
如果要调用shell脚本,请在shell脚本文件中添加JENKINS_NODE_COOKIE=dontKillMe。

相关问题