Raz som premýšľal o automatizácii nasadenia môjho projektu. gitlab.com láskavo poskytuje všetky nástroje na to a ja som sa, samozrejme, rozhodol využiť to, prišiel som na to a napísal som malý skript nasadenia. V tomto článku zdieľam svoje skúsenosti s komunitou.
Zaregistrujte sa v premenných gitlabu v nastaveniach CI/CD s obsahom certifikátov. Napíšte skript .gitlab-ci.yml na nasadenie.
Všetky príklady ukážem na distribúcii Debian.
Počiatočné nastavenie VPS
Takže ste si kúpili inštanciu napríklad na DOPrvá vec, ktorú musíte urobiť, je chrániť váš server pred agresívnym vonkajším svetom. Nebudem nič dokazovať ani tvrdiť, len ukážem log /var/log/messages môjho virtuálneho servera:
screenshot
Najprv nainštalujte ufw firewall:
apt-get update && apt-get install ufw
Povoľme predvolenú politiku: blokovať všetky prichádzajúce pripojenia, povoliť všetky odchádzajúce pripojenia:
IP servera musí byť vaša. Teraz sa pokúste prihlásiť pomocou používateľa, ktorého ste vytvorili predtým; už nemusíte zadávať heslo. Ďalej v nastaveniach konfigurácie zmeňte nasledovné:
sudo nano /etc/ssh/sshd_config
zakázať prihlásenie heslom:
PasswordAuthentication no
Reštartujte démona sshd:
sudo systemctl reload sshd
Ak sa vy alebo niekto iný pokúsite prihlásiť ako root, nebude to fungovať.
Ďalej nainštalujte dockerd, nebudem tu popisovať proces, pretože všetko sa už dá zmeniť, kliknite na odkaz na oficiálnu webovú stránku a prejdite krokmi inštalácie docker na váš virtuálny počítač: https://docs.docker.com/install/linux/docker-ce/debian/
Generovanie certifikátov
Na vzdialené ovládanie démona dockeru je potrebné šifrované pripojenie TLS. Na to potrebujete certifikát a kľúč, ktorý je potrebné vygenerovať a preniesť na váš vzdialený počítač. Postupujte podľa krokov uvedených v pokynoch na oficiálnej webovej stránke docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Všetky vygenerované súbory *.pem pre server, menovite ca.pem, server.pem, key.pem, musia byť umiestnené v adresári /etc/docker na serveri.
Nastavenie dockerd
V skripte spustenia démona docker odstraňujeme možnosť -H df://, táto možnosť určuje, na ktorom hostiteľovi je možné ovládať démona docker.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Ďalej by ste mali vytvoriť súbor s nastaveniami, ak ešte neexistuje, a zadať možnosti:
Ak je všetko „zelené“, potom sa domnievame, že sme úspešne nakonfigurovali docker na serveri.
Nastavenie nepretržitého doručovania na gitlab
Aby mohol pracovník Gitalaby vykonávať príkazy na vzdialenom hostiteľovi Dockeru, je potrebné rozhodnúť, ako a kde uloží certifikáty a kľúč pre šifrované spojenie s Dockerdom. Tento problém som vyriešil jednoduchým pridaním nasledujúceho do premenných v nastaveniach gitlbab:
Názov spoileru
Stačí vytlačiť obsah certifikátov a kľúča cez cat: cat ca.pem. Skopírujte a vložte do hodnôt premenných.
Poďme napísať skript pre nasadenie cez GitLab. Použije sa obrázok 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
Hlavným problémom bolo „vytiahnuť“ obsah certifikátov v normálnej forme z premenných gitlab CI/CD. Nevedel som zistiť, prečo nefunguje pripojenie k vzdialenému hostiteľovi. Na hostiteľovi som si pozrel log sudo journalctl -u docker, pri handshake sa vyskytla chyba. Rozhodol som sa pozrieť na to, čo je vo všeobecnosti uložené v premenných; na to môžete vyzerať takto: cat -A $DOCKER_CERT_PATH/key.pem. Chybu som prekonal pridaním odstránenia znaku vozíka tr -d 'r'.
Ďalej môžete do skriptu pridať úlohy po vydaní podľa vlastného uváženia. Pracovnú verziu si môžete pozrieť v mojom úložisku https://gitlab.com/isqad/gitlab-ci-cd