我遇到了一个奇怪的问题,当我运行 vagrant up 时,虚拟机构建良好并按预期工作,但是当我在 Jenkinsfile 管道中运行相同的命令时,构建完成后,虚拟机会关闭并创建日志。
Log created: 2021-01-15T12:32:44.144568000Z
Process ID: 9678 (0x25ce)
Parent PID: 1 (0x1)
Executable: /usr/lib/virtualbox/VBoxSVC
Arg[0]: /usr/lib/virtualbox/VBoxSVC
Arg[1]: --auto-shutdown
AddRef: illegal refcnt=3221225469 state=2
这是 vagrant 的管道代码
stage('Run Vagrant'){
sh 'cd /var/lib/jenkins/workspace/jenkins-file_master/ansible/; vagrant up'
}
Jenkins config设置为同一个用户,这样环境就是一样的。
# user and group to be invoked as (default to jenkins)
JENKINS_USER=myusername
JENKINS_GROUP="adm cdrom sudo dip plugdev lpadmin lxd sambashare docker vboxusers"
答案1
您遇到了进程树终止程序,这是 Jenkins 的一项“功能”,它会在构建终止时终止构建启动的所有进程。目的是防止 Jenkins 构建启动服务、守护进程或其他可能影响其他构建或 Jenkins 机器本身的长期进程。
有几种方法可以禁用此功能,如 wiki 和这个 SO 问题中所述:
- https://wiki.jenkins.io/display/JENKINS/ProcessTreeKiller
- https://stackoverflow.com/questions/39169457/how-to-tell-jenkins-not-to-kill-processes-after-successful-execution-of-job-in-m
这些修复包括:
- 在 Jenkins 进程上设置 Java 参数
-Dhudson.util.ProcessTree.disable=true
(就我个人而言,这个解决方案效果最好) - 在构建过程中,更改环境变量的值
BUILD_ID
(对于 Freestyle 和其他非 Pipeline 作业)或JENKINS_NODE_COOKIE
(对于 Pipeline 作业)