CD opsætning via gitlab

Jeg tænkte engang på at automatisere implementeringen af ​​mit projekt. gitlab.com giver venligst alle værktøjerne til dette, og jeg besluttede selvfølgelig at bruge det ved at finde ud af det og skrive et lille implementeringsscript. I denne artikel deler jeg mine erfaringer med samfundet.

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-kontrol via tcp-socket: fjern indstillingen -H fd:// fra docker-konfigurationen.
  3. Indstil stier til certifikater i docker.json
  4. Registrer i gitlab-variablerne i CI / CD-indstillingerne med indholdet af certifikaterne. Skriv et .gitlab-ci.yml-script til implementering.

Jeg vil vise alle eksempler på Debian-distributionen.

Indledende VPS-opsætning

Her har du købt et eksempel på f.eks DO, den første ting at gøre er at beskytte din server mod den aggressive omverden. Jeg vil ikke bevise eller hævde noget, jeg vil bare vise /var/log/messages-loggen på min virtuelle server:

skærmbilledeCD opsætning via gitlab

Først skal du installere ufw firewallen:

apt-get update && apt-get install ufw

Aktiver standardpolitikken: bloker alle indgående forbindelser, tillad alle udgående forbindelser:

ufw default deny incoming
ufw default allow outgoing

Vigtigt: glem ikke at tillade forbindelse via ssh:

ufw allow OpenSSH

Den generelle syntaks er: Tillad forbindelse på port: ufw tillade 12345, hvor 12345 er portnummeret eller tjenestenavnet. Afvis: ufw afvis 12345

Slå firewall til:

ufw enable

Vi afslutter sessionen og logger på igen via ssh.

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

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

Dernæst skal du ifølge planen deaktivere adgangskodelogin. for at gøre dette skal du kopiere din ssh-nøgle til serveren:

ssh-copy-id [email protected]

Serverens ip skal være din. Prøv nu at logge ind under den tidligere oprettede bruger, du behøver ikke at indtaste en adgangskode længere. Dernæst skal du ændre følgende i konfigurationsindstillingerne:

sudo nano /etc/ssh/sshd_config

deaktiver adgangskode login:

PasswordAuthentication no

Genstart sshd-dæmonen:

sudo systemctl reload sshd

Nu, hvis du eller en anden forsøger at logge ind som root, vil det mislykkes.

Dernæst installerer vi dockerd, jeg vil ikke beskrive processen her, da alt allerede kan ændres, følg linket til det officielle websted og gå gennem trinene for at installere docker på din virtuelle maskine: https://docs.docker.com/install/linux/docker-ce/debian/

Certifikatgenerering

For at fjernstyre docker-dæmonen kræves en krypteret TLS-forbindelse. For at gøre dette skal du have et certifikat og en nøgle, som du skal generere og overføre til din fjernmaskine. Følg trinene i instruktionerne på det officielle docker-websted: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Alle genererede *.pem-filer til serveren, nemlig ca.pem, server.pem, key.pem, skal placeres i mappen /etc/docker på serveren.

docker opsætning

Fjern indstillingen -H df:// i opstartsscriptet for docker-dæmonen, denne mulighed fortæller, hvilken vært docker-dæmonen kan styres på.

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

Opret derefter en indstillingsfil, hvis den ikke allerede eksisterer, og indstil indstillingerne:

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

Tillad forbindelser på port 2376:

sudo ufw allow 2376

Genstart dockerd med nye indstillinger:

sudo systemctl daemon-reload && sudo systemctl restart docker

Lad os tjekke:

sudo systemctl status docker

Hvis alt er grønt, mener vi, at vi med succes har konfigureret docker på serveren.

Opsætning af kontinuerlig levering på gitlab

For at gitalab-arbejderen skal være i stand til at udføre kommandoer på en ekstern docker-vært, skal du bestemme, hvordan og hvor du vil gemme certifikater og en nøgle til en krypteret forbindelse til dockerd. Jeg løste dette problem ved blot at skrive til variablerne i gitlbab-indstillingerne:

spoiler titelCD opsætning via gitlab

Bare output indholdet af certifikaterne og nøglen via kat: cat ca.pem. Kopiér og indsæt i variable værdier.

Lad os skrive et script til implementering via gitlab. Docker-in-docker (dind) billedet vil blive brugt.

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

Indholdet af implementeringsscriptet 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

Hovedproblemet var at "trække" indholdet af certifikaterne ud i normal form fra gitlab CI / CD variablerne. Jeg kunne ikke finde ud af, hvorfor forbindelsen til fjernværten ikke virkede. Jeg kiggede på sudo journalctl -u docker-loggen på værten, der er en fejl med håndtrykket. Jeg besluttede at se på, hvad der generelt er gemt i variabler, for dette kan du se cat -A $DOCKER_CERT_PATH/key.pem. Overvandt fejlen ved at tilføje fjernelse af indtegningstegn tr -d 'r'.

Yderligere kan du tilføje opgaver efter udgivelsen til scriptet efter eget skøn. Du kan tjekke den fungerende version i mit lager https://gitlab.com/isqad/gitlab-ci-cd

Kilde: www.habr.com

Tilføj en kommentar