如何为Azure DevOps中Cypress E2E任务配置条件化重试?
背景
我的Cypress E2E任务通常耗时45分钟,但偶尔会因为开发服务器启动失败(该问题已在Angular仓库上报,多年未解决),导致任务在2-3分钟后就失败。
需求
希望通过重试机制让E2E任务仅在开发服务器启动失败(发生在前5分钟)时重试,如果是测试本身失败则不重试。
可用判断条件(满足其一即可)
- 错误信息包含:
Error: Web server failed to start in 300000ms. This can be configured in cypress.config.ts. - 任务在5分钟内失败
问题
如何将上述任一条件添加到azure.yml配置文件中?
当前配置
- job: Cypress_Tests timeoutInMinutes: 120 pool: vmImage: ubuntu-latest steps: - task: NodeTool@0 inputs: versionSpec: '20.x' displayName: 'Install Node.js' - powershell: | corepack enable yarn install --immutable displayName: 'install dependencies' - script: | sudo apt-get update sudo apt-get install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb displayName: 'Cypress Dependencies for Linux' - powershell: | yarn cypress:ci displayName: 'Cypress Run'
解决方案
Azure Pipelines原生的任务重试不支持直接基于错误内容或运行时长的条件判断,但可以通过作业级重试策略+自定义变量判断实现需求,以下是整合两种条件的最终配置:
- job: Cypress_Tests timeoutInMinutes: 120 pool: vmImage: ubuntu-latest variables: shouldRetry: false # 配置作业重试规则:最多重试2次,仅当shouldRetry为true时触发 strategy: retry: 2 retryWhen: eq(variables['shouldRetry'], 'true') steps: - task: NodeTool@0 inputs: versionSpec: '20.x' displayName: 'Install Node.js' - powershell: | corepack enable yarn install --immutable displayName: 'install dependencies' - script: | sudo apt-get update sudo apt-get install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb displayName: 'Cypress Dependencies for Linux' - powershell: | # 记录任务启动时间 $startTime = Get-Date # 执行Cypress并捕获输出和退出码 $output = yarn cypress:ci 2>&1 $exitCode = $LASTEXITCODE # 打印输出便于排查问题 Write-Host "Cypress运行输出:`n$output" # 计算任务运行时长(分钟) $runDuration = (Get-Date) - $startTime $minutesElapsed = [math]::Round($runDuration.TotalMinutes, 2) # 定义服务器启动失败的目标错误信息 $serverErrorMsg = "Error: Web server failed to start in 300000ms. This can be configured in cypress.config.ts." # 判断是否满足重试条件 $meetsRetry = $false if ($output -match $serverErrorMsg) { $meetsRetry = $true Write-Host "检测到开发服务器启动失败,标记为可重试" } elseif ($minutesElapsed -le 5 -and $exitCode -ne 0) { $meetsRetry = $true Write-Host "任务在5分钟内失败,标记为可重试" } else { Write-Host "不满足重试条件,直接终止" } # 设置全局变量控制重试逻辑 Write-Host "##vso[task.setvariable variable=shouldRetry;isOutput=true]$meetsRetry" # 返回Cypress原始退出码,保证任务状态准确性 exit $exitCode name: cypressRun displayName: 'Cypress Run'
配置说明
- 作业重试规则:通过
strategy.retry设置最多重试次数,retryWhen指定仅当shouldRetry变量为true时触发重试,避免无意义的重试。 - 条件判断逻辑:
- 捕获Cypress的运行输出和退出码,同时记录任务启动时间计算运行时长。
- 匹配服务器启动失败的特定错误信息,或判断任务是否在5分钟内失败,任一条件满足则标记为可重试。
- 通过Azure Pipelines的变量命令
##vso[task.setvariable]传递判断结果,控制后续重试逻辑。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

