如何在.gitlab-ci.yml的variables配置中定义和使用数组变量?
GitLab CI/CD 使用数组变量的可行方案
GitLab CI/CD 的 variables 字段原生仅支持字符串类型值,不支持直接定义 YAML 数组,也不支持带方括号的数组风格变量名,这是你之前两种写法报错的根本原因。可通过以下两种变通方案实现数组能力:
方案1:分隔符拼接字符串(简单场景首选)
将数组元素用统一的分隔符拼接为单个字符串存入变量,执行脚本时再转换为 bash 数组。
基础用法(元素无空格)
variables: # 用空格拼接所有数组元素 MY_ARRAY: "abc dcef" test_job: script: - arr=($MY_ARRAY) - echo ${arr[0]} # 输出 abc - echo ${arr[1]} # 输出 dcef
兼容带空格的元素
如果数组元素包含空格,可换用其他不会出现在元素中的分隔符(如 |)配合 IFS 转换:
variables: # 用|作为分隔符 MY_ARRAY: "abc|dcef|hello world" test_job: script: - IFS="|" read -ra arr <<< "$MY_ARRAY" - echo ${arr[2]} # 输出 hello world
方案2:JSON字符串存储(复杂场景适用)
如果元素包含大量特殊字符,可存储为标准 JSON 数组字符串,配合 jq 工具解析转换为 bash 数组,兼容性更强:
variables: # 存储标准JSON数组字符串 MY_ARRAY_JSON: '["abc", "dcef", "hello world", "test@#$%"]' test_job: script: - mapfile -t arr < <(echo "$MY_ARRAY_JSON" | jq -r '.[]') - echo ${arr[3]} # 输出 test@#$%
注意:使用该方案需要确保 GitLab Runner 执行环境已安装
jq工具。
之前写法报错原因
- 直接写 YAML 数组作为变量值:GitLab CI 要求
variables是键值对结构,值只能是字符串或嵌套哈希,不支持数组类型,因此触发 Lint 校验报错。 - 用
arr[0]作为变量名:GitLab 会将完整的arr[0]作为环境变量名导出,而 bash 不允许环境变量名包含方括号,因此触发导出阶段报错。
内容的提问来源于stack exchange,提问作者Tadeusz
相关产品推荐
相关产品推荐

