Opsætning af CD via gitlab

En gang tænkte jeg på automation af udrulning af mit projekt. gitlab.com tilbyder generøst alle de værktøjer, og jeg besluttede mig selvfølgelig for at bruge dem, efter jeg havde sat mig ind i det og skrevet et lille udrulningsscript. I artiklen deler jeg min erfaring med fællesskabet.

TL;DR

  1. Konfigurer VPS: deaktiver root, login med adgangskode, installer dockerd, konfigurer ufw
  2. Generer certifikater til server og klient docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktiver dockerd-administration via tcp-socket: fjern -H fd://- indstillingen fra docker-konfigurationen.
  3. Прописать пути до сертификатов в docker.json
  4. Angiv i GitLab-miljøvariabler i CI/CD-indstillingerne indholdet af certifikaterne. Skriv et .gitlab-ci.yml script til udrulning.

Alle eksempler vil jeg vise på Debian-distributionen.

Første konfiguration af VPS

Når du har købt en instans, f.eks. på DO, er det første, du skal gøre, at beskytte din server mod den aggressive eksterne verden. Jeg vil ikke bevise eller påstå noget, jeg vil bare vise loggen /var/log/messages fra min virtuelle server:

ScreenshotOpsætning af CD via gitlab

For det første installerer vi firewall ufw:

apt-get update && apt-get install ufw

Vi aktiverer standardpolitikken: blokerer for alle indgående forbindelser, tillader alle udgående forbindelser:

ufw default deny incoming
ufw default allow outgoing

Vigtigt: Husk at tillade forbindelse via ssh:

ufw allow OpenSSH

Den generelle syntaks er: Tillad forbindelse via port: ufw allow 12345, hvor 12345 er portnummeret eller navnet på tjenesten. Forbude: ufw deny 12345

Aktiverer firewallen:

ufw enable

Log ud af sessionen og log ind igen via ssh.

Tilføj en bruger, tildel ham en adgangskode, og tilføj ham til sudo-gruppen.

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

Næste skridt er at deaktivere login med adgangskode. For at gøre dette skal du kopiere din ssh-nøgle til serveren:

ssh-copy-id root@10.101.10.28

Serverens ip skal være din. Prøv nu at logge ind med den bruger, du tidligere har oprettet; du skal ikke længere indtaste adgangskode. I konfigurationsindstillingerne ændrer vi følgende:

sudo nano /etc/ssh/sshd_config

deaktiver login med adgangskode:

skal ændres til

Genstart sshd-demontageren:

sudo systemctl reload sshd

Nu, hvis du eller nogen anden prøver at logge ind som root-bruger, vil de ikke kunne gøre det.

Næste skridt er at installere dockerd; jeg vil ikke beskrive denne proces, da alt kan være ændret. Besøg det officielle websted og følg installationsfaserne for docker på din virtuelle maskine: https://docs.docker.com/install/linux/docker-ce/debian/

Generering af certifikater

For remote management of the Docker daemon, an encrypted TLS connection is required. To achieve this, you need to generate and transfer a certificate and key to your remote machine. Follow the steps laid out in the instructions on the official Docker website: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl All generated *.pem files for the server, namely ca.pem, server.pem, key.pem, should be placed in the directory /etc/docker on the server.

Configuring dockerd

In the Docker daemon startup script, we remove the -H df:// option, which specifies which host can manage the Docker daemon.

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

Next, create a configuration file if it does not already exist and set the options:

/etc/docker/docker.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
}

Allow connections on port 2376:

sudo ufw allow 2376

Restart dockerd with the new settings:

sudo systemctl daemon-reload && sudo systemctl restart docker

Lad os tjekke:

sudo systemctl status docker

If everything is "green", then we can consider that we have successfully set up Docker on the server.

Setting up continuous delivery on GitLab

In order for the GitLab worker to execute commands on the remote Docker host, you need to decide how and where to store the certificates and key for the encrypted connection to dockerd. I solved this problem by simply defining them as variables in the GitLab settings:

SpoileroverskriftOpsætning af CD via gitlab

Just display the content of the certificates and key using cat: cat ca.pem. Copy and paste into the variable values.

Let's write a deployment script using GitLab. We will use the Docker-in-Docker (dind) image.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # rewrite entrypoint to make it work in 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 # deployment script here

Contents of the deployment script with comments:

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

The main issue was to "extract" the contents of the certificates from GitLab CI/CD variables in a proper format. I couldn't understand why the connection to the remote host wasn't working. On the host, I checked the log sudo journalctl -u docker, where there was an error during the handshake. I decided to check what was stored in the variables, and for that, I could view it like this: cat -A $DOCKER_CERT_PATH/key.pem. I resolved the error by adding the removal of the carriage return character: tr -d ‘r’.

Du kan tilføje post-release opgaver i dit eget tempo til scenariet. Du kan se den arbejdende version i mit repository. https://gitlab.com/isqad/gitlab-ci-cd

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster