Inställning av CD via gitlab

Jag funderade en gång på automatiseringen av distributionen av mitt projekt. gitlab.com tillhandahåller alla verktyg för detta, så jag beslutade mig för att utnyttja dem, efter att ha tagit reda på hur man skriver ett litet distributionsscript. I artikeln delar jag med mig av min erfarenhet till gemenskapen.

TL;DR

  1. Konfigurera VPS: stänga av root, inloggning med lösenord, installera dockerd, konfigurera ufw
  2. Generera certifikat för server och klient docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktivera hantering av dockerd via tcp-socket: ta bort alternativet -H fd:// från docker-konfigurationen.
  3. Прописать пути до сертификатов в docker.json
  4. Mata in certifikatens innehåll i GitLab CI/CD-variabler. Skriv ett .gitlab-ci.yml-script för distribution.

Jag kommer att visa alla exempel på Debian-distributionen.

Initial konfiguration av VPS

Så du har köpt en instans, till exempel på DO, det första du måste göra är att skydda din server från en aggressiv extern värld. Jag kommer inte att bevisa eller påstå något, jag visar bara loggen /var/log/messages från min virtuella server:

SkärmdumpInställning av CD via gitlab

Först installerar vi brandväggen ufw:

apt-get update && apt-get install ufw

Vi aktiverar standardpolicy: blockera alla inkommande anslutningar, tillåta alla utgående anslutningar:

ufw default deny incoming
ufw default allow outgoing

Viktigt: glöm inte att tillåta ssh-anslutning:

ufw allow OpenSSH

Den allmänna syntaxen är: Tillåt anslutning via port: ufw allow 12345, där 12345 är portnumret eller tjänstens namn. Förbjud: ufw deny 12345

Aktivera brandväggen:

ufw enable

Logga ut från sessionen och logga in igen via ssh.

Lägg till en användare, ställ in ett lösenord och lägg till den i sudo-gruppen.

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

Därefter ska vi stänga av inloggning med lösenord. För detta, kopiera din ssh-nyckel till servern:

ssh-copy-id root@10.101.10.28

serverns ip-adress ska vara din. Försök nu att logga in med den tidigare skapade användaren, du behöver inte ange lösenord längre. Gå sedan till konfigurationsinställningarna och ändra följande:

sudo nano /etc/ssh/sshd_config

stäng av inloggning med lösenord:

PasswordAuthentication no

Starta om sshd-demonen:

sudo systemctl reload sshd

Om du eller någon annan försöker logga in som root-användare, kommer det inte att gå.

Därefter installerar vi dockerd, jag kommer inte att beskriva processen här, eftersom allt kan ha ändrats, gå till den officiella webbplatsen och följ installationsstegen för docker på din virtuella maskin: https://docs.docker.com/install/linux/docker-ce/debian/

Generering av certifikat

För att hantera Docker-demonen på distans krävs en krypterad TLS-anslutning. För detta behövs ett certifikat och en nyckel som måste genereras och överföras till din fjärrmaskin. Följ stegen angivna i instruktionerna på den officiella Docker-webbplatsen: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Alla genererade *.pem-filer för servern, nämligen ca.pem, server.pem, key.pem måste placeras i katalogen /etc/docker på servern.

Inställning av dockerd

I skriptet för att starta Docker-demonen tar vi bort alternativet -H df://, detta alternativ anger vilken värd som kan hantera Docker-demonen.

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

Därefter ska vi skapa en inställningsfil om den inte redan finns och ange alternativen:

/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
}

Vi tillåter anslutningar via port 2376:

sudo ufw allow 2376

Vi startar om dockerd med de nya inställningarna:

sudo systemctl daemon-reload && sudo systemctl restart docker

Låt oss kontrollera:

sudo systemctl status docker

Om allt är "grönt" anser vi att vi framgångsrikt har konfigurerat Docker på servern.

Inställning av continuous delivery på GitLab

För att GitLab-arbetaren ska kunna köra kommandon på den fjärranslutna Docker-värden behöver vi bestämma hur och var vi ska lagra certifikat och nycklar för den krypterade anslutningen till dockerd. Jag löste det här problemet genom att helt enkelt skriva in det som variabler i inställningarna för GitLab:

Spoiler RubrikInställning av CD via gitlab

Skriv bara ut innehållet i certifikaten och nyckeln med cat: cat ca.pem. Kopiera och klistra in i värdesträngarna.

Låt oss skriva ett skript för distribution via GitLab. Det kommer att använda Docker-in-Docker (dind) bilden.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # Vi skriver om entrypoint så att det fungerar i 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 # distributionsskript här

Innehållet i distributionsskriptet med kommentarer:

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

Det största problemet var att "extrahera" certifikatens innehåll från GitLab CI/CD variabler i ett korrekt format. Jag kunde inte förstå varför anslutningen till den fjärranslutna värden inte fungerade. På värden tittade jag i loggen sudo journalctl -u docker, där fanns ett fel vid handskakningen. Jag beslöt att kontrollera vad som faktiskt lagras i variablerna, för att göra det kan du se så här cat -A $DOCKER_CERT_PATH/key.pem. Jag övervann felet genom att lägga till borttagning av tecknet för vagnslutning tr -d 'r'.

I scenariet kan du lägga till post-release-uppgifter efter eget val. Du kan bekanta dig med arbetsversionen i mitt repository. https://gitlab.com/isqad/gitlab-ci-cd

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster