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

如何为Azure DevOps中Cypress E2E任务配置条件化重试?

背景

我的Cypress E2E任务通常耗时45分钟,但偶尔会因为开发服务器启动失败(该问题已在Angular仓库上报,多年未解决),导致任务在2-3分钟后就失败。

需求

希望通过重试机制让E2E任务仅在开发服务器启动失败(发生在前5分钟)时重试,如果是测试本身失败则不重试。

可用判断条件(满足其一即可)

  1. 错误信息包含:Error: Web server failed to start in 300000ms. This can be configured in cypress.config.ts.
  2. 任务在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'

配置说明

  1. 作业重试规则:通过strategy.retry设置最多重试次数,retryWhen指定仅当shouldRetry变量为true时触发重试,避免无意义的重试。
  2. 条件判断逻辑:
    • 捕获Cypress的运行输出和退出码,同时记录任务启动时间计算运行时长。
    • 匹配服务器启动失败的特定错误信息,或判断任务是否在5分钟内失败,任一条件满足则标记为可重试。
    • 通过Azure Pipelines的变量命令##vso[task.setvariable]传递判断结果,控制后续重试逻辑。

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:02:46