给定一个
.gitlab-ci.yml
文件,需要通过 SSH
登录到远程服务器并在那里运行命令列表。我尝试使用 here-doc
但运气不佳。根据我寻找问题根源的尝试,看起来 .gitlab-ci.yml
不接受 here-doc
。它产生了一堆错误。
以下是摘录:
deploy_to_server_job:
stage: deploy_to_server
tags:
- server-runner
image: ubuntu:22.04
script:
- chmod og= $ID_RSA
- |
ssh -tt -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP bash << EOF
docker system prune --force
echo "Running container with image: $FULL_IMAGE_NAME"
docker run -p 127.0.0.1:$SERVER_PORT:$SERVER_PORT \
--env JWT_AUTH_SECRET=$JWT_AUTH_SECRET \
--env JWT_AUTH_EXPIRES=$JWT_AUTH_EXPIRES \
--env JWT_REFRESH_SECRET=$JWT_REFRESH_SECRET \
--env JWT_REFRESH_EXPIRES=$JWT_REFRESH_EXPIRES \
--env MONGODB_URI=$MONGODB_URI \
--env PORT=$PORT \
-d --name admin-server $FULL_IMAGE_NAME
exit
EOF
然后我在一行中重写了一个
ssh
命令: - ssh -tt -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "whoami; echo Running container with image $FULL_IMAGE_NAME; docker system prune --force; docker run --name admin-server -d -p 127.0.0.1:$SERVER_PORT:$SERVER_PORT --env JWT_AUTH_SECRET=$JWT_AUTH_SECRET --env JWT_AUTH_EXPIRES=$JWT_AUTH_EXPIRES --env JWT_REFRESH_SECRET=$JWT_REFRESH_SECRET --env JWT_REFRESH_EXPIRES=$JWT_REFRESH_EXPIRES --env MONGODB_URI=$MONGODB_URI --env PORT=$PORT $FULL_IMAGE_NAME; exit"
除了一个错误外,所有错误都消失了:
bash: line 2: --env: command not found
我不明白为什么
docker run
--env
标志被视为单独的命令。将所有 --env
更改为 -e
时,错误变为 bash: line 2: -e: command not found
(因此,它是来自 docker run
的标志)。
问题:在
.gitlab-ci.yml
中,如何正确放置将在远程服务器上运行的命令?
注意:我刚刚开始学习
GitLab
管道(我以为我会找到解决方案,但我已经在这个问题上挣扎了一个星期),也许不仅仅是docker run
会抛出这样的错误。
Jim 的评论给了我一个想法,我设法找到了问题的根源:
MONGODB_URI
值应该被引用: --env MONGODB_URI="$MONGODB_URI" \