Github Actions 中的手动工作流触发器

Ant*_* C. 27 continuous-integration docker kubernetes github-actions

我正在为项目存储库设置 Github Actions。

工作流程包括以下步骤:

  • 构建 docker 镜像
  • 将镜像推送到容器注册表
  • 推出 Kubernetes 部署。

但是,我有两种不同的 Kubernetes 部署:一种用于开发,一种用于生产。因此,我还有两个 Github Action 工作流。

每次推送提交时都会触发用于开发的 Github Action 工作流:

on:
  push:
    branches:
    - master
Run Code Online (Sandbox Code Playgroud)

但我不希望在我的生产工作流程中出现这种情况。我需要一个手动触发器,比如发送到生产按钮。我在文档中没有看到任何与此接近的内容。


有没有办法在 Github Actions 中手动触发工作流?

我如何在 Github Actions、Docker 或 Kubernetes 上拆分我的开发和生产工作流以实现我想要的?

Von*_*onC 23

有没有办法在 Github Actions 中手动触发工作流?

您可能会考虑,从 2020 年 7 月开始

GitHub 操作:使用 workflow_dispatch 手动触发

(注意:或多个工作流,通过新的复合运行步骤,2020 年 8 月)

您现在可以创建由新workflow_dispatch事件手动触发的工作流。
然后,您将Run workflow在“操作”选项卡上看到一个“ ”按钮,使您可以轻松触发运行。

https://i2.wp.com/user-images.githubusercontent.com/1865328/86147571-2de93700-babf-11ea-8a08-e4beffd3abe9.png?ssl=1

您可以选择在哪个分支上运行工作流。

philippe在评论中补充道:

文档中没有提到的一件事:工作流必须存在于默认分支上Run workflow才能出现“ ”按钮。
在那里添加它后,您可以继续在其自己的分支上开发操作,并且更改将在使用按钮运行时生效

文档继续:

此外,您可以选择指定输入,GitHub 将在 UI 中将其显示为表单元素。工作流调度输入的指定格式与操作输入的格式相同。

例如:

on: 
  workflow_dispatch:
    inputs:
      logLevel:
        description: 'Log level'     
        required: true
        default: 'warning'
      tags:
        description: 'Test scenario tags'  
Run Code Online (Sandbox Code Playgroud)

触发的工作流接收github.event上下文中的输入。

例如:

jobs:
  printInputs:
    runs-on: ubuntu-latest
    steps:
    - run: |
        echo "Log level: ${{ github.event.inputs.logLevel }}"
        echo "Tags: ${{ github.event.inputs.tags }}" 
Run Code Online (Sandbox Code Playgroud)

shim评论中补充道:

您可以添加workflow_dispatch到还有其他触发器(如on push和/或schedule)的工作流

例如

on: 
  workflow_dispatch:
    inputs:
      logLevel:
        description: 'Log level'     
        required: true
        default: 'warning'
      tags:
        description: 'Test scenario tags'  
Run Code Online (Sandbox Code Playgroud)

  • 文档中未提及的一件事:工作流必须存在于默认分支上才能显示“运行工作流”按钮。将其添加到那里后,您可以继续在其自己的分支上开发操作,并且更改将在使用按钮运行时生效。 (17认同)
  • 您可以将“workflow_dispatch”添加到还有其他触发器(例如推送和/或计划)的工作流中吗?不太明白语法 (4认同)
  • @philippe 感谢您的反馈。我已将您的评论包含在答案中以获得更多可见性。 (2认同)
  • @shim 干得好。我已将您的评论和示例包含在答案中,以提高可见性。 (2认同)

Sar*_*ane 19

编辑

解释工作流调度使用的精彩推文:https : //twitter.com/github/status/1321859709075394563?s=19


有没有办法在 Github Actions 中手动触发工作流?

我有一个小技巧可以这样做......

使用 watch 事件,您可以通过为 repo 加星标或取消星标手动触发操作。工作流中事件的代码是:

on:
  watch
    types: [started]
Run Code Online (Sandbox Code Playgroud)

我知道这很奇怪,但它有效!尽管如此,如果它是具有潜在明星的公共回购,这并不是最好的方式。


我如何在 Github Actions、Docker 或 Kubernetes 上拆分我的开发和生产工作流以实现我想要的?

