如果另一个作业失败,则停止正在进行的GitHub作业(失败时停止)



TL;DR:并行运行作业a、b。如果a失败,请在b仍在运行时停止执行。

我的公司使用GitHub Actions来部署我们的代码。

我们部署的第一步是构建Docker并将其推送到DockerHub。

我们为代码编写了一个测试,希望与构建Docker并行运行。

这两项工作都是单独的,根据前两项工作的成功与否,我们还有一些工作要做。

现在,如果测试作业失败,另一个作业将继续运行,但很明显,下一个作业不会运行,因为测试作业失败了。

如果测试失败,我想做的是在docker构建作业运行时取消它。

这可能吗?在搜索了网页、StackOverflow和GitHub Actions页面后,我还没有找到这样做的方法。

谢谢!

您可以指定needs选项并引用作业名称。请参阅:https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idneeds

例如:

jobs:
build:
...
deploy:
needs: build
...

由于您正在处理一个企业项目,无论公共存储库有多少星,我都希望避免使用未经验证的操作。我认为您可以在每个作业a、b的末尾添加一个步骤。只有在前面的步骤失败时,才会运行此步骤。如果失败,它将发送一个取消工作流api调用。

- if: failure()
name: Check Job Status
uses: actions/github-script@v6
env: 
RUN_ID: ${{ github.run_id }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
script: |
const runId = process.env.RUN_ID
const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/");
const resp = await github.rest.actions.cancelWorkflowRun({
owner,
repo,
runId
}) 

注意:您可能需要添加另一个自定义github_pat,因为此api调用可能需要比默认操作更高的权限。我还建议你看看这个帖子,我发现它很有用。

您可以使用Cancel this build操作。

基本的想法是在你的每一项工作中添加它作为最后一步,你想在失败的情况下引起短路:

jobs
job_a:
steps:
- run: |
echo 'I am failing'
exit 1
- name: Cancelling parallel jobs
if: failure()
uses: andymckay/cancel-action@0.2
job_b:
steps:
- run: echo 'long task'

每当job_a失败时,这将基本上取消job_b或同一工作流中的任何其他。

最新更新