Github Actions - 在一个动作完成后触发另一个动作

Jun*_*ang 21 github github-actions

我有一个操作(一个yaml文件)用于将 docker 映像部署到 Google Cloud Run。

我想接收通知构建和推送结果的 Slack 或电子邮件消息。

构建操作完成后如何触发消息操作?

是否有可能获得构建操作的结果?

jon*_*ckt 56

有 2 个选项可以执行此操作:

  1. 使用第二份工作同内workflow.yml连同needs关键字
  2. 创建一个独立的notify.yml工作流程,使用workflow_run事件作为触发

1. 相同的工作流程,不同的工作与needs关键字

在您的workflow.yml文件中,您只需定义两个这样的作业(利用needs: build第二个作业中的配置):

name: CI build and notify

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    
    - name: Deploy Docker image to Google Cloud Run
      run: ...

  notify:
    needs: build
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Notify Slack and send eMail
        run: ...
Run Code Online (Sandbox Code Playgroud)

正如文档所述notify只有在第一个build工作成功时才会开始第二个工作:

标识在此作业运行之前必须成功完成的任何作业。

这是我自己的项目中这种方法实际上看起来如何的屏幕截图(我有第二publish-snapshot份工作而不是你的notify工作 - 但概念保持不变):

构建作业触发器发布作业

还有一种方法可以始终让notify作业运行,即使build作业失败。然后您必须needs使用if: always()配置来增强它。


2.独立的工作流程中,使用workflow_run事件作为触发

使用该workflow_run事件作为触发器,我们最终拥有 2 个单独的 GitHub Actions 工作流 yaml 文件:

build.yml

name: CI build

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Deploy Docker image to Google Cloud Run
      run: ...
Run Code Online (Sandbox Code Playgroud)

notify.yml

name: CI notify

# Only trigger, when the build workflow succeeded
on:
  workflow_run:
    workflows: ["CI build"]
    types:
      - completed

jobs:
  notify:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Notify Slack and send eMail
        run: ...
Run Code Online (Sandbox Code Playgroud)

这里的一个关键点是name: CI build第一个 yaml 文件的workflow_run: workflows: ["CI build"]定义必须与第二个 yaml 文件中的定义完全匹配。另一点是,这种方法需要在默认分支(主要是mainor master)上完成,如文档所述

注意:如果工作流文件位于默认分支上,此事件只会触发工作流运行。

如果您有兴趣,这里还有一个使用第一个选项的完整示例项目

  • 根据 https://docs.github.com/en/actions/reference/events-that-trigger-workflows,您需要添加 `if: ${{ github.event.workflow_run.conclusion == 'success' }}` if您只想在第一个“成功”时触发工作流程。 (21认同)
  • 是的,但正如我在第一个方法屏幕截图下所写的那样:“还有[一种始终让‘notify’作业运行的方法](https://docs.github.com/en/free-pro-team@latest/actions /reference/workflow-syntax-for-github-actions#example-not-requiring-dependent-jobs-to-be-successful),即使“构建”作业失败。您必须使用“增强”需求“ if:always()`配置然后。” 因此,在“needs: build”之前使用“if:always()”也可以用第一种方法来解决问题。 (3认同)
  • 请注意,无论上游工作流程是否失败,“workflow_run:completed”都会起作用。 (3认同)
  • 第一种方法(_具有相同的工作流程,具有需求关键字的单独作业_)无法解决所描述的问题:**我希望接收通知构建结果的 Slack 或电子邮件消息**,因为依赖的 _notify_ 作业将**仅**当 _build_ 作业成功时触发,但失败时不会触发。 (2认同)

Sgt*_*oki 23

我在同一存储库中找到的可重用工作流程的最佳方法是https://docs.github.com/en/actions/using-workflows/reusing-workflows

在您想要重用的工作流程中(我们称之为wf1):

# wf1.yml
on:
  workflow_call:
Run Code Online (Sandbox Code Playgroud)

在您想要调用的工作流程中wf1(我们称之为wf2

# wf2.yml
jobs:
  call-wf1:
    uses: ./.github/workflows/wf1.yml
    secrets: inherit
Run Code Online (Sandbox Code Playgroud)

为了将数据从一个工作流程获取到另一个工作流程,请查看https://docs.github.com/en/actions/using-workflows/reusing-workflows#using-outputs-from-a-reusable-workflow

首先,设置可重用的工作流程来输出数据:

name: Reusable workflow

on:
  workflow_call:
    # Map the workflow outputs to job outputs
    outputs:
      firstword:
        description: "The first output string"
        value: ${{ jobs.example_job.outputs.output1 }}
      secondword:
        description: "The second output string"
        value: ${{ jobs.example_job.outputs.output2 }}

jobs:
  example_job:
    name: Generate output
    runs-on: ubuntu-latest
    # Map the job outputs to step outputs
    outputs:
      output1: ${{ steps.step1.outputs.firstword }}
      output2: ${{ steps.step2.outputs.secondword }}
    steps:
      - id: step1
        run: echo "::set-output name=firstword::hello"
      - id: step2
        run: echo "::set-output name=secondword::world"
Run Code Online (Sandbox Code Playgroud)

现在在调用工作流程中使用它:

name: Call a reusable workflow and use its outputs

on:
  workflow_dispatch:

jobs:
  job1:
    # local repo
    # uses: ./.github/workflows/called-workflow.yml@v1
    # other repo
    uses: octo-org/example-repo/.github/workflows/called-workflow.yml@v1

  job2:
    runs-on: ubuntu-latest
    needs: job1
    steps:
      - run: echo ${{ needs.job1.outputs.firstword }} ${{ needs.job1.outputs.secondword }}
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,不要在使用“uses”调用工作流程的同一作业上使用“runs-on” (2认同)
  • 本地存储库路径必须以 ./ 开头,并且不能引用版本 (2认同)

小智 10

您可以在步骤 2 中尝试以下指令:

needs: step-1-job-name 
Run Code Online (Sandbox Code Playgroud)

就在工作名称之后

  • 是的,Vaulstein:“需要:[job1,job2]”请参阅https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#jobsjob_idneeds (3认同)

Mar*_*tek 7

首先,您在这里混合了术语。根据GitHub Actions 文档,单个 YAML 文件称为工作流(不是操作)并且由jobs组成。作业包含一系列依次执行的步骤(包括操作)。特定的工作流执行称为run。考虑到这一点,让我们来回答问题。

构建工作流完成后如何触发消息工作

您可以使用 GitHub API 触发名为repository_dispatch(仅适用于基础分支)或workflow_dispatch. 这可以通过在构建工作流程中使用专用的Repository Dispach操作轻松完成。

是否有可能获得构建工作流程的结果?

是的,可以使用给定的GitHub API获得工作流运行的结果

但是如果您只想发送当前执行的工作流的构建结果通知,则不需要创建单独的工作流并从父级触发它。您可以使用专用的Slack 操作电子邮件操作

  • yml 的外观示例会很棒:) (3认同)