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

时间:2020-07-06 06:43:51

标签: github github-actions

我有一个动作(一个<?php $arrayWithPrettyLongName = [ 'level_1' => [ 'key_1' => 10, 'key_2' => 20, 'key_3' => 30, ] ]; // Test-1 // Works fine! $result_1 = $arrayWithPrettyLongName['level_1']['key_1'] + $arrayWithPrettyLongName['level_1']['key_2'] + $arrayWithPrettyLongName['level_1']['key_3'] ; echo $result_1; echo "\n"; //Just create an array reference here, by preceding the name with an `&` $path = &$arrayWithPrettyLongName['level_1']; //Also remove the `.` symbol here. That's not the correct syntax $result_2 = $path['key_1'] + $path['key_2'] + $path['key_3'] ; echo $result_2; 文件)用于将docker映像部署到Google Cloud Run。

我希望收到Slack或Email消息,通知构建并推送结果。

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

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

4 个答案:

答案 0 :(得分:33)

有两种选择:

  1. 在同一个 workflow.yml 中使用第二个作业和 the needs keyword
  2. 创建单独的 notify.yml 工作流,使用 the workflow_run event as a trigger

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: ...

As the docs state,第二个 notify 作业只有在第一个 build 作业成功时才会开始:

<块引用>

标识在此作业之前必须成功完成的所有作业 将运行。

以下屏幕截图显示了这种方法实际上看起来像 from my own project(我有第二份 publish-snapshot 工作而不是您的 notify 工作 - 但概念保持不变):

build-job-triggers-publish-job

还有 a way to always let the notify job run,即使 build 作业失败。然后,您必须使用 needs 配置增强 if: always()


2.单独的工作流程,使用 the workflow_run event as a trigger

使用 workflow_run event as a trigger,我们最终拥有 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: ...

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: ...

这里的一个关键点是第一个 yaml 文件的 name: CI build 定义必须与第二个 yaml 文件中的 workflow_run: workflows: ["CI build"] 定义完全匹配。还有一点是这种方法需要在默认分支上完成(主要是mainmasteras the docs state

<块引用>

注意:此事件仅在工作流文件 位于默认分支上。

如果您有兴趣,这里还有一个使用第一个选项的 full example project

答案 1 :(得分:2)

首先,您在此处混用术语。根据{{​​3}},单个YAML文件称为工作流程(不是动作),由 jobs 组成。作业包含一个接一个执行的一系列步骤(包括动作)。特定的工作流程执行称为运行。牢记这一点就可以解决问题。

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

您可以使用GitHub API触发名为GitHub Actions documentation(仅针对基本分支)或repository_dispatch的webhook事件。使用构建工作流程中的专用workflow_dispatch操作可以轻松完成此操作。

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

是的,可以使用Repository Dispach

获得工作流程运行的结果

但是,如果您只想发送当前执行的工作流的构建结果通知,则无需创建单独的工作流并从父级触发它。您可以使用专用的GitHub APISlack actions

答案 2 :(得分:2)

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

needs: step-1-job-name 

就在职位名称之后

答案 3 :(得分:1)

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

现在(2020年8月)可以通过“ GitHub Actions improvements for fork and pull request workflows”来实现

Actions的另一个经常要求的功能是一种基于另一个工作流的完成来触发一个工作流的方法。
例如,您可能想要获取CI工作流程的结果并进行一些进一步的分析。

新的工作流程运行事件使您能够在请求或完成一个或多个工作流程时触发新的工作流程。
workflow_run 事件触发的运行始终使用存储库的默认分支,并且有权访问读/写令牌以及机密。
例如,作为维护人员,您可以设置一个工作流,该工作流将接收拉取请求工作流生成的工件,进行一些分析,然后将评论发布回拉取请求。
此事件也可以作为网络挂钩使用。