自定义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
相关产品推荐
相关产品推荐

