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

自定义Github Action取消时cancelled()不触发,如何执行cancelJob.ps1?

解决自定义GitHub Action取消时不执行清理脚本的问题

问题分析

当手动取消GitHub Actions工作流时,正在运行的步骤会被立即终止,默认情况下后续步骤不会继续执行——哪怕给清理步骤设置了if: cancelled()。这是因为工作流被取消时,GitHub会直接中断当前执行流程,不会继续处理复合Action里的后续步骤。

解决方案

方法一:在主脚本中嵌入终止处理逻辑(推荐)

利用PowerShell的信号处理机制,在main.ps1中注册终止事件,当收到取消信号时自动执行清理脚本:

修改main.ps1:

# 注册取消信号处理程序
$cancelEvent = Register-ObjectEvent -InputObject ([console]::CancelKeyPress) -EventName EventAction -Action {
    Write-Host "检测到工作流取消,执行清理..."
    & "$PSScriptRoot/cancelJob.ps1"
    exit 0
} | Out-Null

# 这里是你的主任务逻辑
Write-Host "启动长时间运行的任务..."
Start-Sleep -Seconds 300 # 模拟长任务

# 任务完成后取消事件注册
Unregister-Event -SourceIdentifier $cancelEvent.Name

或者用try/finally块兜底,确保无论任务正常结束还是被中断,都能触发清理:

try {
    Write-Host "启动长时间运行的任务..."
    Start-Sleep -Seconds 300 # 模拟长任务
}
finally {
    # 判断当前工作流是否被取消
    if ($env:GITHUB_JOB_STATUS -eq "cancelled") {
        Write-Host "执行取消清理逻辑..."
        & "$PSScriptRoot/cancelJob.ps1"
    }
}

方法二:使用复合Action的post步骤

GitHub Actions的复合Action支持post段,这部分步骤会在Action主流程结束后执行,无论主流程是成功、失败还是被取消。修改action.yml:

name: Custom Github Action
description: 'this is a custom github action'
branding:
  icon: check-circle
  color: blue
runs:
  using: "composite"
  steps:
    - name: Main Step
      run: |
        ${{ github.action_path }}/main.ps1
      shell: pwsh
  post:
    - name: Cleanup on workflow cancel
      run: |
        ${{ github.action_path }}/cancelJob.ps1
      if: ${{ cancelled() }}
      shell: pwsh

post步骤会在主步骤完成(包括被中断)后触发,确保取消时能执行清理脚本。

注意事项

  • 测试时取消工作流后,记得查看post步骤或主脚本的日志,确认清理逻辑是否执行。
  • 确保cancelJob.ps1有足够的权限执行终止远程任务的操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:35:23