You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:15:54