【发布时间】:2020-10-26 06:08:03
【问题描述】:
我有一个操作(yaml 文件)用于将 docker 映像部署到 Google Cloud Run。
我希望收到通知构建和推送结果的 Slack 或电子邮件消息。
构建动作完成后如何触发消息动作?
是否可以获得构建操作的结果?
【问题讨论】:
标签: github github-actions
我有一个操作(yaml 文件)用于将 docker 映像部署到 Google Cloud Run。
我希望收到通知构建和推送结果的 Slack 或电子邮件消息。
构建动作完成后如何触发消息动作?
是否可以获得构建操作的结果?
【问题讨论】:
标签: github github-actions
首先,您在这里混淆了术语。根据GitHub Actions documentation,单个 YAML 文件称为 工作流(不是操作),由 jobs 组成。作业包含一系列依次执行的步骤(包括操作)。特定的工作流执行称为运行。考虑到这一点,让我们开始提问。
构建workflow完成后如何触发消息workflow?
您可以使用 GitHub API 触发名为 repository_dispatch(仅适用于基础分支)或 workflow_dispatch 的 webhook 事件。这可以在您的构建工作流程中使用专用的Repository Dispach 操作轻松完成。
是否可以得到构建workflow的结果?
是的,可以使用给定的GitHub API 获得工作流运行的结果
但是,如果您只想发送当前执行工作流的构建结果通知,则不需要创建单独的工作流并从父级触发它。您可以使用专用的Slack actions 或e-mail actions。
【讨论】:
有两种选择:
workflow.yml 中使用 第二份工作,并与 the needs keyword 一起使用
workflow_run event as a trigger 的单独notify.yml 工作流
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 工作 - 但概念保持不变):
还有a way to always let the notify job run,即使build 作业失败。然后,您必须使用if: always() 配置来增强needs。
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"] 定义完全匹配。还有一点就是这种做法需要在默认分支上进行(主要是main或者master)as the docs state:
注意:此事件只会触发工作流运行,如果工作流文件 在默认分支上。
如果您有兴趣,这里还有一个full example project,使用第一个选项。
【讨论】:
notify job run,即使build 作业失败。您必须使用if: always() 配置增强needs然后。”因此,在needs: build 之前使用if: always() 也可以使用第一种方法。
workflow_run: completed 都能正常工作。
if: ${{ github.event.workflow_run.conclusion == 'success' }}。
您可以在第 2 步中尝试以下指令:
needs: step-1-job-name
就在工作名称之后
【讨论】:
构建动作完成后如何触发消息动作?
现在(2020 年 8 月)应该可以使用“GitHub Actions improvements for fork and pull request workflows”实现这一点
Actions 的另一个经常请求的功能是一种基于另一个工作流的完成来触发一个工作流的方法。
例如,您可能想要获取 CI 工作流的结果并运行一些进一步的分析。
新的 workflow_run 事件使您能够在请求或完成一个或多个工作流时触发新的工作流。
由workflow_run事件触发的运行始终使用存储库的默认分支,并且可以访问读/写令牌以及机密。
例如,作为维护者,您可以设置一个工作流,获取拉取请求工作流生成的工件,进行一些分析,然后将 cmets 发布回拉取请求。
此事件也可用作网络挂钩。
【讨论】: