Bitbucket Pipelines脚本无法读取非安全变量问题排查
Bitbucket Pipelines 解码base64环境变量生成空文件问题排查
问题现象
尝试将.env文件内容做base64编码后存入Pipelines非安全变量,执行构建脚本后生成的目标.env.local文件为空。
已参考社区内公开的Bitbucket环境变量配置方案操作,均说明该配置逻辑可生效,使用的pipeline配置如下:
image: node:16 definitions: caches: yarncustom: /usr/local/share/.cache/yarn steps: - step: &Build-step name: Build caches: - node - yarncustom script: - echo $ENV_FILE | base64 -d > .env.local - cat .env.local - yarn install - yarn build artifacts: - .next/** - node_modules/** - .env.local - step: &Deploy-step name: Deploy script: - pipe: atlassian/rsync-deploy:0.4.3 variables: USER: $USER SERVER: $SERVER REMOTE_PATH: $REMOTE_PATH LOCAL_PATH: '.' EXTRA_ARGS: '--exclude-from=deployment-exclude-list.txt' pipelines: branches: development: - step: *Build-step - step: <<: *Deploy-step deployment: test
本地直接执行echo 对应base64字符串 | base64 -d > .env.local可正常生成有效文件,排除base64解码命令本身的逻辑问题,初步判断为$ENV_FILE变量未被正确读取。
已在Bitbucket Pipelines后台完成变量创建,变量为非安全类型,有对应配置截图可佐证。
故障原因&修复方案
问题出在两个容易忽略的配置细节,按优先级排查即可:
- echo命令无法正确输出带特殊字符/换行的变量内容
Pipelines默认shell环境下的echo实现会自动截断、转义变量里的换行、特殊符号,而base64编码后的内容、解码前的.env内容都可能包含这类字符,直接用echo输出会导致传给base64的内容不完整,最终解码出空文件。把echo替换为printf即可解决,printf不会自动处理特殊字符:# 替换原有的echo命令,注意变量要加双引号包裹,避免空格分割 printf '%s' "$ENV_FILE" | base64 -d > .env.local - 变量作用域不匹配,Build步骤无权限读取变量
如果你是把ENV_FILE配置在test部署环境的环境变量下,当前配置里只有Deploy步骤绑定了deployment: test,前置的Build步骤没有绑定对应部署环境,根本读不到test环境下的变量,$ENV_FILE取到的自然是空值。
两种修复方式二选一:- 把
ENV_FILE移到仓库级/工作区级变量,所有步骤都能读取 - 给Build步骤也加上
deployment: test字段,赋予步骤读取test环境变量的权限
- 把
- 额外校验项
检查你存入变量的base64字符串有没有多复制首尾的空格、换行,很多人在本地生成base64后复制时会带上终端自动加的换行符,也会导致解码失败。
修正后可以先在脚本里加一句ls -lh .env.local看文件大小是否正常,确认写入成功再走后续构建流程。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

