Nekoč sem razmišljal o avtomatizaciji uvajanja svojega projekta. gitlab.com prijazno ponuja vsa orodja za to in seveda sem se odločil, da ga bom uporabil tako, da sem ugotovil in napisal majhen skript za uvajanje. V tem članku delim svojo izkušnjo s skupnostjo.
Registrirajte se v spremenljivkah gitlab v nastavitvah CI / CD z vsebino potrdil. Napišite skript .gitlab-ci.yml za uvajanje.
Pokazal bom vse primere distribucije Debian.
Začetna nastavitev VPS
Tukaj ste kupili primerek na primer na DO, morate najprej zaščititi svoj strežnik pred agresivnim zunanjim svetom. Ničesar ne bom dokazoval ali trdil, pokazal bom le dnevnik /var/log/messages mojega virtualnega strežnika:
Posnetek zaslona
Najprej namestite požarni zid ufw:
apt-get update && apt-get install ufw
Omogoči privzeti pravilnik: blokiraj vse dohodne povezave, dovoli vse odhodne povezave:
IP strežnika mora biti vaš. Zdaj se poskusite prijaviti pod prej ustvarjenim uporabnikom, gesla vam ni treba več vnesti. Nato v konfiguracijskih nastavitvah spremenite naslednje:
sudo nano /etc/ssh/sshd_config
onemogoči prijavo z geslom:
PasswordAuthentication no
Znova zaženite demon sshd:
sudo systemctl reload sshd
Zdaj, če se vi ali kdo drug poskuša prijaviti kot root, ne bo uspelo.
Nato namestimo dockerd, tukaj ne bom opisoval postopka, saj je vse že mogoče spremeniti, sledite povezavi do uradne spletne strani in pojdite skozi korake namestitve dockerja na vaš virtualni stroj: https://docs.docker.com/install/linux/docker-ce/debian/
Generiranje certifikata
Za nadzor docker demona na daljavo je potrebna šifrirana povezava TLS. Če želite to narediti, morate imeti potrdilo in ključ, ki ju morate ustvariti in prenesti na oddaljeno napravo. Sledite korakom v navodilih na uradni spletni strani dockerja: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Vse ustvarjene datoteke *.pem za strežnik, in sicer ca.pem, server.pem, key.pem, je treba postaviti v imenik /etc/docker na strežniku.
nastavitev dockerja
V zagonskem skriptu docker daemon odstranite možnost -H df://, ta možnost pove, na katerem gostitelju je mogoče nadzorovati docker daemon.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Nato ustvarite datoteko z nastavitvami, če še ne obstaja, in nastavite možnosti:
Če je vse zeleno, potem štejemo, da smo uspešno konfigurirali docker na strežniku.
Nastavitev stalne dostave na gitlab
Da bi delavec gitalaba lahko izvajal ukaze na oddaljenem gostitelju dockerja, se morate odločiti, kako in kje boste shranili potrdila in ključ za šifrirano povezavo z dockerdom. To težavo sem rešil tako, da sem preprosto zapisal spremenljivkam v nastavitvah gitlbab:
naslov spojlerja
Samo izpišite vsebino potrdil in ključ prek cat: cat ca.pem. Kopirajte in prilepite v vrednosti spremenljivk.
Napišimo skript za uvajanje prek gitlaba. Uporabljena bo 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
Glavna težava je bila "izvleči" vsebino potrdil v običajni obliki iz spremenljivk gitlab CI / CD. Nisem mogel ugotoviti, zakaj povezava z oddaljenim gostiteljem ne deluje. Pogledal sem dnevnik sudo journalctl -u docker na gostitelju, prišlo je do napake pri rokovanju. Odločil sem se pogledati, kaj je običajno shranjeno v spremenljivkah, za to lahko vidite cat -A $DOCKER_CERT_PATH/key.pem. Napako smo odpravili z dodajanjem odstranitve znaka kazalke tr -d 'r'.
Poleg tega lahko skriptu po lastni presoji dodate naloge po izdaji. Delujočo različico si lahko ogledate v mojem repozitoriju https://gitlab.com/isqad/gitlab-ci-cd