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.
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ærmbillede
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:
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:
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 titel
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.
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