【发布时间】:2021-11-17 04:42:16
【问题描述】:
我正在尝试设置我的 Jenkins 管道以在部署步骤期间运行 pm2 start 命令。 pm2 start 命令位于 Bash 脚本中,并使用 pm2 运行我的 Python 程序。每次我手动运行构建时,Jenkins 控制台都会报告构建成功,并且控制台输出显示 pm2 已启动 Python 程序并为其分配了一个 PID。
这是 Jenkins 构建控制台输出的最后几行:
+ ./start_pm2.sh
[PM2] Starting /var/lib/jenkins/workspace/rocket-league-tourney-bot/rocket_league_tourney_bot.py in fork_mode (1 instance)
[PM2] Done.
┌─────┬──────────────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼──────────────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ rocket_league_tourney_bot │ default │ N/A │ fork │ 28304 │ 0s │ 0 │ online │ 0% │ 6.3mb │ jenkins │ disabled │
└─────┴──────────────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
但是,如果我登录到远程机器(AWS EC2 实例),我看到 pm2 分配的 PID 不存在并且程序没有运行。
我检查了 PID 并以 jenkins 用户的身份运行 pm2 list,我发现它已经停止:
[root@ip-xxx-xx-xx-xxx logs]# ps -s 28304
PID TTY TIME CMD
[root@ip-xxx-xx-xx-xxx logs]# runuser -u jenkins pm2 list
┌─────┬──────────────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼──────────────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ rocket_league_tourney_bot │ default │ N/A │ fork │ 0 │ 0 │ 0 │ stopped │ 0% │ 0b │ jenkins │ disabled │
└─────┴──────────────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pm2 日志也无济于事:
[root@ip-xxx-xx-xx-xxx logs]# runuser -u jenkins pm2 log
[TAILING] Tailing last 15 lines for [all] processes (change the value with --lines option)
/var/lib/jenkins/.pm2/pm2.log last 15 lines:
PM2 | 2021-09-23T18:42:47: PM2 log: App [rocket_league_tourney_bot:0] online
PM2 | 2021-09-23T18:44:28: PM2 log: Stopping app:rocket_league_tourney_bot id:0
PM2 | 2021-09-23T18:44:28: PM2 log: App [rocket_league_tourney_bot:0] exited with code [0] via signal [SIGINT]
PM2 | 2021-09-23T18:44:28: PM2 log: pid=27651 msg=process killed
PM2 | 2021-09-23T18:47:47: PM2 log: App [rocket_league_tourney_bot:0] starting in -fork mode-
PM2 | 2021-09-23T18:47:47: PM2 log: App [rocket_league_tourney_bot:0] online
PM2 | 2021-09-23T18:48:03: PM2 log: Stopping app:rocket_league_tourney_bot id:0
PM2 | 2021-09-23T18:48:03: PM2 log: App [rocket_league_tourney_bot:0] exited with code [0] via signal [SIGINT]
PM2 | 2021-09-23T18:48:03: PM2 log: pid=27739 msg=process killed
PM2 | 2021-09-23T18:50:37: PM2 log: App [rocket_league_tourney_bot:0] starting in -fork mode-
PM2 | 2021-09-23T18:50:37: PM2 log: App [rocket_league_tourney_bot:0] online
PM2 | 2021-09-23T18:50:37: PM2 log: App [rocket_league_tourney_bot:0] exited with code [0] via signal [SIGTERM]
PM2 | 2021-09-23T19:00:31: PM2 log: App [rocket_league_tourney_bot:0] starting in -fork mode-
PM2 | 2021-09-23T19:00:31: PM2 log: App [rocket_league_tourney_bot:0] online
PM2 | 2021-09-23T19:00:31: PM2 log: App [rocket_league_tourney_bot:0] exited with code [0] via signal [SIGTERM]
/var/lib/jenkins/.pm2/logs/rocket-league-tourney-bot-out.log last 15 lines:
/var/lib/jenkins/.pm2/logs/rocket-league-tourney-bot-error.log last 15 lines:
输出和错误日志文件都是空的。
我验证了环境变量和 Python/Pip 在 jenkins 用户的范围内。会发生什么?谢谢。
【问题讨论】:
-
听起来好像在构建完成后,Jenkins 正在杀死它开始的一切。 (自行清理。)请参阅此问题/答案:serverfault.com/questions/502593/…
-
我在 Jenkins 构建步骤中设置了
BUILD_ID=dontKillMe和JENKINS_NODE_COOKIE=dontKillMe python3,但它仍然无法正常工作。这应该在 pm2 开始之前还是之后? -
我会尝试
export BUILD_ID=dontKillMe然后export JENKINS_NODE_COOKIE=dontKillMe然后./start_pm2.sh &每个命令都在单独的行上。 -
这是我的部署步骤,进行了这些更改,但仍然无法正常工作.. ` stage('Deploy') { steps { echo 'Deploying....' sh "export BUILD_ID=dontKillMe" sh "export JENKINS_NODE_COOKIE=dontKillMe" sh "chmod +x ./start_pm2.sh" sh "chmod +x ./stop_pm2.sh" sh "./stop_pm2.sh || true" sh "./start_pm2.sh" } } `
标签: python jenkins jenkins-pipeline pm2