CD-installation via gitlab

Jag tänkte en gång på att automatisera implementeringen av mitt projekt. gitlab.com tillhandahåller alla verktyg för detta, och jag bestämde mig naturligtvis för att använda det genom att ta reda på det och skriva ett litet distributionsskript. I den här artikeln delar jag min erfarenhet med samhället.

TL; DR

  1. Ställ in VPS: inaktivera root, lösenordsinloggning, 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 dockerd-kontroll via tcp-socket: ta bort alternativet -H fd:// från docker-konfigurationen.
  3. Ange sökvägar till certifikat i docker.json
  4. Registrera i gitlab-variablerna i CI/CD-inställningarna med innehållet i certifikaten. Skriv ett .gitlab-ci.yml-skript för distribution.

Jag kommer att visa alla exempel på Debiandistributionen.

Initial VPS-inställning

Här köpte du en instans till exempel på DO, det första du ska göra är att skydda din server från den aggressiva omvärlden. Jag kommer inte att bevisa eller hävda någonting, jag kommer bara att visa /var/log/messages-loggen för min virtuella server:

skärmdumpCD-installation via gitlab

Installera först ufw-brandväggen:

apt-get update && apt-get install ufw

Aktivera standardpolicyn: blockera alla inkommande anslutningar, tillåt alla utgående anslutningar:

ufw default deny incoming
ufw default allow outgoing

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

ufw allow OpenSSH

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

Slå på brandväggen:

ufw enable

Vi avslutar sessionen och loggar in igen via ssh.

Lägg till en användare, tilldela honom ett lösenord och lägg till honom i sudo-gruppen.

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

Därefter, enligt planen, bör du inaktivera lösenordsinloggning. för att göra detta, kopiera din ssh-nyckel till servern:

ssh-copy-id [email protected]

Serverns ip måste vara din. Försök nu att logga in under användaren som skapats tidigare, du behöver inte ange något lösenord längre. Ändra sedan följande i konfigurationsinställningarna:

sudo nano /etc/ssh/sshd_config

inaktivera lösenordsinloggning:

PasswordAuthentication no

Starta om sshd-demonen:

sudo systemctl reload sshd

Om du eller någon annan försöker logga in som root kommer det att misslyckas.

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

Certifikatgenerering

För att fjärrstyra docker-demonen krävs en krypterad TLS-anslutning. För att göra detta behöver du ha ett certifikat och en nyckel som du behöver för att generera och överföra till din fjärrdator. Följ stegen 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, ska placeras i katalogen /etc/docker på servern.

docker-inställning

Ta bort alternativet -H df:// i startskriptet för docker-demonen, detta alternativ talar om vilken värd docker-demonen kan styras på.

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

Skapa sedan en inställningsfil om den inte redan finns och ställ in 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
}

Tillåt anslutningar på port 2376:

sudo ufw allow 2376

Starta om dockerd med nya inställningar:

sudo systemctl daemon-reload && sudo systemctl restart docker

Låt oss kolla:

sudo systemctl status docker

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

Ställer in kontinuerlig leverans på gitlab

För att gitalab-arbetaren ska kunna utföra kommandon på en fjärransluten docker-värd måste du bestämma hur och var du ska lagra certifikat och en nyckel för en krypterad anslutning till dockerd. Jag löste det här problemet genom att helt enkelt skriva till variablerna i gitlbab-inställningarna:

spoiler titelCD-installation via gitlab

Mata bara ut innehållet i certifikaten och nyckeln via cat: cat ca.pem. Kopiera och klistra in i variabelvärden.

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

.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 # скрипт деплоя тут

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

Huvudproblemet var att "dra ut" innehållet i certifikaten i normal form från gitlabs CI/CD-variabler. Jag kunde inte lista ut varför anslutningen till fjärrvärden inte fungerade. Jag tittade på sudo journalctl -u docker-loggen på värden, det är ett fel med handskakningen. Jag bestämde mig för att titta på vad som vanligtvis lagras i variabler, för detta kan du se cat -A $DOCKER_CERT_PATH/key.pem. Övervann felet genom att lägga till borttagningen av caret-tecknet tr -d 'r'.

Vidare kan du lägga till uppgifter efter release till skriptet efter eget gottfinnande. Du kan kolla in den fungerande versionen i mitt arkiv https://gitlab.com/isqad/gitlab-ci-cd

Källa: will.com

Lägg en kommentar