问题描述
在Gitlab的环境变量中存储了一些敏感数据,并希望将这些变量传递给一个bash脚本进行部署。然而,在脚本中解析这些参数时,变量的值会被展开,导致结果不符合预期。用户已经尝试了一些解决方案,但都没有解决问题。用户想知道为什么会出现这种情况,以及如何解决。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据GitLab的工作方式,它在处理环境变量时会进行内部评估,这可能导致一些奇怪的行为。以下是一些解决方案:
1. 可以尝试在变量值中重复使用美元符号($),例如:aaa$$bbb*%
。这个方法在GitLab的问题跟踪中有提到。
2. 可以使用base64对值进行编码和解码。首先,使用以下命令对值进行编码:
$ echo 'aaa$bbb*%' | base64
YWFhJGJiYiolCg==
然后将编码后的值存储在项目的环境变量中。在脚本中解码变量:
PASS=$(echo ${sensitive_var} | base64 -D)
方案2
如果你的脚本运行在一个Docker镜像中,可能无法直接访问GitLab的环境变量。在这种情况下,你可以尝试使用SSH会话来执行脚本。以下是一个示例配置:
deploy job:
variables:
SSH_DIR: '/srv/app/'
SCRIPT_CMD: |
echo "Double quotes are safe"
echo 'Single quotes are safe'
echo "Code executions are safe -" `whoami`@`hostname` $$(date)
# the '$$' is needed as otherwise GitLab itself tries variable substitution
script:
- CMD=$SCRIPT_CMD
- echo -e "Executing:\n$CMD"
- CMD="set -e; cd $SSH_DIR; $CMD" # 'set -e' = stop on error
- ssh -p $SSH_PORT $USERNAME@$SSH_HOST "bash -x" <<< "$CMD"
你可以根据自己的需求修改SSH_DIR
和SCRIPT_CMD
变量,并将其添加到你的.gitlab-ci.yml
文件中。
方案3
你可以尝试使用GitLab的受保护变量。在流水线设置中配置受保护变量,并在流水线中调用它们。然而,使用base64格式应该避免,因为这些值很容易被解密。
更多详细信息,请参考GitLab的文档:https://docs.gitlab.com/ee/ci/variables/
请注意,受保护的环境变量在GitLab中的作用是仅传递给受保护分支的流水线。它们在其他情况下并不受保护。此外,对于值有一些限制,因为GitLab会对其进行内部处理,这并不是你所期望的行为。