如何使用输入变量来指定 GitHub 操作将在哪个自托管运行器上运行?

Posted

技术标签:

【中文标题】如何使用输入变量来指定 GitHub 操作将在哪个自托管运行器上运行?【英文标题】:How do you use an input variable to specify which self-hosted runner a GitHub action would run on? 【发布时间】:2021-10-14 09:01:41 【问题描述】:

我正在使用 GitHub Actions。

我正在尝试创建一个自托管运行器,它将在多个云服务器之一上运行,但能够控制它在哪个特定服务器上运行。这是在具有本地资源的机器上进行滚动更新。

我已经使用自托管运行器设置了标签,但到目前为止我不得不制作 1..N 个单独的 YML 脚本:

 on: 

    workflow_dispatch:

  jobs:
    post-to-server1:
      runs-on: [self-hosted, server1 ]

然后我必须重复这个脚本 n 次。

我想做的是:

name: 'Server Patching'

on:
    workflow_dispatch:
      inputs:
        server-target:
            description: 'Target Server:'
            required: true
            default: 'dev'
    
jobs:
  test-params:    
    runs-on: [ self-hosted, $ github.event.inputs.server-target ]
    steps:
      - name: Start cloning of $ github.event.inputs.server-target 
        run: |
            echo "Starting patching of: '$ github.event.inputs.server-target '"

Check failure on line 12 in .github/workflows/test_workflow.yml
GitHub Actions / .github/workflows/test_workflow.yml

Invalid workflow file

You have an error in your yaml syntax on line 12

有没有办法做到这一点?

我也标记了这个 YAML,因为变量替换似乎也是 YAML 语法的一个问题(尽管它可能特定于 GitHub Actions)

更新:是的,你可以,如果你改变这一行:

    runs-on: [ self-hosted, $ github.event.inputs.server-target ]

到:

    runs-on: $ github.event.inputs.server-target 

错误实际上发生在test-params: 而不是它下面的行。

我的理论是语法检查器在变量替换之前触发?

【问题讨论】:

你能发布完整的 YAML 文件吗?错误参考第 18 和 25 行,而您的 sn-p 没有那么多行。根据docs,在jobs.<job_id>.runs-on 中使用github 上下文应该没问题。 是的,已发布。很好,抱歉,我已经对其进行了一些消毒。 【参考方案1】:

我不确定有什么不同,但它对我有用:

runs-on: [ self-hosted, "$ github.event.inputs.server-target " ]

【讨论】:

谢谢!我会试试的。我没想到要加引号。【参考方案2】:

创建这样的列表似乎不适用于动态值。

只要您选择 not already in use by GitHub 的标签(例如 ubuntu-latest、macos-11、...),您应该不会遇到删除 self-hosted 标签的问题。所以你当前的命名模式本身应该没问题

这样你就可以使用这个了:

 runs-on: $ github.event.inputs.serverToPatch 

【讨论】:

谢谢!是的,这就成功了。我所要做的就是取下方括号,为“运行”列出一个列表。你说得很好,如果服务器标签是唯一的(我们可以控制它),那么其他标签就无关紧要了。

以上是关于如何使用输入变量来指定 GitHub 操作将在哪个自托管运行器上运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 在 GitHub 操作中设置环境变量

CUDA - 子网格将在哪个流中?

如何使用可重用的Github Actions和Heroku构建简单的部署管道

如何指定我的 .NET 互操作应该使用哪个 COM 服务器?

ThreadLocal原理

将 GitHub Actions 工作流程中的输入值绕过到 terraform 变量文件