Настройка CD праз gitlab

Задумаўся неяк раз я аб аўтаматызацыі разгортвання свайго праекту. gitlab.com ласкава дае для гэтага ўсе прылады, і я вядома вырашыў скарыстацца, разабраўшыся і напісаўшы невялікі сцэнар дэплою. У артыкуле я дзялюся сваім досведам з супольнасцю.

TL, д-р

  1. Наладзіць VPS: адключыць root, уваход па паролі, паставіць dockerd, наладзіць ufw
  2. Згенераваць сертыфікаты для сервера і кліента docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Уключыць кіраванне dockerd праз tcp сокет: прыбраць опцыю -H fd:// з канфіга докера.
  3. Прапісаць шляхі да сертыфікатаў у docker.json
  4. Прапісаць у зменныя gitlab у наладах CI/CD са змесцівам сертыфікатаў. Напісаць скрыпт .gitlab-ci.yml для дэплою.

Усе прыклады я буду паказваць на дыстрыбутыве Debian.

Першапачатковая настройка VPS

Вось вы купілі інстанс напрыклад на DO, першае, што неабходна зрабіць, гэта абараніць ваш сервер ад агрэсіўнага знешняга свету. Я не буду нічога даказваць і сцвярджаць, проста пакажу лог /var/log/messages свайго віртуальнага сервера:

СкрыншотНастройка CD праз gitlab

Па-першае ўсталюем фаервол ufw:

apt-get update && apt-get install ufw

Уключым палітыку па змаўчанні: блакуем усе ўваходныя злучэнні, дазваляем усе выходныя злучэнні:

ufw default deny incoming
ufw default allow outgoing

Важна: не забудземся дазволіць злучэнне па ssh:

ufw allow OpenSSH

Агульны сінтаксіс такі: Дазволіць злучэнне па порце: ufw allow 12345, дзе 12345 - нумар порта ці ж назва сэрвісу. Забараніць: ufw deny 12345

Уключаем фаервол:

ufw enable

Выходзім з сесіі і зноў лагінімся па ssh.

Дадайце карыстальніка, прызначце яму пароль і дадайце яго ў групу sudo.

apt-get install sudo
adduser scoty
usermod -aG sudo scoty

Далей па плане варта адключыць уваход па паролі. для гэтага скапіюйце ваш ssh-ключ на сервер:

ssh-copy-id [email protected]

ip сервера павінен быць пазначаны ваш. Паспрабуйце зараз залагініцца пад створаным раней карыстачом, пароль уводзіць больш не трэба. Далей у наладах канфігурацыі змяняем наступнае:

sudo nano /etc/ssh/sshd_config

адключаем уваход па паролі:

PasswordAuthentication no

Перазапускаем дэман sshd:

sudo systemctl reload sshd

Цяпер калі вы ці нехта іншы паспрабуе ўвайсці праз карыстальніка root, у яго нічога не атрымаецца.

Далей ставім dockerd, тут працэс ужо не буду апісваць, бо ўсё можа быць ужо зменена, схадзіце па спасылцы на афіцыйны сайт і прайдзіце этапы ўсталёўкі docker на вашу віртуалку: https://docs.docker.com/install/linux/docker-ce/debian/

Генерацыя сертыфікатаў

Каб кіраваць дэманам докера выдалена патрабуецца шыфраванае TLS злучэнне. Для гэтага неабходна мець сертыфікат і ключ, якія трэба згенераваць і перанесці на выдаленую вашу машыну. Выконвайце крокам, зададзеным у інструкцыі на афіцыйным сайце docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Усе згенераваныя *.pem файлы для сервера, а менавіта ca.pem, server.pem, key.pem трэба змясціць у дырэкторыю /etc/docker на серверы.

Настройка dockerd

У сцэнары запуску дэмана docker прыбіраем опцыю -H df://, гэтая опцыя адказвае, на якім хасце можна кіраваць дэманам докера.

# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd

Далей варта стварыць файл налад, калі яго яшчэ няма і прапісаць опцыі:

/etc/docker/docker.json

{
  "hosts": [
    "unix:///var/run/docker.sock",
    "tcp://0.0.0.0:2376"
  ],
  "labels": [
    "is-our-remote-engine=true"
  ],
  "tls": true,
  "tlscacert": "/etc/docker/ca.pem",
  "tlscert": "/etc/docker/server.pem",
  "tlskey": "/etc/docker/key.pem",
  "tlsverify": true
}

Дазволім падлучэнні па порце 2376:

sudo ufw allow 2376

Перазапусцім dockerd з новымі наладамі:

sudo systemctl daemon-reload && sudo systemctl restart docker

Праверым:

sudo systemctl status docker

Калі ўсё "зялёнае", то лічым, што на серверы мы паспяхова наладзілі docker.

Настройка continuous deleivery на gitlab

Для таго каб воркер гиталаба змог выконваць каманды на выдаленым хасце докера неабходна вызначыцца, як і дзе захоўваць сертыфікаты і ключ для шыфраванага злучэння з dockerd. Я вырашыў дадзеную праблему проста прапісаўшы ў зменныя ў наладах gitlbab:

Загаловак спойлераНастройка CD праз gitlab

Проста выводзьце змесціва сертыфікатаў і ключа праз cat: cat ca.pem. Капіюеце і ўстаўляеце ў значэнне зменных.

Прапішам сцэнар для дэплою праз гітлаб. Выкарыстоўваць будзе docker-in-docker (dind) вобраз.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # перепишем entrypoint , чтобы работало в dind
  entrypoint: ["/bin/sh", "-c"]

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2

services:
  - docker:dind

stages:
  - deploy

deploy:
  stage: deploy
  script:
    - bin/deploy.sh # скрипт деплоя тут

Змест скрыпту дэплою з каментарамі:

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

Асноўная праблема была ў тым, каб "выцягнуць" з зменных gitlab CI/CD змесціва сертыфікатаў у нармалёвым выглядзе. Я не мог зразумець, чаму не працавала злучэнне з выдаленым хастом. На хасце паглядзеў часопіс sudo journalctl -u docker, тамака памылка пры поціску рукі. Вырашыў зірнуць, што наогул захоўваецца ў зменных, для гэтага можна паглядзець так cat -A $DOCKER_CERT_PATH/key.pem. Памылку падужаў, дадаўшы выдаленне знака карэткі tr -d 'r'.

Далей у сцэнар можна дадаць пост-рэлізныя цягі на сваё меркаванне. Азнаёміцца ​​з працоўнай версіяй можаце ў маім рэпазітары https://gitlab.com/isqad/gitlab-ci-cd

Крыніца: habr.com

Дадаць каментар