停止已经在GitHub Actions中运行工作流/作业

时间:2019-11-16 21:12:57

标签: github continuous-integration github-actions

我已经使用GitHub Actions设置了CI。我的一个工作流程是由push事件触发的,但它(或该工作流程的一项工作)不应同时在多个实例上运行。

是否可以创建一个作业来停止其他工作流程(或该作业或不允许该工作流程/作业并行运行)?

我宁愿取消“旧”工作,而不需要在“旧”工作完成之前完成“新”工作。

理想情况下,我还想在完成“旧”工作的最后运行一个工作。(〜保存未完成的状态)。可以(但不必)与“新”作业并行运行。

[注意] 我想取消另一个工作流程或另一个工作流程中的一个作业,而不是同一工作流程中的另一个作业。

4 个答案:

答案 0 :(得分:4)

现在您可以对 Github Actions 使用官方并发支持(但仍处于测试阶段

https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#concurrency

支持工作流和作业!

concurrency: 
  group: ${{ github.head_ref }}
  cancel-in-progress: true

答案 1 :(得分:2)

要停止所有正在运行的工作流,只需添加此作业

jobs:
  cancel:
    name: 'Cancel Other Workflow'
    runs-on: ubuntu-latest
    steps:
      - uses: styfle/cancel-workflow-action@0.9.0
        with:
          access_token: ${{ github.token }}

您也可以通过添加取消特定的工作流程

workflow_id:<workflow id or workflow name>

与:部分。

有关此操作检查的更多信息 https://github.com/styfle/cancel-workflow-action#readme

答案 2 :(得分:1)

嗯,多个选项:

1。。您可以使用need关键字来执行作业:

    jobs:
     job1:
     job2:
      need: job1

在这种情况下,job2仅在job1完成时运行。

正如我在my article中所说的:应该注意的是,每个作业都是在虚拟环境的新实例中执行的。

因此,如果您要执行一系列操作,并且它们之间具有链接,则可能需要考虑在同一工作中执行。

2。。您可以创建一个job,它是按顺序执行的一系列步骤

steps:
   - name: Step 1
   - uses: actions/checkout@v1
   - name: Step 2
     run: node -v

此外,如果您想做一些有条件的事情,请查看:job status check functions

我已经说了所有,您可以尝试一下:

jobs:
 my_first_job:
  steps:
   - name: My new action
     uses: actions/checkout@v1 # your workflow now
   - name: new action step 2
     run: node -v
   - name: My old action
     if: success()
     uses: ./.github/actions/my-action # your other action (other workflow)

根据我的说法,您需要颠倒顺序才能“取消”正确的操作。在这种情况下,只有新动作成功后,才会执行旧动作。我希望这就是你想要的。

答案 3 :(得分:1)

自从Github打开新的工作流程API以来,我创建了small script来用一个命令手动取消所有未完成的作业:

Example:

  # Set up
  export GITHUB_TOKEN=394ba3b48494ab8f930fbc93
  export GITHUB_REPOSITORY=apache/incubator-superset

  # Cancel previous jobs for a PR
  ./cancel_github_workflows.py 1042

  # Cancel previous jobs for a branch
  ./cancel_github_workflows.py my-branch

  # Cancel all jobs including the last ones, this is useful
  # when you have closed a PR or deleted a branch and want
  # to cancel all its jobs.
  ./cancel_github_workflows.py 1024 --include-last