如何从 gitlab-ci (+docker) 正确部署到主机?

How to properly deploy to host from gitlab-ci (+docker)?

情况

我有一台服务器:192.168.1.2。此服务器上安装了一个 gitlab 以及一个链接到 gitlab-runnerdocker。请记住,我们谈论的是同一台服务器。

我在 /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-keygenssh-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