Jenkins Pipeline并行构建:测试完成后终止日志收集任务求助
Jenkins Pipeline 并行任务中终止日志收集的解决方案
问题场景
在Jenkins Pipeline中配置了测试任务与日志收集任务并行执行,但adb logcat会持续运行无法自动终止,导致整个阶段卡壳。需要实现测试任务完成后自动终止日志收集的逻辑。
原Pipeline代码:
stage('Smoke Run') { steps { parallel( first: { catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { sh '$PYTHON -m pytest --testit android_tv/tests/smoke_run/ --clean-alluredir --alluredir=/Users/jenkins/allure-report/android-tv' } }, second: { sh "$ADB logcat -c" sh "$ADB logcat -> ~/jenkins/workspace/Android_TV_Smoke_Run/android_tv/tests/smoke_run/logs_tv/log.log" } ) } }
解决方法
核心思路是让日志收集进程后台运行并记录PID,测试任务结束后通过PID杀掉该进程。修改后的代码如下:
stage('Smoke Run') { steps { script { def logFilePath = "~/jenkins/workspace/Android_TV_Smoke_Run/android_tv/tests/smoke_run/logs_tv/log.log" def pidFile = "/tmp/logcat.pid" parallel( testTask: { catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { sh '$PYTHON -m pytest --testit android_tv/tests/smoke_run/ --clean-alluredir --alluredir=/Users/jenkins/allure-report/android-tv' } }, logcatTask: { // 清空旧日志 sh "$ADB logcat -c" // 后台启动logcat并记录进程ID sh "$ADB logcat > $logFilePath & echo \$! > $pidFile" // 保持任务存活,直到被外部终止 sh 'while true; do sleep 1; done' } ) } } // 无论测试成功/失败,都终止日志收集进程 post { always { sh 'if [ -f /tmp/logcat.pid ]; then kill $(cat /tmp/logcat.pid) || true; rm -f /tmp/logcat.pid; fi' } } }
关键说明
- 用
&将adb logcat放到后台运行,echo $!把当前后台进程的PID写入临时文件 - 日志收集任务通过无限循环sleep维持运行状态,避免提前退出
post阶段的always块确保不管测试结果如何,都会执行杀进程和清理临时文件的操作,防止资源残留
内容的提问来源于stack exchange,提问作者Антон Горский
相关产品推荐
相关产品推荐

