【问题标题】:Manual workflow triggers in Github ActionsGithub Actions 中的手动工作流触发器
【发布时间】:2021-08-14 03:05:19
【问题描述】:

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

工作流程由以下步骤组成:

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

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

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

on:
  push:
    branches:
    - master

但我不希望将其用于我的生产工作流程。我需要一个手动触发器,例如 Send to production 按钮。我在文档中没有看到任何与此相似的内容。


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

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

【问题讨论】:

    标签: docker kubernetes continuous-integration github-actions


    【解决方案1】:

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

    你可以考虑,from July2020:

    GitHub Actions:使用 workflow_dispatch 手动触发

    (注:或多个工作流,通过new Composite Run Steps,2020 年 8 月)

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

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

    philippe 添加in the comments:

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

    文档继续:

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

    例如:

    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 加入the comments:

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

    For instance:

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

    【讨论】:

    • 文档中没有提到的一件事:工作流必须存在于默认分支上,“运行工作流”按钮才会出现。将其添加到那里后,您可以继续在其自己的分支上开发操作,并且更改将在使用按钮运行时生效。
    • @philippe 感谢您的反馈。我已将您的评论包含在答案中以提高知名度。
    • 这只能与合作者或维护者权限一起使用吗?
    • 您能否将workflow_dispatch 添加到还有其他触发器(如推送和/或计划)的工作流中?不太清楚语法
    • @shim 干得好。我已将您的评论和示例包含在答案中以提高知名度。
    【解决方案2】:

    已编辑:

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


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

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

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

    on:
      watch
        types: [started]
    

    我知道这很奇怪,但它确实有效!然而,如果它是一个有潜在明星的公共回购,这并不是最好的方式。


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

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

    【讨论】:

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

    更新:有关斜杠命令样式的“ChatOps”解决方案,请参阅slash-command-dispatch 操作。这可以让您从问题和拉取请求 cmets 中使用斜杠命令(例如 /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 作用域 Personal Access Token
    • [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"}'
    

    【讨论】:

    • 对于任何感兴趣的人,都可以使用单个工作流进行多个调度。以event_type 发送的内容可作为github.event.action 用于工作流,因此可以在需要时启用/禁用特定的作业/步骤。 PS:PAT 并不是真正需要的,以-u "[username]:[password]" 甚至-u "[username]" 开始 curl 也可以(在第二种情况下 curl 提示用户输入密码);在某些情况下更易于使用(例如,在编写将用户名作为输入的脚本时,或者打算由不太懂技术的用户使用的脚本时)。
    【解决方案4】:

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

    on:
      push:
        branches:    
          - master
    

    只要有提交到主服务器,就可以进行开发构建/推送。

    on:
      push:
        branches:    
          - production
    

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

    【讨论】:

      【解决方案5】:

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

      • 开发工作流程:在dev 分支上进行推送时触发:

        on:
          push:
            branches:    
              - dev
        
      • 生产工作流程:当从dev 向master 发出拉取请求/合并时触发:

        on:
          pull_request:
            branches:    
              - master
        

      【讨论】:

        【解决方案6】:

        已编辑以获取更多详细信息/说明。

        您可以做的一件事是致电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 上create a personal access token (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 以触发您的操作。

        【讨论】:

          【解决方案7】:

          GitHub 神秘文档未能阐明的是,.github/workflows 下可以有多个工作流文件,每个文件都有自己的触发器。例如,我有一个工作流,它在每个推送和拉取请求上构建和运行测试,另一个是手动触发以发布工件。

          (ci.yml)
          
          name: CI Pipeline
          on: [push, pull_request]
          
          ---
          (publish.yml)
          
          name: Publish
          on:
            workflow_dispatch:
          

          【讨论】:

            猜你喜欢
            • 2022-11-02
            • 2022-01-10
            • 2023-01-11
            • 2022-12-18
            • 1970-01-01
            • 1970-01-01
            • 2021-10-05
            • 1970-01-01
            • 2020-01-10
            相关资源
            最近更新 更多