我有一个带有两个工作流程的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
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
。我不想在工作流之间重复作业。
答案 0 :(得分:9)
现在可以使用workflow_run在Github Actions上的工作流之间具有依赖关系。
使用此配置,Release
工作流程完成后,Run Tests
工作流程将开始工作。
name: Release
on:
workflow_run:
workflows: ["Run Tests"]
branches: [main]
types:
- completed
答案 1 :(得分:2)
是否可以在工作流之间创建依赖关系?
我认为目前尚不可能。也许这是他们将来会添加的功能。就个人而言,我认为很可能会添加CircleCI之类的功能来共享工作流的常见部分。
对于替代解决方案,是否将所有内容都像下面的工作一样放在同一工作流程中?仅当推送以deploy-packages
开头的标签时,v
作业才会执行。
name: my workflow
on: [push, pull_request]
jobs:
test-packages:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: test packages
run: echo "Running tests"
deploy-packages:
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
needs: test-packages
steps:
- uses: actions/checkout@v1
- name: deploy packages
run: echo "Deploying packages"
答案 2 :(得分:2)
似乎 Wait n Check action 目前是此缺失功能的最佳解决方法,正如它在自述文件中声明的那样:
<块引用>? 它允许解决非相互依赖的工作流的 GitHub Actions 限制(我们只能依赖单个工作流中的作业)。
UPDATE:另请参阅 my other answer 以获取使用 workflow_run
的部分解决方案。
答案 3 :(得分:0)
您(也)可以通过组合 workflow_run 和 if 来实现。
使用以下配置,deploy
工作流将仅在所有这些条件都为真时启动:
test
工作流完成后,test
工作流成功,假设默认分支是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/') }}
...不会工作。
我会在找到解决此问题的方法后更新此答案。