我的意思是,在 Github Actions 中,您可以执行多个工作流/作业并按目标分支或事件进行过滤。您可以组合多个事件,例如在午夜触发推送工作流和 cron

  • 哈哈,这太棒了 :> 除了 `repository_dispatch` 之外,我们还可以将 `watch` 与 `if: github.actor == 'hackerman'` 结合起来过滤掉随机的陌生人。或者更好 - `if: github.actor == github.event.repository.owner.login` 以获得额外的“安全性”:D (10认同)
  • 哈哈谢谢!是的,好主意,有时间我一定要尝试一下!:D (2认同)
  • 完美,我认为这是最好的方法,但还没有正式实施。 (2认同)

pet*_*ans 9

更新:有关斜杠命令样式的“ChatOps”解决方案,请参阅斜杠命令调度操作。这可以允许您使用斜杠命令(例如/deploy)从问题和拉取请求注释触发工作流。

这是deploy斜杠命令的基本示例。REPO_ACCESS_TOKENrepo范围内的个人访问令牌

name: Slash Command Dispatch
on:
  issue_comment:
    types: [created]
jobs:
  slashCommandDispatch:
    runs-on: ubuntu-latest
    steps:
      - name: Slash Command Dispatch
        uses: peter-evans/slash-command-dispatch@v1
        with:
          token: ${{ secrets.REPO_ACCESS_TOKEN }}
          commands: deploy
Run Code Online (Sandbox Code Playgroud)

可以在此工作流中处理该命令。

name: Deploy Command
on:
  repository_dispatch:
    types: [deploy-command]
Run Code Online (Sandbox Code Playgroud)

还有更多的选项和不同的设置。有关完整的使用说明,请参阅slash-command-dispatch

原始答案repository_dispatch可以通过调用 GitHub API 来手动触发工作流,如下所示。

on:
  repository_dispatch:
    types: [production-deploy]
Run Code Online (Sandbox Code Playgroud)
  • [username] 是 GitHub 用户名
  • [token]repo范围内的个人访问令牌
  • [repository] 是工作流所在的存储库的名称。
curl -XPOST -u "[username]:[token]" \
  -H "Accept: application/vnd.github.everest-preview+json" \
  -H "Content-Type: application/json" \
  https://api.github.com/repos/[username]/[repository]/dispatches \
  --data '{"event_type": "production-deploy"}'
Run Code Online (Sandbox Code Playgroud)


use*_*504 6

使用当前 Github Action 产品解决此问题的另一种方法production是在需要部署时从 master创建一个分支并在该production分支上触发部署操作。该production分支是实质上的反射镜master

on:
  push:
    branches:    
      - master
Run Code Online (Sandbox Code Playgroud)

只要有对 master 的提交,就会发生开发构建/推送。

on:
  push:
    branches:    
      - production
Run Code Online (Sandbox Code Playgroud)

在发布计划的某个时刻,您可以将 PR 提升到production分支。这将负责产品构建/部署。


Ant*_* C. 5

虽然Sarah 的帖子是对原始问题最接近和最简单的答案,但它有点 hacky,所以我们最终创建了一个dev分支来使用以下触发器:


aar*_*ilo 5

编辑以获取更多详细信息/解释。

您可以做的一件事就是致电repository_dispatchrepository_dispatch 您可以在此处查看有关使用 的 GitHub 文档。

例如,如果您的 GitHub Actions 工作流程如下所示:

on:
  repository_dispatch:
    types: [run_tests]
name: Run tests
jobs:
  test:
    name: Run your tests
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo "I just ran all your tests!"
Run Code Online (Sandbox Code Playgroud)

您可以按照GitHub v3 API 文档中说明的步骤创建存储库调度事件。

首先,在 GitHub 上创建个人访问令牌 (PAT)以进行身份​​验证。

curl然后,你可以像这样运行:

curl \
  -H "Authorization: token $YOUR_PAT" \
  --request POST \
  --data '{"event_type": "run_tests"}' \
  https://api.github.com/repos/$USER/$REPOSITORY/dispatches
Run Code Online (Sandbox Code Playgroud)

同时,我也想分享一个我和一个朋友一直在做的小项目,它解决了这个问题。

https://www.actionspanel.app/

ActionsPanel 使用相同的repository_dispatchAPI,但使用 GitHub 应用程序令牌来实现,因此您无需担心管理自己的 PAT。这也使得在多人团队之间触发您的操作变得更加容易。

根据用户请求和反馈,我们内置了指定要发送到哪个分支的功能repository_dispatch,甚至还内置了一种在您想要执行操作时注入参数的方法。

您可以使用保留在存储库中的声明性 yaml 文件来配置按钮,ActionsPanel 将读取该文件并动态创建 UI 以供您触发操作。