Github 操作中工作流之间的依赖关系

我有一个带有两个工作流的 monorepo:

.github/workflows/test.yml

name: test


on: [push, pull_request]


jobs:
test-packages:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: test packages
run: |
yarn install
yarn test
...

.github/workflows/deploy.yml

name: deploy


on:
push:
tags:
- "*"


jobs:
deploy-packages:
runs-on: ubuntu-latest
needs: test-packages
steps:
- uses: actions/checkout@v1
- name: deploy packages
run: |
yarn deploy
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
...

这不管用,我不能在另一个工作流中引用一个工作:

### ERRORED 19:13:07Z


- Your workflow file was invalid: The pipeline is not valid. The pipeline must contain at least one job with no dependencies.

是否有方法在工作流之间创建依赖关系?

我想要的是在标签上运行 test.yml,然后在标签上运行 deploy.yml,只在推和拉请求上运行 test.yml。我不想在工作流之间重复作业。

46998 次浏览

现在可以使用 工作流 _ 运行在 GithubActions 上的工作流之间建立依赖关系。

使用此配置,当 Run Tests工作流完成时,Release工作流将正常工作。

name: Release
on:
workflow_run:
workflows: ["Run Tests"]
branches: [main]
types:
- completed

看起来 等待检查动作 是目前这个缺失特性的最佳解决方案,正如它在其 README 中声明的:

它允许绕过 GitHub Actions 对非相互依赖工作流的限制(我们只能依赖于单个工作流中的作业)。

UPDATE : 也请参见 我的另一个答案,了解使用 workflow_run的部分解决方案。

你也可以通过结合 工作流 _ 运行如果来做到这一点。


使用下面的配置,只有当所有这些条件都成立时,deploy工作流才会启动:

  1. test工作流程完成后,
  2. 如果 test工作流程成功,
  3. 有一个标记被推送到默认分支,

假设默认分支是 main:

name: deploy


on:
# the 1st condition
workflow_run:
workflows: ["tests"]
branches: [main]
types:
- completed


jobs:
deploy-packages:
# the 2nd condition
if: $\{\{ github.event.workflow_run.conclusion == 'success' }}
(...)

... . 但是不幸的是,第三个条件不能用这种方式检查,因为 deploy工作流是在默认分支的 HEAD 上下文中触发的,而且不知道可能指向那里的标签。

比如说:

    if: $\{\{ github.event.workflow_run.conclusion == 'success' }} && startsWith(github.ref, 'refs/tags/') }}

不会有用的。


当我找到这个问题的解决办法时,我将更新这个答案。

这是可能的与 workflow_callneeds的组合。将 workflow_call添加到作业的 on值允许其他作业调用它。然后可以从其他工作流调用该作业,并使用 needs强制将来的步骤依赖于该作业的成功。您可以在这里阅读关于使工作流可调用的内容: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onworkflow_call,并且在触发未来步骤之前需要一个步骤才能成功: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idneeds

因此,对于你的情况,以下几点应该可以奏效:

# cat .github/workflows/tests.yml
name: tests
on: [workflow_call]  # allow this workflow to be called from other workflows
jobs:
...


# cat .github/workflows/deploy.yml
name: deploy
on:
push:
tags:  # trigger the deploy job on tag creation
- *
jobs:
tests:
uses: ./.github/workflows/tests.yml  # use the callable tests job to run tests
deploy:
name: deploy
needs: [tests]  # require tests to pass before deploy runs
...