如何将Gitlab环境变量中的特殊字符传递给bash脚本

41次阅读
没有评论

问题描述

在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_DIRSCRIPT_CMD变量,并将其添加到你的.gitlab-ci.yml文件中。

方案3

你可以尝试使用GitLab的受保护变量。在流水线设置中配置受保护变量,并在流水线中调用它们。然而,使用base64格式应该避免,因为这些值很容易被解密。
更多详细信息,请参考GitLab的文档:https://docs.gitlab.com/ee/ci/variables/
请注意,受保护的环境变量在GitLab中的作用是仅传递给受保护分支的流水线。它们在其他情况下并不受保护。此外,对于值有一些限制,因为GitLab会对其进行内部处理,这并不是你所期望的行为。

正文完