You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过输入变量指定GitHub Action运行的self-hosted runner?

问题根因

GitHub Actions对工作流文件的静态语法校验执行时机早于${{ }}表达式的变量替换阶段。你最初的runs-on: [ self-hosted, ${{ github.event.inputs.server-target }}]写法里,数组结构中混入了未求值的表达式,静态校验阶段无法识别该结构的合法性,因此抛出语法错误,且校验返回的错误行号存在定位偏差,才会提示test-params所在行有问题。

可行实现方案

方案1:直接使用表达式作为runs-on值(你找到的方案)

直接将整个runs-on的值设置为输入变量即可,要求你提前给每个self-hosted runner同时设置self-hosted和对应服务器标识的标签:

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

触发工作流时,变量替换完成后GitHub Actions会自动匹配对应标签的runner。

方案2:动态构造标签数组(无需修改runner原有标签)

如果你不想调整runner的标签配置,也可以通过fromJSON和format函数动态构造合法的标签数组,静态校验阶段会将整个表达式视为合法占位符,不会提前解析结构:

runs-on: ${{ fromJSON(format('["self-hosted", "{0}"]', github.event.inputs.server-target)) }}

完整可运行示例

name: 'Server Patching'

on:
  workflow_dispatch:
    inputs:
      server-target:
        description: 'Target Server:'
        required: true
        type: choice
        options:
          - server1
          - server2
          - dev
        default: 'dev'
    
jobs:
  test-params:    
    runs-on: ${{ fromJSON(format('["self-hosted", "{0}"]', github.event.inputs.server-target)) }}
    steps:
      - name: Start patching target server
        run: |
          echo "Starting patching of: '${{ github.event.inputs.server-target }}'"

扩展优化

如果需要批量执行多台服务器的滚动更新,可以使用矩阵(matrix)参数定义目标服务器列表,无需重复编写job逻辑,就能实现分批或并行执行多台服务器的更新任务。

内容的提问来源于stack exchange,提问作者J. Gwinner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 10:45:01