如何使用sed将yml文件中的变量替换为gitlab ci管道变量

如何使用sed将yml文件中的变量替换为gitlab ci管道变量,sed,gitlab,gitlab-ci,Sed,Gitlab,Gitlab Ci,我想用gitlab ci管道中的变量替换.yml文件中的变量 gitlab ci.yml deploy_test: stage: deploy script: - sed -i 's/$TAG/$CI_COMMIT_REF_NAME/g' deploy/test.yml - kubectl apply -f deploy/test.yml when: manual only: - master - tags image: git.<remo

我想用gitlab ci管道中的变量替换.yml文件中的变量

gitlab ci.yml

deploy_test:
  stage: deploy
  script:
    - sed -i 's/$TAG/$CI_COMMIT_REF_NAME/g' deploy/test.yml
    - kubectl apply -f deploy/test.yml
  when: manual
  only:
    - master
    - tags
image: git.<removed>.com:5005/eng/my-group/my-image:$TAG
这表示在deploy/test.yml文件中,它应该将$TAG替换为$CI\u COMMIT\u REF\u NAME

部署/测试.yml

deploy_test:
  stage: deploy
  script:
    - sed -i 's/$TAG/$CI_COMMIT_REF_NAME/g' deploy/test.yml
    - kubectl apply -f deploy/test.yml
  when: manual
  only:
    - master
    - tags
image: git.<removed>.com:5005/eng/my-group/my-image:$TAG
image:git..com:5005/eng/my-group/my-image:$TAG
在sed中使用双引号(“)而不是单引号(”),还要注意,前斜杠(/)也需要转义

因此,考虑到以下情况(假设您使用的是docker hub)

您首先需要转义“/”字符,如下所示

$CI_COMMIT_REF_NAME=docker_user\/repo:v1
最后在sed命令中使用双引号

sed -i "s/$TAG/$CI_COMMIT_REF_NAME/g" deploy/test.yml

如果字符串由/组成,作为一种解决方法,可以使用不同的定界字符,而不是/ 比如说,

sed -i -E "s%BASE_URL: '.*'%BASE_URL: '\$BACKEND_URL'%g" $FRONTEND_PATH/app/config/index.js

这里我使用%作为定界字符,因为我的任何字符串都没有该字符,根据字符串中使用的符号,您可以使用任何其他字符。

脚本命令环境中是否有这些变量:如果是,您可能需要执行
sh-c'sed-I“s/$TAG/$CI\u COMMIT\u REF\u NAME/g“deploy/test.yml”
——具体地说,调用shell可以让您知道变量替换将起作用,在正文中使用双引号将允许替换变量。@glennjackman ye$CI_uuu变量在我的管道中可用,但它不是用变量的值替换$TAG,而是用名称替换它。哦,我明白了,文本字符串
$TAG
出现在yaml文件中。试试这个:
sed-i's/$TAG/'“$CI\u COMMIT\u REF\u NAME”“/g”deploy/test.yml
——单引号和双引号的混合将保持
$TAG
文字,而$CI。。。变量被替换。@glennjackman被替换您的意思是它将使用变量$CI\u COMMIT\u REF\u NAME的值?而不是变量名?这正是我的意思。