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

时间:2017-04-23 15:20:58

标签: docker gitlab gitlab-ci gitlab-ci-runner

情况

我有一台服务器:192.168.1.2。此服务器上安装了gitlab,并且dockergitlab-runner相关联。请记住,我们正在谈论同一台服务器。

我在/etc/cfupdate.py有一个脚本,你可以说是一个Python脚本。我希望在我的存储库中使用自动部署来存储此文件。

注意:该文件归deploymgr所有,rw是为此目的而创建的用户。它具有.gitlab-ci.yml访问权限。

尝试#1

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

经过快速研究,docker实际上是为了进程和资源隔离。这就是为什么无法访问主机的原因。

PS:.gitlab-ci.yml是一个仅限主机的命令。

尝试#2

在构建完成时运行Webhook。这是一个可行的解决方案,但我希望有一个更好的解决方案,可以包含在.gitlab-ci.yml中。

尝试#3

给出以下deploy: stage: deploy script: - scp 'cfupdate.py' deploymgr@192.168.1.2:/etc/ only: - master (仅部署部分):

sshpass -p

我试图将自己ssh给主机,并使用scp复制文件,但没有运气,因为用户有密码。我真的不想使用ssh-keygen来传递密码,尽管它在GitLab的秘密变量部分中是可以保存的。还尝试使用ssh-copy-iddeploy: stage: deploy script: - curl --form "fileupload=@cfupdate.py" 192.168.1.2:[port]/upload.php only: - master ,仍需要密码,而且据我们所知,docker的SSH密钥( PS 确实包括所有其他文件)未保存,它们会立即销毁在码头工人关机时。

尝试#4

df_merged_1['AUM_Segment'] =  \
    np.where((df_merged_1['Revenue']>=0) & (df_merged_1['Revenue']<=2200), 'test1', 'test2')

这样,(还没有真正尝试过)它也可以工作,但我仍然在寻找更好的方法。正如你所看到的,这是一种真正的make-do方式,如果我们要谈论大量文件,这种方法就不会很好。

有什么想法吗?或者有关GitLab的任何建议?也许它有一个我不知道的内置部署功能?

2 个答案:

答案 0 :(得分:2)

我已经浏览了很多涉及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

答案 1 :(得分:0)

也许您可以考虑使用shell executor而不是docker executor来处理这个特定的repo,这样你就可以像这样编写简单的sh脚本:

deploy:
    stage: deploy
    script:
        - cp cfupdate.py /etc/cfupdate.py
    only:
        - master