Jenkins中Playwright测试阶段无限停滞,如何触发后续步骤?
问题
我创建了一条Jenkins流水线,用于将前端应用容器化、构建并运行Playwright测试用例。但问题是,测试阶段在执行完所有测试后无法进入下一步。相关配置如下:
Jenkinsfile
#!groovy pipeline { agent any stages { stage('Checkout') { steps { echo 'Clean workspace' cleanWs() echo 'Checking out the PR' checkout scm } } stage('Build') { steps { echo 'Destroy Old Build' echo 'Building' sh 'make upbuild_d' } } stage('Lint') { steps { echo 'Checking Lint' sh 'make lint' } } stage('Test') { steps { echo 'Running Tests ...' sh 'make test-e2e' } } } // [StagePost] Clean after finishing post { always { echo '## BEGIN ALWAYS BLOCK ##' echo 'Destroy Build' sh 'make destroy' cleanWs() echo '## END ALWAYS BLOCK ##' } } }
Makefile 中的 test-e2e 命令
test-e2e: docker exec my-container bash -c 'npm run test:e2e'
test:e2e 脚本
npx playwright test --project=chromium
请问如何让Jenkins检测到所有测试已完成,从而执行post步骤?
解决方案
测试阶段卡住的核心原因是docker exec命令未正确退出,或Playwright测试进程残留阻塞。可以从以下几个方向修复:
1. 确保Playwright测试进程正常终止
Playwright默认跑完用例会自动退出,但如果存在浏览器进程残留、测试用例挂起等情况,会导致进程阻塞。可以修改测试脚本,添加强制清理逻辑:
npx playwright test --project=chromium --workers=1 && pkill -f chromium || true
--workers=1:避免多进程残留问题pkill -f chromium:强制清理容器内残留的浏览器进程,确保测试命令能正常退出
2. 优化docker exec的执行参数
docker exec如果没有正确配置终端参数,可能会附着在容器会话上无法返回。修改Makefile命令,添加非交互式、脱离终端的参数:
test-e2e: docker exec -i -t my-container bash -c 'npm run test:e2e'
-i:保持标准输入打开,避免部分命令因输入需求阻塞-t:分配伪终端,确保命令在容器内正常执行并返回退出码
3. 让Jenkins捕获命令退出状态
在Jenkins的sh步骤中添加returnStatus参数,确保无论测试成功或失败,流水线都能推进到post阶段:
stage('Test') { steps { echo 'Running Tests ...' sh script: 'make test-e2e', returnStatus: true } }
returnStatus: true:会捕获命令的退出码,而非直接终止流水线,保证后续post步骤能执行
4. 检查容器启动模式
如果make upbuild_d启动的容器是前台运行状态,会直接卡住Build阶段。需确保容器以后台模式启动(比如添加docker run -d参数),让Build阶段能正常结束,进入后续步骤。
内容的提问来源于stack exchange,提问作者Mona101ma
相关产品推荐
相关产品推荐

