GitLab CI/CD如何将变量通过SSH传递至远程服务器并用于curl命令?
问题原因
你在CI环境中定义的start_build_message是本地变量,当通过SSH连接到远程服务器后,远程环境并不存在这个变量,因此执行curl时${start_build_message}会被解析为空值。
解决方法
提供三种可行的修复方式,按需选择:
方法1:直接在本地替换变量后传递完整命令
修改SSH执行的curl命令,让CI环境先把start_build_message的实际值替换进去,再将完整命令发送到远程执行:
script: - start_build_message="The project build has started! I will notify you when it's completed. Author $GITLAB_USER_NAME." - echo "$start_build_message" - ssh -o "StrictHostKeyChecking=no" "$SSH_USERNAME"@"$SSH_HOST" "curl -s -X POST 'https://api.telegram.org/$TELEGRAM_BOT_TOKEN/sendMessage' \ -d chat_id=$TELEGRAM_CHAT_ID \ --data-urlencode text=\"$start_build_message\""
核心改动:把\${start_build_message}改为"$start_build_message",取消转义后本地CI会优先替换变量值。
方法2:在远程环境临时导出变量
先在远程会话中导出变量,再执行curl命令,注意对远程变量名的转义:
script: - start_build_message="The project build has started! I will notify you when it's completed. Author $GITLAB_USER_NAME." - echo "$start_build_message" - ssh -o "StrictHostKeyChecking=no" "$SSH_USERNAME"@"$SSH_HOST" "export START_MSG=\"$start_build_message\"; \ curl -s -X POST 'https://api.telegram.org/$TELEGRAM_BOT_TOKEN/sendMessage' \ -d chat_id=$TELEGRAM_CHAT_ID \ --data-urlencode text=\"\$START_MSG\""
这里\$START_MSG的转义是为了避免本地CI提前解析这个变量名。
方法3:使用Here Document简化复杂命令
如果命令较长或包含特殊字符,用Here Doc可以避免转义混乱,让代码更易读:
script: - start_build_message="The project build has started! I will notify you when it's completed. Author $GITLAB_USER_NAME." - echo "$start_build_message" - ssh -o "StrictHostKeyChecking=no" "$SSH_USERNAME"@"$SSH_HOST" << EOF curl -s -X POST 'https://api.telegram.org/$TELEGRAM_BOT_TOKEN/sendMessage' \ -d chat_id=$TELEGRAM_CHAT_ID \ --data-urlencode text="$start_build_message" EOF
Here Doc中的本地变量会被CI环境提前替换,再将完整脚本发送到远程执行。
注意事项
- 确保
TELEGRAM_BOT_TOKEN、TELEGRAM_CHAT_ID等变量已在CI环境中正确配置。 - 若消息包含引号、空格等特殊字符,用双引号包裹变量可保证内容完整传递。
内容的提问来源于stack exchange,提问作者SwAsKk
相关产品推荐
相关产品推荐

