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

Gui*_*ent 59 continuous-integration github 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
...
Run Code Online (Sandbox Code Playgroud)

.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 }}
...
Run Code Online (Sandbox Code Playgroud)

这不起作用,我无法在另一个工作流程中引用作业:

### 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.
Run Code Online (Sandbox Code Playgroud)

有没有办法在工作流之间创建依赖关系?

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

lha*_*son 111

workflow_call这可以通过和的组合来实现needs。添加workflow_callon作业的值允许其他作业调用它。然后,您可以从其他工作流程调用该作业,并用于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
    ...
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案。非常干净,在我看来,这是*解决方案。特别是因为这会阻止其他步骤运行 (4认同)
  • 请注意,秘密和参数不会自动转发。您可以在与“uses:”相同的级别使用神奇的“secrets:inherit”语法。请参阅 https://docs.github.com/en/actions/using-workflows/reusing-workflows#using-inputs-and-secrets-in-a-reusable-workflow (3认同)

Ahm*_*aid 65

现在可以使用workflow_run在 Github Actions 上的工作流之间建立依赖关系。

使用此配置,Release工作流将在Run Tests工作流完成后工作。

name: Release
on:
  workflow_run:
    workflows: ["Run Tests"]
    branches: [main]
    types: 
      - completed
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要知道,只要“运行测试”工作流程完成,示例中的“发布”工作流程就会运行,无论它成功还是失败。如果工作流程结果很重要(通常很重要),您需要检查“github.event.workflow_run.conclusion”。更多详细信息请参见:https://github.community/t/workflow-run-completed-event-triggered-by-failed-workflow/128001 (44认同)
  • 对于任何想要使用它的人来说,它仅在默认分支上运行,而不是在实际触发该分支所依赖的工作流的分支上运行(请参阅[此处](https://docs.github.com/en/actions)有关此的注释/using-workflows/events-that-trigger-workflows#workflow_run) ) (6认同)
  • 我们可以在工作流程中给出两个工作流程名称吗?我必须在完成其他两个工作流程后触发此操作。 (4认同)

Gre*_*cki 47

您也可以通过组合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' }}
    (...)
Run Code Online (Sandbox Code Playgroud)

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

所以做类似的事情:

    if: ${{ github.event.workflow_run.conclusion == 'success' }} && startsWith(github.ref, 'refs/tags/') }}
Run Code Online (Sandbox Code Playgroud)

...不管用。


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


pet*_*ans 25

更新:现在可以使用workflow_run. 看到这个答案

有没有办法在工作流之间创建依赖关系?

我认为目前这是不可能的。也许这是他们将来会添加的功能。就个人而言,我认为更有可能添加像 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"
Run Code Online (Sandbox Code Playgroud)


Gre*_*cki 8

正如其自述文件中所声明的那样,“Wait n Check”操作目前似乎是此缺失功能的最佳解决方法:

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

更新:另请参阅我的其他答案,了解使用的部分解决方案workflow_run