GitHub Actions条件表达式写法及多场景逻辑解析
GitHub Actions
runs-on 条件逻辑解析 一、原代码逻辑拆解
1. fromJSON函数的作用
GitHub Actions表达式中,直接写带方括号的字符串(比如["ubuntu-latest", "self-hosted"])只会被识别为普通文本,无法当作数组使用。fromJSON的核心作用就是将这个JSON格式的字符串解析成GitHub能识别的数组对象,这样才能通过下标获取对应元素。
2. 下标取值的逻辑原因
在GitHub Actions表达式里,布尔值会被自动转换为数字:true对应1,false对应0。
- 当
github.repository == 'github/docs-internal'判断为真时,对应下标1,取数组的第二个元素self-hosted - 当判断为假时,对应下标
0,取数组的第一个元素ubuntu-latest
这段代码的逻辑完全等价于更直观的三元表达式写法:
runs-on: ${{ github.repository == 'github/docs-internal' ? 'self-hosted' : 'ubuntu-latest' }}
用数组下标是一种更简洁的语法技巧,但本质依赖布尔值转数字的特性。
二、新增条件的代码修正
你给出的新代码逻辑错误,连续使用两个下标[条件1][条件2]会导致异常:第一个下标取值后得到的是字符串,再用下标访问字符串只会取单个字符,完全达不到多条件分支的效果。
推荐两种正确的写法:
写法1:嵌套三元表达式(直观易懂)
runs-on: ${{ github.repository == 'github/docs-internal' ? 'self-hosted' : github.repository == 'github/docs-external' ? 'windows-latest' : 'ubuntu-latest' }}
写法2:对象映射(多条件时更清晰)
runs-on: ${{ fromJSON('{ "github/docs-internal": "self-hosted", "github/docs-external": "windows-latest" }')[github.repository] || 'ubuntu-latest' }}
这种写法将仓库名与对应的runner配置成键值对的JSON对象,通过仓库名直接匹配取值;如果没有匹配到对应的仓库名,就使用默认值ubuntu-latest。
内容的提问来源于stack exchange,提问作者user531300
相关产品推荐
相关产品推荐

