【问题标题】:Github Actions - trigger another action after one action is completedGithub Actions - 一个动作完成后触发另一个动作
【发布时间】:2020-10-26 06:08:03
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: github github-actions


    【解决方案1】:

    首先,您在这里混淆了术语。根据GitHub Actions documentation,单个 YAML 文件称为 工作流(不是操作),由 jobs 组成。作业包含一系列依次执行的步骤(包括操作)。特定的工作流执行称为运行。考虑到这一点,让我们开始提问。

    构建workflow完成后如何触发消息workflow

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

    是否可以得到构建workflow的结果?

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

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

    【讨论】:

      【解决方案2】:

      有两种选择:

      1. 在同一 workflow.yml 中使用 第二份工作,并与 the needs keyword 一起使用
      2. 创建使用the 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或者masteras the docs state

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

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

      【讨论】:

      • 第一种方法(具有相同的工作流程,使用需要关键字的单独作业)无法解决所描述的问题:我想接收 Slack 或电子邮件消息,通知构建结果 作为依赖 notify 作业将build 作业成功时触发,但在失败时不会触发。
      • 是的,但正如我在第一个方法屏幕截图下方所写的那样:“还有a way to always let the notify job run,即使build 作业失败。您必须使用if: always() 配置增强needs然后。”因此,在needs: build 之前使用if: always() 也可以使用第一种方法。
      • 我会使用 workflow_dispatch 而不是使用 workflow_run... 取决于您在调用 notify.yml 时需要的控制...如果我需要在下一个工作流中提供一些值,我认为这是不可能的通过 workflow_run...
      • 请注意,无论上游工作流是否失败,workflow_run: completed 都能正常工作。
      • docs.github.com/en/actions/reference/…如果您只想在第一个成功时触发工作流,则需要添加if: ${{ github.event.workflow_run.conclusion == 'success' }}
      【解决方案3】:

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

      needs: step-1-job-name 
      

      就在工作名称之后

      【讨论】:

      【解决方案4】:

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

      现在(2020 年 8 月)应该可以使用“GitHub Actions improvements for fork and pull request workflows”实现这一点

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

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

      【讨论】:

        猜你喜欢
        • 2022-01-10
        • 2023-01-11
        • 2016-10-02
        • 2019-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多