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
Sett opp VPS: deaktiver root, logg på med passord, installer dockerd, konfigurer ufw
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:
skjermbilde
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:
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.
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:
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 tittel
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.
#!/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