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

43

我正在为一个项目仓库设置Github Actions。

工作流程包括以下步骤:

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

然而,我有两个不同的Kubernetes部署:一个用于开发,另一个用于生产。因此,我也有两个Github Action工作流程。

Github Action开发工作流会在每次提交时触发:

on:
  push:
    branches:
    - master

但我不希望这样影响我的生产流程。我需要手动触发,比如一个“发送到生产”的按钮。在文档中没有看到类似的内容。


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

如何拆分开发和生产工作流程以实现我的要求,在Github Actions、Docker或Kubernetes上都可以。

7个回答

48
有没有办法在Github Actions中手动触发工作流程?你可以考虑 从2020年7月起
GitHub Actions:使用workflow_dispatch进行手动触发
(注意:或多个工作流程,通过新的Composite Run Steps,2020年8月)
您现在可以创建工作流程,并使用新的workflow_dispatch事件进行手动触发。
然后,您将在“操作”选项卡上看到一个“运行工作流程”按钮,使您能够轻松触发运行。
您可以选择在哪个分支上运行工作流程。 https://i2.wp.com/user-images.githubusercontent.com/1865328/86147571-2de93700-babf-11ea-8a08-e4beffd3abe9.png?ssl=1 您可以选择要运行工作流程的分支。 philippe评论中添加:
文档中没有提到的一件事:工作流必须存在于默认分支上,才会出现“运行工作流程”按钮。
一旦您将其添加到默认分支中,就可以继续在其自己的分支上开发该操作,并且当使用该按钮运行时,更改将生效。
此外,您可以选择指定输入,在UI中以表单元素的形式呈现。 Workflow dispatch输入与操作输入具有相同的格式。
例如:
on: 
  workflow_dispatch:
    inputs:
      logLevel:
        description: 'Log level'     
        required: true
        default: 'warning'
      tags:
        description: 'Test scenario tags'  

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

例如:

jobs:
  printInputs:
    runs-on: ubuntu-latest
    steps:
    - run: |
        echo "Log level: ${{ github.event.inputs.logLevel }}"
        echo "Tags: ${{ github.event.inputs.tags }}" 

shim添加了注释

You can add workflow_dispatch to a workflow that also has other triggers (like on push and / or schedule)

For instance:

on:
 workflow_dispatch:
 push:
   branches:
     - master
 pull_request:
   types: [opened, synchronize, reopened]

32
文档中没有提到的一件事:在“运行工作流程”按钮出现之前,工作流必须存在于默认分支上。一旦您将其添加到默认分支上,就可以在其自己的分支上继续开发操作,当使用该按钮运行时,更改将生效。 - philippe
3
谢谢你的反馈,我已将你的评论包含在答案中以增加其可见性。 - VonC
4
你能否在同时具有其他触发器(比如on push和/或schedule)的工作流程中添加workflow_dispatch触发器?我无法确定语法。 - shim
@shim 不确定。这可能是一个很好的问题。 - VonC
2
@shim 做得好。我已经将你的评论和示例包含在答案中,以增加可见性。 - VonC
显示剩余5条评论

23

已编辑:

这条推文很好地解释了如何使用工作流触发器: https://twitter.com/github/status/1321859709075394563?s=19


Github Actions 中是否有一种手动触发工作流的方法?

我有一个小技巧可以实现...

通过 watch 事件,你可以通过给仓库点赞或取消点赞来手动触发一个操作。在你的工作流程中,该事件的代码为:

on:
  watch
    types: [started]

我知道这很奇怪但它有效!但是,如果这是一个潜在有收获的公共repo,这不是最好的方法。


如何分离我的开发和生产工作流以实现我想要的结果,无论是在GitHub Actions,Docker还是Kubernetes上?

在Github Actions中,你可以创建多个工作流或任务,并按目标分支或事件进行过滤。例如,您可以组合多个事件,例如触发推送并与cron在午夜运行的工作流。


