如何从 gitlab-ci (+docker) 正确部署到主机?
How to properly deploy to host from gitlab-ci (+docker)?
情况
我有一台服务器:192.168.1.2
。此服务器上安装了一个 gitlab
以及一个链接到 gitlab-runner
的 docker
。请记住,我们谈论的是同一台服务器。
我在 /etc/cfupdate.py
有一个脚本,您可以看出,这是一个 Python 脚本。我想通过自动部署将此文件放在我的存储库中。
注意: 该文件的所有者是 deploymgr
,一个专门为此目的创建的用户。它具有 rw
访问权限。
尝试 #1
.gitlab-ci.yml
:
image: python:latest
before_script:
- echo "Starting script exec."
after_script:
- echo "CI Script Complete."
test-run:
stage: build
script:
- echo "Setting up..."
- pip3 install requests
- python3 "cfupdate.py"
deploy:
stage: deploy
script:
- docker cp $HOSTNAME:$PWD/cfupdate.py /etc/
only:
- master
经过快速研究,docker实际上是为进程和资源隔离而设计的。所以无法访问主机。
PS: 并且 docker
是仅主机命令。
尝试 #2
运行 构建完成时的 Webhook。这是一个可能可行的解决方案,但我想要一个更好的解决方案,可以包含在 .gitlab-ci.yml
.
中
尝试 #3
给出以下 .gitlab-ci.yml
(仅部署部分):
deploy:
stage: deploy
script:
- scp 'cfupdate.py' deploymgr@192.168.1.2:/etc/
only:
- master
我尝试通过 ssh 连接到主机,并使用 scp 复制文件,但没有成功,因为用户有密码。我真的不想使用 sshpass -p
来传递密码,尽管它可以保存在 GitLab 的 Secret Variables 部分。还尝试了 ssh-keygen
和 ssh-copy-id
,仍然需要密码,而且我们知道,docker 的 SSH 密钥(PS 确实包括所有其他文件)不会被保存,它们会在 docker 关闭时立即被销毁。
尝试 #4
deploy:
stage: deploy
script:
- curl --form "fileupload=@cfupdate.py" 192.168.1.2:[port]/upload.php
only:
- master
这种方式,(还没真正尝试过)也可以,但我还在寻找更好的方法。如您所见,这是一种真正凑合的方法,如果我们要讨论大量文件,则此方法效果不佳。
有什么想法吗?或者对 GitLab 有什么建议吗?也许它有一个我不知道的内置部署功能?
也许您可以考虑使用 shell executor 而不是 docker 执行程序来处理这个特定的回购协议,这样您就可以像这样编写普通的 sh 脚本:
deploy:
stage: deploy
script:
- cp cfupdate.py /etc/cfupdate.py
only:
- master
我已经 运行 浏览了大量涉及 docker、gitlab-ci 等的文档,但它们对我没有帮助。不过,我已经成功地设计了一个可行的解决方案:
deploy:
stage: deploy
before_script:
- apt-get update
- apt-get -y install rsync sshpass
script:
- echo "Deploying to staging server..."
- "sshpass -e rsync -vvvurz --progress -e 'ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' . deploymgr@192.168.1.2:/etc/cfupdate/"
only:
- master
情况
我有一台服务器:192.168.1.2
。此服务器上安装了一个 gitlab
以及一个链接到 gitlab-runner
的 docker
。请记住,我们谈论的是同一台服务器。
我在 /etc/cfupdate.py
有一个脚本,您可以看出,这是一个 Python 脚本。我想通过自动部署将此文件放在我的存储库中。
注意: 该文件的所有者是 deploymgr
,一个专门为此目的创建的用户。它具有 rw
访问权限。
尝试 #1
.gitlab-ci.yml
:
image: python:latest
before_script:
- echo "Starting script exec."
after_script:
- echo "CI Script Complete."
test-run:
stage: build
script:
- echo "Setting up..."
- pip3 install requests
- python3 "cfupdate.py"
deploy:
stage: deploy
script:
- docker cp $HOSTNAME:$PWD/cfupdate.py /etc/
only:
- master
经过快速研究,docker实际上是为进程和资源隔离而设计的。所以无法访问主机。
PS: 并且 docker
是仅主机命令。
尝试 #2
运行 构建完成时的 Webhook。这是一个可能可行的解决方案,但我想要一个更好的解决方案,可以包含在 .gitlab-ci.yml
.
尝试 #3
给出以下 .gitlab-ci.yml
(仅部署部分):
deploy:
stage: deploy
script:
- scp 'cfupdate.py' deploymgr@192.168.1.2:/etc/
only:
- master
我尝试通过 ssh 连接到主机,并使用 scp 复制文件,但没有成功,因为用户有密码。我真的不想使用 sshpass -p
来传递密码,尽管它可以保存在 GitLab 的 Secret Variables 部分。还尝试了 ssh-keygen
和 ssh-copy-id
,仍然需要密码,而且我们知道,docker 的 SSH 密钥(PS 确实包括所有其他文件)不会被保存,它们会在 docker 关闭时立即被销毁。
尝试 #4
deploy:
stage: deploy
script:
- curl --form "fileupload=@cfupdate.py" 192.168.1.2:[port]/upload.php
only:
- master
这种方式,(还没真正尝试过)也可以,但我还在寻找更好的方法。如您所见,这是一种真正凑合的方法,如果我们要讨论大量文件,则此方法效果不佳。
有什么想法吗?或者对 GitLab 有什么建议吗?也许它有一个我不知道的内置部署功能?
也许您可以考虑使用 shell executor 而不是 docker 执行程序来处理这个特定的回购协议,这样您就可以像这样编写普通的 sh 脚本:
deploy:
stage: deploy
script:
- cp cfupdate.py /etc/cfupdate.py
only:
- master
我已经 运行 浏览了大量涉及 docker、gitlab-ci 等的文档,但它们对我没有帮助。不过,我已经成功地设计了一个可行的解决方案:
deploy:
stage: deploy
before_script:
- apt-get update
- apt-get -y install rsync sshpass
script:
- echo "Deploying to staging server..."
- "sshpass -e rsync -vvvurz --progress -e 'ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' . deploymgr@192.168.1.2:/etc/cfupdate/"
only:
- master