GitLab CI脚本更新.env时MONGO_DB_URI重复3次问题求助
问题根源与解决方案
你的问题出在两个关键点:sed匹配模式不匹配.env格式,以及Mongo URI中的特殊字符未转义导致sed替换逻辑出错。
核心问题分析
- 匹配模式错误:你的.env文件变量格式是
KEY: "VALUE",但脚本里的sed命令用的是^$key=.*(匹配以KEY开头加等号的行),根本找不到目标行,导致每次调用update_env时sed无法正确替换,反而因特殊字符解析错误重复写入内容。 - 特殊字符未转义:Mongo URI中的
&是sed替换字符串的特殊符号(代表匹配到的内容),=等字符也可能干扰sed的语法,直接替换会导致解析异常。
修正后的脚本
#!/bin/sh # 转义sed替换字符串中的特殊字符(&、/) escape_sed() { echo "$1" | sed -e 's/[\/&]/\\&/g' } update_env() { local key="$1" local value="$2" local env_file="$3" # 转义value中的特殊字符,避免sed解析错误 local escaped_value=$(escape_sed "$value") # 匹配.env中的KEY: "..."格式,替换为新值 sed -i "s|^$key: .*|$key: \"$escaped_value\"|g" "$env_file" } # 使用脚本传入的位置参数,避免全局变量冲突 update_env "MONGO_DB_URI" "$1" "config.env" update_env "MONGO_DB_NAME" "$2" "config.env" update_env "APP_HOST" "$3" "config.env"
关键修改说明
- 修正匹配规则:把sed的匹配模式改成
^$key: .*,精准匹配.env文件中KEY: "VALUE"格式的行。 - 特殊字符转义:新增
escape_sed函数,转义URI中的&和/,避免sed将其当作特殊语法解析。 - 参数规范:改用脚本传入的位置参数
$1/$2/$3,替代直接依赖全局环境变量,减少变量冲突风险。
验证与注意事项
- 确保Git CI中
MONGO_DB_URI等变量已正确设置,传递给脚本时必须用双引号包裹(你当前的调用方式是对的),避免特殊字符导致参数拆分。 - 测试时可以先在本地模拟CI环境,用包含特殊字符的URI验证替换效果,确保不会出现重复写入。
内容的提问来源于stack exchange,提问作者Jowz
相关产品推荐
相关产品推荐

