Jenkins pipeline运行和停止后台脚本

在Jenkins Pipeline中,由于默认配置,使用`java`启动的后台进程会在Pipeline结束时被终止。为了解决这个问题,可以通过设置环境变量JENKINS_NODE_COOKIE避免进程被kill。如果需要启动多个后台进程,可以将它们放在同一个`script`块中。此外,文章还介绍了如何使用特定命令启动和杀死后台进程,并提供了参考资料链接,以解决`java not found`的问题,该问题可能由非标准JDK安装引起,需要确保Jenkins能够找到正确的`java`路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Pipeline运行结束后,Jenkins缺省会kill掉该Pipeline的子进程。因此在pipeline中通过nohup java -jar app.jar > app.log & 的方式启动的java后台进程在Pipeline结束后会被Jenkins杀掉。

解决办法是:

stage('Deploy') {
	steps {
		script {
			withEnv(['JENKINS_NODE_COOKIE=background_job']) {
				sh """
					nohup java -jar app.jar > app.log &
				   """
			}

		}
	}
}

注意:

  • 在Pipeline中是通过设置JENKINS_NODE_COOKIE来让Jenkins不要kill掉Pipeline后台子进程,而在Freestyle job中是通过设置BUILD_ID。
  • 如果要在一个Pipeline中后台启动多个是script,把多个nohup启动命令放到一个withEnv(['JENKINS_NODE_COOKIE=background_job']) {...}中启动

上面的nohup命令也可以替换为:

nohup java -jar app.jar > app.log 2>&1 &

或不输出日志

nohup java -jar app.jar > /dev/null 2>&1 &

Kill掉一个后台进程:

sh '''
    if [ `ps -ef | grep runserver | grep venv  | grep python3 | grep -v grep | awk '{print $2}'` ];then
        . .venv/bin/activate
		ps -ef | grep runserver | grep venv  | grep python3 | grep -v grep | awk '{print $2}' | xargs kill -9 
    fi
'''

// Stop application through kill process
PROCESS_ID = sh (script: "ps -ef | grep ${GIT_REPO_PROJECT} | grep java | grep jar | grep -v grep | grep -v pipeline | awk -F ' ' '{print \$2}'", returnStdout: true).trim()

echo "PROCESS_ID=" + PROCESS_ID

if (PROCESS_ID != "") {
    sh """
         echo "Kill process: ${PROCESS_ID}"
         sudo kill -9 ${PROCESS_ID}
        """
}

参考文档:

java not found问题

最近遇到一个古怪问题,运行 nohup java -jar app.jar > /dev/null 2>&1 & 命令后,进程没有启动。一开始怀疑是Jenkins在流水线结束后把后台进程杀掉了,搞了半天没有搞定。后面直接运行java -jar app.jar才发现是java not found

原来这台机器上的jdk不是标准安装,导致/bin/java不存在,而Jenkins运行时是到/bin目下查找命令的。

解决方法:

# 检查java安装位置
which java
# 创建/bin/java的soft link,比如:
ln -s /home/bin/jdk-13/bin/java /bin/java
# 检查/bin/java文件类型
file /bin/java
### 集成Python项目到Jenkins Pipeline的方法 为了使Python项目能够顺利集成至Jenkins流水线中,可以采用多种策略来确保构建、测试以及部署流程自动化。一种常见的方式是利用`Jenkinsfile`定义Pipeline脚本,在其中指定执行环境并调用必要的命令完成各个阶段的任务。 对于Python应用而言,通常会涉及到安装依赖项、运行单元测试以及其他质量检查工具等操作。下面是一个简单的例子展示如何编写这样的Pipeline: ```groovy pipeline { agent any environment { VENV = ".venv" } stages { stage('Prepare') { steps { sh ''' python3 -m venv ${VENV} source ${VENV}/bin/activate pip install --upgrade pip setuptools wheel pip install -r requirements.txt ''' } } stage('Test') { steps { script { try { sh "source ${VENV}/bin/activate && pytest tests/" } catch (err) { currentBuild.result = 'FAILED' throw err } } } } stage('Deploy') { // 这里可以根据实际情况调整为其他类型的发布方式 when { expression { return env.BRANCH_NAME ==~ /^(master|main)$/ } } steps { echo 'This step would deploy the application...' } } } post { always { deleteDir() /* clean up workspace */ } success { mail to: 'team@example.com', subject: "${currentBuild.fullDisplayName} Succeeded", body: "See details at ${BUILD_URL}" } failure { mail to: 'ops-team@example.com', subject: "${currentBuild.fullDisplayName} Failed", body: "Check logs at ${BUILD_URL}" } } } ``` 此配置文件首先创建了一个虚拟环境用于隔离项目的包管理;接着通过pip安装所需的库;之后运行pytest来进行测试验证代码正确性;最后有条件地触发部署逻辑[^1]。 当面对更复杂的场景时,比如异步任务处理需求,则可能需要用到像Celery这样的分布式任务队列系统。在这种情况下,可以通过消息代理(如RabbitMQ或SQS)发送任务给后台工作者节点去执行耗时较长的操作,并将结果存储于后端数据库中以便后续查询[^2]。 至于服务网格方面,虽然这不是直接关联的主题,但如果考虑微服务体系结构下的Python应用程序开发,那么引入诸如Istio之类的服务网格解决方案可以帮助更好地管理监控API通信服务间交互[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值