GitLab变量批量写入.env文件脚本问题求助
解决GitLab CI中for循环复制环境变量到远程服务器.env文件为空的问题
问题原因
你遇到的空值问题,是因为本地Shell在执行ssh命令前,会先解析双引号里的变量。原脚本中的\$$var会被本地解析成$var,远程服务器执行时,这些GitLab CI变量(如CI_REGISTRY_IMAGE)并不存在,所以输出为空。
解决方法
方法1:本地先获取变量值,再传递到远程
用Bash的间接变量引用${!var}在本地拿到GitLab变量的值,再把完整的变量名=值字符串传递给远程,避免远程解析变量:
for var in CI_REGISTRY_IMAGE CI_COMMIT_REF_SLUG; do value="${!var}" ssh server "echo $var=$value >> ./shopping-cart-nestjs/.env" done
方法2:混合单双引号,让远程解析变量
如果需要远程解析变量(比如变量在远程也存在),可以用单引号包裹远程命令主体,仅把变量名用双引号暴露给本地解析:
for var in CI_REGISTRY_IMAGE CI_COMMIT_REF_SLUG; do ssh server 'echo '"$var"'=$'"$var"' >> ./shopping-cart-nestjs/.env' done
方法3:用Here Document(适合变量较多的场景)
如果变量数量多,Here Document写法比循环更直观,效果和你最初的单个命令一致:
ssh server <<EOF echo CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE >> ./shopping-cart-nestjs/.env echo CI_COMMIT_REF_SLUG=$CI_COMMIT_REF_SLUG >> ./shopping-cart-nestjs/.env # 新增变量直接在这里添加行即可 EOF
验证
执行完脚本后,远程执行以下命令确认结果:
ssh server "cat ./shopping-cart-nestjs/.env"
此时.env文件中应该会显示完整的变量名和对应值。
内容的提问来源于stack exchange,提问作者Đoàn Đức Bảo
相关产品推荐
相关产品推荐

