我已经使用GitHub Actions设置了CI。我的一个工作流程是由push
事件触发的,但它(或该工作流程的一项工作)不应同时在多个实例上运行。
是否可以创建一个作业来停止其他工作流程(或该作业或不允许该工作流程/作业并行运行)?
我宁愿取消“旧”工作,而不需要在“旧”工作完成之前完成“新”工作。
理想情况下,我还想在完成“旧”工作的最后运行一个工作。(〜保存未完成的状态)。可以(但不必)与“新”作业并行运行。
[注意] 我想取消另一个工作流程或另一个工作流程中的一个作业,而不是同一工作流程中的另一个作业。
答案 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