Sette opp CD via gitlab

Jeg tenkte en gang på å automatisere distribusjonen av prosjektet mitt. gitlab.com gir oss alle verktøyene for dette, og jeg bestemte meg selvfølgelig for å dra nytte av det, finne ut av det og skrive et lite distribusjonsskript. I denne artikkelen deler jeg min erfaring med samfunnet.

TL; DR

  1. Sett opp VPS: deaktiver root, logg på med passord, installer dockerd, konfigurer ufw
  2. Generer sertifikater for server og klient docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktiver dockerd-kontroll via tcp-socket: fjern alternativet -H fd:// fra docker-konfigurasjonen.
  3. Registrer stier til sertifikater i docker.json
  4. Registrer deg i gitlab-variabler i CI/CD-innstillingene med innholdet i sertifikatene. Skriv et skript .gitlab-ci.yml for distribusjon.

Jeg vil vise alle eksempler på Debian-distribusjonen.

Innledende VPS-oppsett

Så du kjøpte en forekomst for eksempel på DO, det første du må gjøre er å beskytte serveren din mot den aggressive omverdenen. Jeg vil ikke bevise eller påstå noe, jeg vil bare vise loggen /var/log/meldinger til min virtuelle server:

skjermbildeSette opp CD via gitlab

Installer først ufw-brannmuren:

apt-get update && apt-get install ufw

La oss aktivere standardpolicyen: blokker alle innkommende tilkoblinger, tillat alle utgående tilkoblinger:

ufw default deny incoming
ufw default allow outgoing

Viktig: ikke glem å tillate tilkoblingen via ssh:

ufw allow OpenSSH

Den generelle syntaksen er som følger: Tillat en tilkobling via port: ufw tillate 12345, der 12345 er portnummeret eller navnet på tjenesten. Nekt: ufw nekte 12345

Slå på brannmuren:

ufw enable

Vi avslutter økten og logger på igjen via ssh.

Legg til en bruker, tilordne ham et passord og legg ham til sudo-gruppen.

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

Deretter, i henhold til planen, bør du deaktivere passordpålogging. for å gjøre dette, kopier ssh-nøkkelen til serveren:

ssh-copy-id [email protected]

Server-ip-en må være din. Prøv nå å logge på med brukeren du opprettet tidligere; du trenger ikke lenger å skrive inn et passord. Deretter endrer du følgende i konfigurasjonsinnstillingene:

sudo nano /etc/ssh/sshd_config

deaktiver passordpålogging:

PasswordAuthentication no

Start sshd-demonen på nytt:

sudo systemctl reload sshd

Nå hvis du eller noen andre prøver å logge på som root-bruker, vil det ikke fungere.

Deretter, installer dockerd, jeg vil ikke beskrive prosessen her, siden alt allerede kan endres, følg lenken til den offisielle nettsiden og gå gjennom trinnene for å installere docker på din virtuelle maskin: https://docs.docker.com/install/linux/docker-ce/debian/

Generer sertifikater

For å kontrollere docker-demonen eksternt, kreves en kryptert TLS-tilkobling. For å gjøre dette må du ha et sertifikat og en nøkkel, som må genereres og overføres til den eksterne maskinen. Følg trinnene gitt i instruksjonene på den offisielle docker-nettsiden: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Alle genererte *.pem-filer for serveren, nemlig ca.pem, server.pem, key.pem, må plasseres i /etc/docker-katalogen på serveren.

Setter opp dockerd

I lanseringsskriptet for docker-demonen fjerner vi alternativet -H df://, dette alternativet bestemmer på hvilken vert docker-demonen kan kontrolleres.

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

Deretter bør du opprette en innstillingsfil, hvis den ikke allerede eksisterer, og spesifisere alternativene:

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

La oss tillate tilkoblinger på port 2376:

sudo ufw allow 2376

La oss starte dockerd på nytt med de nye innstillingene:

sudo systemctl daemon-reload && sudo systemctl restart docker

La oss sjekke:

sudo systemctl status docker

Hvis alt er "grønt", anser vi at vi har konfigurert docker på serveren.

Setter opp kontinuerlig levering på gitlab

For at Gitalaba-arbeideren skal kunne utføre kommandoer på en ekstern Docker-vert, er det nødvendig å bestemme hvordan og hvor sertifikater og nøkkelen for en kryptert forbindelse med Dockerd skal lagres. Jeg løste dette problemet ved å legge til følgende til variablene i gitlbab-innstillingene:

Spoiler tittelSette opp CD via gitlab

Bare skriv ut innholdet i sertifikatene og nøkkelen via cat: cat ca.pem. Kopier og lim inn i variabelverdiene.

La oss skrive et skript for distribusjon via GitLab. Docker-in-docker (dind)-bildet vil bli brukt.

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

Innhold i distribusjonsskriptet 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 å "trekke" innholdet i sertifikatene i normal form fra gitlab CI/CD-variablene. Jeg kunne ikke finne ut hvorfor tilkoblingen til den eksterne verten ikke fungerte. På verten så jeg på loggen sudo journalctl -u docker, det var en feil under håndtrykket. Jeg bestemte meg for å se på hva som vanligvis er lagret i variabler; for å gjøre dette kan du se slik ut: cat -A $DOCKER_CERT_PATH/key.pem. Jeg overvant feilen ved å legge til fjerningen av vogntegnet tr -d 'r'.

Deretter kan du legge til oppgaver etter utgivelse i skriptet etter eget skjønn. Du kan se den fungerende versjonen i mitt depot https://gitlab.com/isqad/gitlab-ci-cd

Kilde: www.habr.com

Legg til en kommentar