如何通过输入变量指定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
相关产品推荐
相关产品推荐

