使用envsubst+Bitbucket Pipelines部署Meteor应用遇JSON解析错误
解决Bitbucket Pipeline部署Meteor应用时Mup读取config.json的JSON格式错误问题
问题场景
通过Bitbucket Pipeline使用Mup部署Meteor应用,尝试将Bitbucket安全变量$STAGING_MONGO_URL注入到secure_mongo.json生成config.json,但执行mup deploy时出现JSON语法错误:
Error loading config file: SyntaxError: /opt/atlassian/pipelines/agent/build/.bot-staging-ci-cd/config.json: Unexpected token m in JSON at position 13
此前尝试直接对Mup的JS配置文件使用envsubst,变量未被替换,Mup执行时直接报错。
相关文件内容:
secure_mongo.json原内容:
{ "secret": $STAGING_MONGO_URL }
- Mup配置文件读取逻辑:
var mongo = require('./config.json'); module.exports = { MONGO_URL: mongo.secret, }
- Bitbucket Pipeline核心脚本片段:
cat secure_mongo.json | envsubst > config.json cat config.json && realpath config.json npm install -g mup mup deploy
错误原因
- JSON格式非法:
secure_mongo.json中$STAGING_MONGO_URL未被双引号包裹,envsubst替换后生成的config.json里,Mongo URL作为字符串没有引号,违反JSON语法规范,导致Node.js的require无法解析。 - 直接替换JS文件失败:默认情况下
envsubst会替换所有$VAR格式的变量,但如果JS配置文件中变量写法未被正确识别,或存在其他$开头的内容干扰,会导致替换失效。
解决方案
方案1:修复JSON模板格式
修改secure_mongo.json,给变量添加双引号,确保生成的JSON合法:
{ "secret": "$STAGING_MONGO_URL" }
Pipeline中的envsubst命令无需修改,替换后生成的config.json中Mongo URL会被双引号包裹,Node.js可正常解析。
方案2:直接生成Mup的JS配置文件
跳过JSON文件生成步骤,直接对Mup配置文件的模板进行变量替换:
- 创建Mup配置模板文件
mup.config.tpl.js:
module.exports = { MONGO_URL: "$STAGING_MONGO_URL", }
- 在Pipeline脚本中替换变量生成最终配置文件:
# 仅替换指定变量,避免误替换其他$开头的内容 cat mup.config.tpl.js | envsubst '$STAGING_MONGO_URL' > mup.config.js # 若Mup默认读取mup.js,可重命名或执行时指定配置文件 # mup deploy --config mup.config.js
这种方式无需额外JSON文件,直接生成合法的JS配置,避免JSON格式问题。
验证步骤
在Pipeline脚本中保留cat生成文件的命令,确认变量已被正确替换且文件格式合法,再执行mup deploy。
内容的提问来源于stack exchange,提问作者Anders Kitson
相关产品推荐
相关产品推荐

