工作流之间对Github动作的依赖性

时间:2019-10-18 19:34:17

标签: github continuous-integration continuous-deployment github-actions

我有一个带有两个工作流程的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。我不想在工作流之间重复作业。

4 个答案:

答案 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_runif 来实现。


使用以下配置,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/') }}

...不会工作。


我会在找到解决此问题的方法后更新此答案。