我在 gitlab ci 管道中使用 shell 脚本来根据分支的上下文更新 .env 变量。总体而言,它按预期工作,只是 3 个变量中的 1 个重复了 3 次。
这是来自管道的调用:
- chmod +x manage_back_env.sh
- source manage_back_env.sh "$MONGO_DB_URI" "$MONGO_DB_NAME" "$APP_HOST"
这是脚本:
#!/bin/sh
update_env() {
local key="$1"
local value="$2"
local env_file="$3"
sed -i "s|^$key=.*|$key=$value|g" "$env_file"
}
update_env "MONGO_DB_URI" "$MONGO_DB_URI" "config.env"
update_env "MONGO_DB_NAME" "$MONGO_DB_NAME" "config.env"
update_env "APP_HOST" "$APP_HOST" "config.env"
(我在没有该函数的情况下尝试过此操作,使其非常基本,并一次更新文件 1 变量,但这会产生相同的结果)。
.env 文件具有用于本地开发的值 -
MONGO_DB_URI: "value for the URI"
MONGO_DB_NAME: "nameOfTheSpecificDB"
APP_HOST: "[email protected]"
当以下脚本在 gitlab ci 管道中运行时,我最终得到:
MONGO_DB_URI: "new value for the URI"MONGO_DB_URI: "new value for the URI"MONGO_DB_URI: "new value for the URI"
MONGO_DB_NAME: "newNameOfTheDB"
APP_HOST: "[email protected]"
我对使用此类脚本只有最基本的了解,但在网上找不到任何明确的方向,也无法弄清楚为什么只有 1 值重复 3 次,而其他值却按预期完成。我在作业阶段开始时定义变量,并已验证(多次)存储库上的 config.env 文件仅写入一次 MONGO_DB_URI 变量。
任何指导表示赞赏。谢谢
更新 我添加了一些日志记录,我认为问题源于 mongo uri 字符串中的“=”。当记录键的当前值时,我得到:
Current value of MONGO_DB_URI in config.env: "mongodb+srv://user:[email protected]/?retryWrites
在其切断位置和初始字符串中有一个“=”(MONGO_DB_URI="mongodb+srv://user:[email protected]/?retryWrites=true&w=majority")。但是,我还注意到 URI 值重复发生在同一位置,但每次重复都会有更长的 uri 字符串部分。
所以我没有得到关于问题发生原因的明确答案。我调整了代码几次,删除了 g 命令以防影响它,但无论如何我仍然继续得到 MONGO_DB_URI 变量的重复。为了继续前进,我切换到使用 awk 的 bash 脚本,而不是使用 sed 的 shell 脚本,这已按预期工作:
#!/bin/bash
update_env() {
local key="$1"
local value="$2"
local env_file="$3"
#set logging of values I'm passing and what is already in file
echo "Updating $key=\"$value\" in $env_file"
current_value=$(grep "^$key=" "$env_file" | cut -d '=' -f 2)
echo "Current value of $key in $env_file: \"$current_value\""
awk -v key="$key" -v value="$value" -F '=' '
BEGIN { OFS=FS }
$1 == key { $2 = "\"" value "\"" }
{ print }
' "$env_file" > "$env_file.tmp" && mv "$env_file.tmp" "$env_file"
}
update_env "MONGO_DB_URI" "$MONGO_DB_URI" "config.env"
update_env "MONGO_DB_NAME" "$MONGO_DB_NAME" "config.env"
update_env "APP_HOST" "$APP_HOST" "config.env"