GitLab CI流水线单引号内嵌套双引号时变量无法解析问题
解决GitLab CI中jq无法解析变量的问题
问题核心是shell单引号会阻止变量解析:你原命令用单引号包裹jq表达式,导致${TAG}始终是字符串字面量,不会被替换为GitLab变量的实际值。以下是两种直接可行的解决方法:
方法1:用shell双引号包裹jq表达式
将整个jq表达式用双引号包裹,同时转义表达式内部的双引号,让shell优先解析${TAG}变量:
jq -r ".version |= \"${TAG}\"" temp.json > package.json
对应GitLab CI的script行修改为:
- jq -r ".version |= \"${TAG}\"" temp.json > package.json
方法2:用jq的--arg参数传递变量(推荐)
这种方式无需处理转义,还能兼容变量包含特殊字符的场景,更可靠:
jq -r --arg tag "$TAG" '.version |= $tag' temp.json > package.json
对应GitLab CI的script行修改为:
- jq -r --arg tag "$TAG" '.version |= $tag' temp.json > package.json
完整修改后的GitLab CI配置示例
build-cloudfront: stage: build image: node:18 variables: TAG: $CI_COMMIT_TAG script: - apt-get update - apt-get install jq -y - mv package.json temp.json - jq -r --arg tag "$TAG" '.version |= $tag' temp.json > package.json - npm install - npm run build - echo "FRONTEND BUILD SUCCESSFULY" artifacts: paths: - dist/ expire_in: "10 mins" only: - tags
内容的提问来源于stack exchange,提问作者Diego Araujo
相关产品推荐
相关产品推荐

