diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index af85b8a..d22e787 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -961,15 +961,26 @@ jobs: upsert_env_key() { _K="$1"; _V="$2" if [ -z "${_V}" ]; then return 0; fi + # 值的引号要自适应:JSON(含双引号)必须用**单引号**包, + # 否则 .env 会变成 KEY="{"a":"b"}" 这种坏行,docker compose 解析直接崩。 + # 值里不可能同时出现两种引号(JSON 不含单引号),所以这样是安全的。 + _Q='"' + case "${_V}" in + *'"'*) _Q="'" ;; + esac + _LINE="${_K}=${_Q}${_V}${_Q}" if grep -q "^${_K}=" "${ENV_FILE}" 2>/dev/null; then - if command -v awk >/dev/null 2>&1; then - awk -v K="${_K}" -v V="${_V}" 'BEGIN{FS=OFS="="} $1==K{$2="\"" V "\""} 1' "${ENV_FILE}" > "${ENV_FILE}.tmp.$$" \ - && mv "${ENV_FILE}.tmp.$$" "${ENV_FILE}" || MERGE_OK=0 + # 用 grep -v 重写而不是 awk 改字段:awk 的 FS="=" 会把值里 "=" 之后的内容丢掉 + # (base64 密钥常带 "=" 填充,正好踩这个坑) + if grep -v "^${_K}=" "${ENV_FILE}" > "${ENV_FILE}.tmp.$$" 2>/dev/null; then + printf '%s\n' "${_LINE}" >> "${ENV_FILE}.tmp.$$" + mv "${ENV_FILE}.tmp.$$" "${ENV_FILE}" || { rm -f "${ENV_FILE}.tmp.$$"; MERGE_OK=0; } else + rm -f "${ENV_FILE}.tmp.$$" MERGE_OK=0 fi else - printf '%s="%s"\n' "${_K}" "${_V}" >> "${ENV_FILE}" + printf '%s\n' "${_LINE}" >> "${ENV_FILE}" fi } upsert_env_key OAUTH_REDIRECT_URI "${OAUTH_REDIRECT_URI}" || MERGE_OK=0