Jednom sam razmišljao o automatizaciji implementacije mog projekta. gitlab.com ljubazno pruža sve alate za ovo, i naravno, odlučio sam da ga koristim tako što sam ga smislio i napisao malu skriptu za implementaciju. U ovom članku dijelim svoje iskustvo sa zajednicom.
Registrirajte se u gitlab varijable u CI/CD postavkama sa sadržajem certifikata. Napišite .gitlab-ci.yml skriptu za implementaciju.
Pokazat ću sve primjere o Debian distribuciji.
Početno podešavanje VPS-a
Ovdje ste kupili primjer na primjer na DO, prva stvar koju treba učiniti je da zaštitite svoj server od agresivnog vanjskog svijeta. Neću ništa dokazivati niti tvrditi, samo ću pokazati /var/log/messages dnevnik mog virtuelnog servera:
Snimak ekrana
Prvo instalirajte ufw firewall:
apt-get update && apt-get install ufw
Omogućite zadanu politiku: blokirajte sve dolazne veze, dozvolite sve odlazne veze:
IP servera mora biti vaš. Sada se pokušajte prijaviti pod prethodno kreiranim korisnikom, više ne morate unositi lozinku. Zatim, u postavkama konfiguracije, promijenite sljedeće:
sudo nano /etc/ssh/sshd_config
onemogući prijavu lozinkom:
PasswordAuthentication no
Ponovo pokrenite sshd demon:
sudo systemctl reload sshd
Sada ako se vi ili neko drugi pokuša prijaviti kao root, neće uspjeti.
Zatim instaliramo dockerd, ovdje neću opisivati proces, jer se sve već može promijeniti, slijedite link na službenu web stranicu i prođite kroz korake instaliranja dockera na vašu virtualnu mašinu: https://docs.docker.com/install/linux/docker-ce/debian/
Generisanje sertifikata
Za daljinsko upravljanje docker demonom potrebna je šifrirana TLS veza. Da biste to učinili, morate imati certifikat i ključ koji trebate generirati i prenijeti na udaljenu mašinu. Slijedite korake date u uputama na službenoj web stranici docker-a: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Sve generisane *.pem datoteke za server, odnosno ca.pem, server.pem, key.pem, treba da budu smeštene u /etc/docker direktorijum na serveru.
docker setup
U skripti za pokretanje docker demona, uklonite opciju -H df://, ova opcija govori na kojem hostu se može kontrolirati docker demon.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Zatim kreirajte datoteku postavki ako već ne postoji i postavite opcije:
Ako je sve zeleno, onda smatramo da smo uspješno konfigurirali docker na serveru.
Postavljanje kontinuirane isporuke na gitlab-u
Da bi gitalab radnik mogao da izvršava komande na udaljenom docker hostu, potrebno je da odlučite kako i gde da pohranite sertifikate i ključ za šifrovanu vezu sa dockerd-om. Rešio sam ovaj problem jednostavnim pisanjem u varijable u postavkama gitlbaba:
naslov spojlera
Samo ispišite sadržaj certifikata i ključa preko cat: cat ca.pem. Kopirajte i zalijepite u varijabilne vrijednosti.
Hajde da napišemo skriptu za implementaciju kroz gitlab. Koristit će se slika docker-in-docker (dind).
#!/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
Glavni problem je bio "izvući" sadržaj certifikata u normalnom obliku iz gitlab CI/CD varijabli. Nisam mogao da shvatim zašto veza sa udaljenim hostom ne radi. Pogledao sam sudo journalctl -u docker log na hostu, postoji greška sa rukovanjem. Odlučio sam pogledati šta je općenito pohranjeno u varijablama, za ovo možete vidjeti cat -A $DOCKER_CERT_PATH/key.pem. Greška je prevaziđena dodavanjem uklanjanja znaka za umetanje tr -d 'r'.
Nadalje, možete dodati zadatke nakon objavljivanja skripti po svom nahođenju. Radnu verziju možete pogledati u mom spremištu https://gitlab.com/isqad/gitlab-ci-cd