11
哈哈,这太棒了:> 除了repository_dispatch外,我们可以将watchif: github.actor == 'hackerman'结合使用,以过滤掉随机陌生人。或者更好的是 - if: github.actor == github.event.repository.owner.login,以获得额外的“安全性”:D - Samira
2
哈哈,谢谢!是的,好主意,我得在有时间的时候试一下!:D - Sarah Abderemane
2
我认为这是最好的方法,因为目前还没有官方实现。 - Antoine C.

9
更新:要使用斜杠命令风格的“ChatOps”解决方案,请参见slash-command-dispatch操作。这可以使您使用斜杠命令(例如/deploy)从问题和拉取请求注释中触发工作流程。

以下是deploy斜杠命令的基本示例。REPO_ACCESS_TOKEN是具有repo范围的Personal Access Token

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

这个命令可以在这个工作流程中被执行。

name: Deploy Command
on:
  repository_dispatch:
    types: [deploy-command]

还有许多其他选项和不同的设置。详见slash-command-dispatch获取完整的使用说明。

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

on:
  repository_dispatch:
    types: [production-deploy]
  • [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"}'

1
对于任何感兴趣的人,可以使用单个工作流程进行多个调度。作为 event_type 发送的内容在工作流程中可用作 github.event.action,因此可以根据需要启用/禁用特定的作业/步骤。 PS:PAT 真的不是必需的,使用 -u "[username]:[password]" 或者甚至 -u "[username]" 启动 curl 也可以(在第二种情况下,curl 会提示用户输入密码);在某些情况下更容易使用(例如编写以用户名为输入的脚本或供不太懂技术的用户使用的脚本)。 - Samira

6

在当前的Github Action提供的选项中,另一种解决方法是在需要部署时从主分支(master)创建一个production分支,并在production分支上触发部署操作。 production分支本质上是master的镜像。

on:
  push:
    branches:    
      - master

只要向主分支提交代码,开发构建和推送就可以随时进行。

on:
  push:
    branches:    
      - production

在发布计划的某个阶段,您可以将PR推送到production分支。这会处理生产构建/部署。

5
尽管Sarah的文章是最接近和最简单的答案,但它有些欺骗性,所以我们最终创建了一个dev分支来使用以下触发器:
  • Development workflow: triggered when a push is made on the dev branch:

    on:
      push:
        branches:    
          - dev
    
  • Production workflow: triggered when a pull request / merge is made from dev to master:

    on:
      pull_request:
        branches:    
          - master
    

5

为了更详细/解释而编辑。

您可以调用repository_dispatch来执行某些操作。您可以在此处查看GitHub使用repository_dispatch的文档here

例如,如果您有一个类似于这样的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!"

你可以按照GitHub v3 API Documentation中的步骤创建一个仓库分发事件。
首先,在GitHub上创建个人访问令牌(PAT)进行身份验证。
然后,你可以像这样运行curl:
curl \
  -H "Authorization: token $YOUR_PAT" \
  --request POST \
  --data '{"event_type": "run_tests"}' \
  https://api.github.com/repos/$USER/$REPOSITORY/dispatches

同时,我也想分享一个与朋友一起开发的小项目,可以解决这个确切的问题。

https://www.actionspanel.app/

ActionsPanel使用相同的repository_dispatch API,但是使用GitHub应用程序令牌来完成操作,因此您无需担心管理自己的PAT。这也使得在涉及多个人的团队中触发您的操作变得更加容易。
基于用户请求和反馈,我们已经内置了功能,以指定要发送repository_dispatch的分支,甚至还可以在执行操作时注入参数的方法。
您可以使用声明性yaml文件配置按钮,并将其留在存储库中,ActionsPanel将读取该文件并动态创建UI,以便为您触发操作。

3
GitHub 难以理解的文档没有明确说明,您可以在 .github/workflows 下拥有多个工作流文件,每个文件都有自己的触发器。例如,我有一个工作流会在每次 push 和 pull request 上构建和运行测试,另一个需要手动触发以发布生成物。
(ci.yml)

name: CI Pipeline
on: [push, pull_request]

---
(publish.yml)

name: Publish
on:
  workflow_dispatch:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接