Twaqqif ta' CD permezz ta' gitlab

Darba ħsibt dwar l-awtomatizzazzjoni tal-iskjerament tal-proġett tiegħi. gitlab.com ġentilment jipprovdi l-għodod kollha għal dan, u ovvjament iddeċidejt li nieħu vantaġġ minnha, insibha u nikteb script ta 'skjerament żgħir. F'dan l-artiklu naqsam l-esperjenza tiegħi mal-komunità.

TL; DR

  1. Stabbilixxi VPS: iddiżattiva l-għeruq, idħol bil-password, installa dockerd, ikkonfigura ufw
  2. Iġġenera ċertifikati għal server u klijent docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Ippermetti l-kontroll dockerd permezz tas-socket tcp: neħħi l-għażla -H fd:// mill-konfigurazzjoni tad-docker.
  3. Irreġistra mogħdijiet għaċ-ċertifikati f'docker.json
  4. Irreġistra fil-varjabbli tal-gitlab fis-settings tas-CI/CD bil-kontenut taċ-ċertifikati. Ikteb script .gitlab-ci.yml għall-iskjerament.

Se nuri l-eżempji kollha dwar id-distribuzzjoni Debian.

Setup inizjali tal-VPS

Allura xtrajt eżempju per eżempju fuq DO, l-ewwel ħaġa li trid tagħmel hu li tipproteġi s-server tiegħek mid-dinja ta 'barra aggressiva. Mhux se nipprova jew nasserixxi xejn, ser nuri biss il-log /var/log/messages tas-server virtwali tiegħi:

ScreenshotTwaqqif ta' CD permezz ta' gitlab

L-ewwel, installa l-firewall ufw:

apt-get update && apt-get install ufw

Ejja nippermettu l-politika default: imblokka l-konnessjonijiet kollha deħlin, jippermettu l-konnessjonijiet ħerġin kollha:

ufw default deny incoming
ufw default allow outgoing

Importanti: tinsiex li tippermetti l-konnessjoni permezz ta' ssh:

ufw allow OpenSSH

Is-sintassi ġenerali hija kif ġej: Ħalli konnessjoni bil-port: ufw allow 12345, fejn 12345 huwa n-numru tal-port jew l-isem tas-servizz. Iċħad: ufw deny 12345

Ixgħel il-firewall:

ufw enable

Aħna noħorġu mis-sessjoni u nerġgħu illoggjaw permezz ta' ssh.

Żid utent, assenjah password, u żidu mal-grupp sudo.

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

Sussegwentement, skond il-pjan, għandek tiddiżattiva l-login tal-password. biex tagħmel dan, kopja ċ-ċavetta ssh tiegħek fis-server:

ssh-copy-id [email protected]

L-ip tas-server għandu jkun tiegħek. Issa ipprova illoggja billi tuża l-utent li ħloqt qabel; m'għadx għandek bżonn iddaħħal password. Sussegwentement, fis-settings tal-konfigurazzjoni, ibdel dan li ġej:

sudo nano /etc/ssh/sshd_config

iddiżattiva l-login tal-password:

PasswordAuthentication no

Ibda mill-ġdid id-daemon sshd:

sudo systemctl reload sshd

Issa jekk int jew xi ħadd ieħor tipprova tidħol bħala l-utent root, mhux se jaħdem.

Sussegwentement, installa dockerd, mhux se niddeskrivi l-proċess hawn, peress li kollox jista 'jinbidel diġà, segwi l-link għall-websajt uffiċjali u għaddej mill-passi tal-installazzjoni ta' docker fuq il-magna virtwali tiegħek: https://docs.docker.com/install/linux/docker-ce/debian/

Ġenerazzjoni ta' ċertifikati

Biex tikkontrolla d-daemon docker mill-bogħod, hija meħtieġa konnessjoni TLS kriptata. Biex tagħmel dan, jeħtieġ li jkollok ċertifikat u ċavetta, li jridu jiġu ġġenerati u trasferiti għall-magna remota tiegħek. Segwi l-passi mogħtija fl-istruzzjonijiet fuq il-websajt uffiċjali tad-docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Il-fajls *.pem kollha ġġenerati għas-server, jiġifieri ca.pem, server.pem, key.pem, għandhom jitqiegħdu fid-direttorju /etc/docker fuq is-server.

It-twaqqif ta' dockerd

Fl-iskrittura tat-tnedija tad-docker daemon, inneħħu l-għażla -H df://, din l-għażla tiddetermina fuq liema ospitanti jista' jiġi kkontrollat ​​id-docker daemon.

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

Sussegwentement, għandek toħloq fajl tas-settings, jekk ma jkunx diġà jeżisti, u speċifika l-għażliet:

/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
}

Ejja nħallu konnessjonijiet fuq il-port 2376:

sudo ufw allow 2376

Ejja nerġgħu nibdew dockerd bis-settings il-ġodda:

sudo systemctl daemon-reload && sudo systemctl restart docker

Ejja niċċekkjaw:

sudo systemctl status docker

Jekk kollox huwa "aħdar", allura nikkunsidraw li kkonfigurajna b'suċċess docker fuq is-server.

Twaqqif ta' konsenja kontinwa fuq gitlab

Sabiex il-ħaddiem ta 'Gitalaba jkun jista' jesegwixxi kmandi fuq host Docker remot, huwa meħtieġ li jiddeċiedi kif u fejn jaħżen iċ-ċertifikati u ċ-ċavetta għal konnessjoni kriptata ma 'Dockerd. I solvut din il-problema billi sempliċement żidt dan li ġej mal-varjabbli fis-settings tal-gitlbab:

Titolu spoilerTwaqqif ta' CD permezz ta' gitlab

Oħroġ biss il-kontenut taċ-ċertifikati u ċ-ċavetta permezz tal-qattus: cat ca.pem. Ikkopja u paste fil-valuri varjabbli.

Ejja niktbu script għall-iskjerament permezz ta' GitLab. Se tintuża l-immaġni 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 # скрипт деплоя тут

Kontenut tal-iskript tal-iskjerament b'kummenti:

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

Il-problema ewlenija kienet li "ġbid" il-kontenut taċ-ċertifikati f'forma normali mill-varjabbli CI/CD tal-gitlab. Ma stajtx insehem għaliex il-konnessjoni mal-host remot ma kinitx qed taħdem. Fuq il-host ħarist lejn il-log sudo journalctl -u docker, kien hemm żball waqt il-handshake. Iddeċidejt li nħares lejn dak li ġeneralment jinħażen f'varjabbli; biex tagħmel dan, tista' tidher bħal din: cat -A $DOCKER_CERT_PATH/key.pem. I għelbu l-iżball billi żid it-tneħħija tal-karru karattru tr -d 'r'.

Sussegwentement, tista 'żżid kompiti ta' wara r-rilaxx mal-iskript fid-diskrezzjoni tiegħek. Tista' tara l-verżjoni tax-xogħol fir-repożitorju tiegħi https://gitlab.com/isqad/gitlab-ci-cd

Sors: www.habr.com

Żid kumment