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

Azure DevOps取消作业时如何终止所有未启动/进行中任务

问题根因

Azure DevOps 代理默认的作业取消逻辑,仅会向当前作业根进程及其直接挂载的直系子进程发送终止信号。npm run 执行时派生的 webdriver(如 ChromeDriver、geckodriver 及对应的浏览器实例)属于脱离默认进程树的独立派生进程,无法被默认取消逻辑捕获;同时默认配置下部分排队未启动的并行/后续任务不会被同步标记取消,就会出现作业显示已取消但进程残留、运行计数器持续跳动的情况。

可落地解决方法

1. 优先开启作业级全进程终止配置(覆盖绝大多数场景)

这个配置生效后,代理收到取消信号时,会扫描该作业启动的所有关联进程(无论进程层级、是否脱离父进程)强制终止,同时直接标记所有未启动的关联任务为已取消:

  • YAML流水线直接在对应job块添加以下配置:
jobs:
- job: UI_TEST_JOB
  displayName: 'UI自动化测试作业'
  cancelTimeoutInMinutes: 1
  target:
    commands:
      cleanupAllProcessesOnCancel: true
  steps:
  # 原有NPM依赖安装、脚本运行步骤保持不变
  - task: Npm@1
    inputs:
      command: 'install'
  - script: npm run <your_script_name>
    displayName: '运行测试脚本'
  • 经典可视化流水线,进入作业的「控制选项」配置页,勾选「取消时清理所有派生进程」,将「取消超时时间」设为1分钟即可。

2. 脚本层加退出信号兜底

根据脚本维护情况选一种方式即可:

  • 自维护测试脚本(基于Selenium、Playwright、Cypress等框架):直接在脚本入口最顶部加系统信号监听,收到终止信号时主动调用webdriver的退出方法,从根源避免进程残留:
// 放在测试脚本入口文件顶部
const cleanUp = async () => {
  if (global.webdriverInstance) { // 替换为你项目中实际的webdriver实例变量名
    await global.webdriverInstance.quit();
  }
  process.exit(0);
};
// 监听代理发送的终止信号
process.on('SIGINT', cleanUp);
process.on('SIGTERM', cleanUp);
  • 第三方封装的测试命令不方便改源码的场景:直接把原来的npm run <script_name>命令替换为npx concurrently --kill-others --success first "npm run <script_name>",通过concurrently托管进程,主进程被终止时会自动杀掉所有派生的子进程。

3. 配置取消时专用的清理步骤

如果前两个配置后仍有残留进程,在作业最前面加一个内联脚本步骤,配置为「作业取消时也运行」,专门清理残留的webdriver进程,根据代理操作系统选对应的脚本即可:

  • Windows代理使用PowerShell脚本:
$targetProcesses = @('chromedriver','msedgedriver','geckodriver','chrome','msedge','firefox')
foreach ($p in $targetProcesses) {
  Get-Process -Name $p -ErrorAction SilentlyContinue | Where-Object {
    # 仅清理10分钟内启动的进程,避免误伤代理本身的常驻进程
    $_.StartTime -gt (Get-Date).AddMinutes(-10)
  } | Stop-Process -Force -ErrorAction SilentlyContinue
}
  • Linux/macOS代理使用Bash脚本:
pkill -f "chromedriver|msedgedriver|geckodriver|chrome|msedge|firefox" -u $(whoami) || true

配置时记得在步骤的控制选项里勾选「即使上一步失败也运行」「作业取消时运行」,保证无论作业成功、失败、被取消,清理逻辑都会执行。

4. 未启动任务的同步取消配置

如果并行作业、跨阶段依赖场景下存在notStarted状态任务未被同步取消,直接在流水线根配置中添加全局取消规则:

cancelTimeoutInMinutes: 1

经典流水线在「选项」-「取消策略」页,勾选「取消当前运行时同步终止所有关联的未启动作业和阶段」即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:40:37