在gitlab.com上配置连续投放

我曾经想过要自动化项目的部署。 gitlab.com会为此提供所有工具,当然我决定通过整理并编写一个小的部署脚本来使用它。 在本文中,我与社区分享了我的经验。

TL; DR


  1. 配置VPS:禁用root,密码登录,安装dockerd,配置ufw
  2. 为服务器和客户端生成证书docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl通过tcp套接字启用dockerd控制:删除-H fd选项:/ /来自docker config。
  3. 在docker.json中注册证书路径
  4. 在CI / CD设置中的gitlab变量中注册证书内容。 为部署编写一个.gitlab-ci.yml脚本。

我将在Debian发行套件中显示所有示例。

初始VPS设置


因此,例如,您在DO上购买了一个实例,首先要做的是保护您的服务器免受侵略性外界的侵害。 我不会证明和主张任何东西,只显示我的虚拟服务器的log / var / log /消息:

屏幕截图
图片

首先,安装ufw防火墙:

apt-get update && apt-get install ufw 

打开默认策略:阻止所有传入连接,允许所有传出连接:

 ufw default deny incoming ufw default allow outgoing 

重要提示:不要忘记允许ssh连接:

 ufw allow OpenSSH 

通用语法为:允许端口连接:ufw允许12345,其中12345是端口号或服务名称。 拒绝:UFW拒绝12345

打开防火墙:

 ufw enable 

我们离开会话,然后通过ssh重新登录。

添加用户,为其分配密码,然后将其添加到sudo组。

 apt-get install sudo adduser scoty usermod -aG sudo scoty 

接下来,根据计划,您必须禁用密码输入。 为此,请将您的ssh密钥复制到服务器:

 ssh-copy-id root@10.101.10.28 

必须指定您的服务器IP。 现在尝试以先前创建的用户身份登录,您不再需要输入密码。 接下来,在配置设置中,更改以下内容:

 sudo nano /etc/ssh/sshd_config 

禁用密码输入:

 PasswordAuthentication no 

重新启动sshd守护程序:

 sudo systemctl reload sshd 

现在,如果您或其他人尝试以root用户身份登录,则将无法使用。

接下来,设置dockerd,在这里我将不介绍该过程,因为一切都可以更改,请访问官方网站的链接,并按照以下步骤在您的虚拟机上安装docker: https : //docs.docker.com/install/linux/docker- ce / debian /

证书生成


要远程管理docker守护程序,需要加密的TLS连接。 为此,您必须具有一个证书和一个密钥,必须将其生成并转移到您的远程计算机上。 遵循官方Docker网站上的说明中给出的步骤: https : //docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl全部生成* .pem服务器的文件,即ca.pem,server.pem,key.pem必须放置在服务器上的/ etc / docker目录中。

Dockerd设置


在启动docker守护程序的脚本中,删除-H df://选项,此选项回答哪个主机可以控制docker守护程序。

 # At /lib/systemd/system/docker.service [Service] Type=notify ExecStart=/usr/bin/dockerd 

接下来,创建一个设置文件(如果尚未存在)并指定选项:

/etc/docker/daemon.json
 { "hosts": [ "unix:///var/run/docker.sock", "tcp://0.0.0.0:2376" ], "labels": [ "is-our-remote-engine=true" ], "tls": true, "tlscacert": "/etc/docker/ca.pem", "tlscert": "/etc/docker/server.pem", "tlskey": "/etc/docker/key.pem", "tlsverify": true } 


让我们启用端口2376上的连接:

 sudo ufw allow 2376 

使用新设置重新启动dockerd:

 sudo systemctl daemon-reload && sudo systemctl restart docker 

检查:

 sudo systemctl status docker 

如果一切都是绿色,则我们认为我们已在服务器上成功配置了docker。

在gitlab上配置持续交付


为了使gitalab worker能够在docker的远程主机上执行命令,有必要确定如何以及在何处存储证书以及与dockerd进行加密连接的密钥。 我通过简单地将其写入gitlbab设置中的变量来解决了这个问题:

扰流板方向
图片

只需通过cat: cat ca.pem显示证书和密钥的内容。 复制并粘贴到变量的值中。

让我们编写通过gitlab进行部署的脚本。 将使用docker-in-docker(dind)映像。

.gitlab-ci.yml
 image: name: docker/compose:1.23.2 #  entrypoint ,    dind entrypoint: ["/bin/sh", "-c"] variables: DOCKER_HOST: tcp://docker:2375/ DOCKER_DRIVER: overlay2 services: - docker:dind stages: - deploy deploy: stage: deploy script: - bin/deploy.sh #    


部署脚本的内容带有注释:

bin / deploy.sh
 #!/usr/bin/env sh #  ,   -  set -e # ,  ,   set -v # DOCKER_COMPOSE_FILE=docker-compose.yml #   DEPLOY_HOST=185.241.52.28 #    ,      - gitlab- DOCKER_CERT_PATH=/root/.docker # ,      docker info docker-compose version #   (    -  gitlab') mkdir $DOCKER_CERT_PATH #   ,         . echo "$CA_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/ca.pem echo "$CERT_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/cert.pem echo "$KEY_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/key.pem #       chmod 400 $DOCKER_CERT_PATH/ca.pem chmod 400 $DOCKER_CERT_PATH/cert.pem chmod 400 $DOCKER_CERT_PATH/key.pem #       docker-. ,   export DOCKER_TLS_VERIFY=1 export DOCKER_HOST=tcp://$DEPLOY_HOST:2376 # ,     docker-compose \ -f $DOCKER_COMPOSE_FILE \ ps #   docker-,     ""  docker login -u $DOCKER_USER -p $DOCKER_PASSWORD docker-compose \ -f $DOCKER_COMPOSE_FILE \ pull app #   docker-compose \ -f $DOCKER_COMPOSE_FILE \ up -d app 


主要问题是从gitlab CI / CD变量“提取”正常形式的证书内容。 我不明白为什么与远程主机的连接不起作用。 在主机上,我查看了sudo journalctl -u docker日志,出现握手错误。 我决定查看变量中通常存储的内容,为此,您可以看到cat -A $ DOCKER_CERT_PATH / key.pem。 通过添加删除回车符tr -d'\ r'克服了该错误。

在脚本的进一步内容中,您可以随意添加发布后任务。 您可以在我的存储库https://gitlab.com/isqad/gitlab-ci-cd中查看工作版本

Source: https://habr.com/ru/post/zh-CN449952/


All Articles