【问题标题】:How to replace a variable in yml file with a gitlab ci pipeline variable using sed如何使用 sed 将 yml 文件中的变量替换为 gitlab ci 管道变量
【发布时间】:2019-02-19 15:02:20
【问题描述】:

我想用 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

这在 deploy/test.yml 文件中说它应该将 $TAG 替换为 $CI_COMMIT_REF_NAME 的值?

部署/test.yml

image: git.<removed>.com:5005/eng/my-group/my-image:$TAG

【问题讨论】:

  • 这些变量在脚本命令的环境中是否可用:如果是,您可能想要执行sh -c 'sed -i "s/$TAG/$CI_COMMIT_REF_NAME/g" deploy/test.yml' -- 专门调用 shell 可以让您知道变量替换将起作用,并且在正文中使用双引号将允许替换变量。
  • @glennjackman ye $CI_ 变量在我的管道中可用,但不是用变量的值替换 $TAG,而是用名称替换它
  • 哦,我明白了,字符串$TAG 出现在yaml 文件中。试试这个:sed -i 's/$TAG/'"$CI_COMMIT_REF_NAME"'/g' deploy/test.yml——单引号和双引号的组合将保留 $TAG 文字,并且 $CI... 变量被替换。
  • @glennjackman 被替换是指它将使用变量 $CI_COMMIT_REF_NAME 的值?而不是变量名?
  • 这正是我的意思。

标签: sed gitlab gitlab-ci


【解决方案1】:

在 sed 中使用双引号 (") 而不是单引号 ('),还要注意正斜杠 (/) 也需要转义。

所以给出以下内容(假设您使用的是 docker hub)

$CI_COMMIT_REF_NAME=docker_user/repo:v1

您首先需要先转义“/”字符,像这样

$CI_COMMIT_REF_NAME=docker_user\/repo:v1

最后在sed命令中使用双引号

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

【讨论】:

    【解决方案2】:

    如果您的字符串由 / 组成,作为一种解决方法,您可以使用不同的分隔符代替 / 例如,

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 1970-01-01
      • 2022-01-19
      • 2021-07-04
      • 2020-11-04
      • 2022-10-11
      • 2021-04-17
      • 2022-08-11
      • 2021-12-24
      相关资源
      最近更新 更多