Konfigurimi i CD-së përmes gitlab

Një herë kam menduar për automatizimin e vendosjes së projektit tim. gitlab.com ofron me dashamirësi të gjitha mjetet për këtë, dhe sigurisht vendosa të përfitoj prej tij, duke e kuptuar dhe duke shkruar një skenar të vogël vendosjeje. Në këtë artikull unë ndaj përvojën time me komunitetin.

TL; DR

  1. Konfiguro VPS: çaktivizoni rrënjën, identifikohuni me fjalëkalim, instaloni dockerd, konfiguroni ufw
  2. Gjeneroni certifikata për serverin dhe klientin docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktivizo kontrollin dockerd nëpërmjet folesë tcp: hiqni opsionin -H fd:// nga konfigurimi i docker.
  3. Regjistroni shtigjet drejt certifikatave në docker.json
  4. Regjistrohuni në variablat gitlab në cilësimet CI/CD me përmbajtjen e certifikatave. Shkruani një skript .gitlab-ci.yml për vendosje.

Unë do të tregoj të gjithë shembujt në shpërndarjen e Debian.

Konfigurimi fillestar i VPS

Kështu që keni blerë një shembull për shembull në DO, gjëja e parë që duhet të bëni është të mbroni serverin tuaj nga bota e jashtme agresive. Unë nuk do të provoj apo pohoj asgjë, thjesht do të tregoj log /var/log/mesazhet e serverit tim virtual:

screenshotKonfigurimi i CD-së përmes gitlab

Së pari, instaloni murin e zjarrit ufw:

apt-get update && apt-get install ufw

Le të aktivizojmë politikën e paracaktuar: bllokoni të gjitha lidhjet hyrëse, lejoni të gjitha lidhjet dalëse:

ufw default deny incoming
ufw default allow outgoing

E rëndësishme: mos harroni të lejoni lidhjen përmes ssh:

ufw allow OpenSSH

Sintaksa e përgjithshme është si më poshtë: Lejo një lidhje me port: ufw allow 12345, ku 12345 është numri i portit ose emri i shërbimit. Moho: ufw mohoj 12345

Aktivizoni murin e zjarrit:

ufw enable

Ne dalim nga sesioni dhe hyjmë përsëri përmes ssh.

Shto një përdorues, cakto një fjalëkalim dhe shtoje në grupin sudo.

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

Tjetra, sipas planit, duhet të çaktivizoni hyrjen me fjalëkalim. për ta bërë këtë, kopjoni çelësin tuaj ssh në server:

ssh-copy-id [email protected]

IP-ja e serverit duhet të jetë e juaja. Tani provoni të identifikoheni duke përdorur përdoruesin që keni krijuar më parë; nuk keni më nevojë të vendosni një fjalëkalim. Tjetra, në cilësimet e konfigurimit, ndryshoni sa vijon:

sudo nano /etc/ssh/sshd_config

çaktivizoni hyrjen me fjalëkalim:

PasswordAuthentication no

Rinisni demonin sshd:

sudo systemctl reload sshd

Tani nëse ju ose dikush tjetër përpiqet të identifikoheni si përdorues rrënjë, nuk do të funksionojë.

Tjetra, instaloni dockerd, unë nuk do ta përshkruaj procesin këtu, pasi gjithçka tashmë mund të ndryshohet, ndiqni lidhjen në faqen zyrtare të internetit dhe kaloni nëpër hapat e instalimit të docker në makinën tuaj virtuale: https://docs.docker.com/install/linux/docker-ce/debian/

Gjenerimi i certifikatave

Për të kontrolluar demonin e dokerit nga distanca, kërkohet një lidhje e koduar TLS. Për ta bërë këtë, ju duhet të keni një certifikatë dhe një çelës, të cilat duhet të gjenerohen dhe transferohen në kompjuterin tuaj në distancë. Ndiqni hapat e dhëna në udhëzimet në faqen zyrtare të docker-it: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Të gjithë skedarët *.pem të gjeneruar për serverin, përkatësisht ca.pem, server.pem, key.pem, duhet të vendosen në drejtorinë /etc/docker në server.

Konfigurimi i dockerd

Në skriptin e nisjes së docker daemon, ne heqim opsionin -H df://, ky opsion përcakton se në cilin host mund të kontrollohet daemon docker.

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

Tjetra, duhet të krijoni një skedar cilësimesh, nëse nuk ekziston tashmë, dhe të specifikoni opsionet:

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

Le të lejojmë lidhjet në portin 2376:

sudo ufw allow 2376

Le të rifillojmë dockerd me cilësimet e reja:

sudo systemctl daemon-reload && sudo systemctl restart docker

Le të kontrollojmë:

sudo systemctl status docker

Nëse gjithçka është "e gjelbër", atëherë ne konsiderojmë se kemi konfiguruar me sukses docker në server.

Vendosja e dërgesës së vazhdueshme në gitlab

Në mënyrë që punonjësi i Gitalaba të jetë në gjendje të ekzekutojë komanda në një host të largët Docker, është e nevojshme të vendosni se si dhe ku të ruani certifikatat dhe çelësin për një lidhje të koduar me Dockerd. E zgjidha këtë problem thjesht duke shtuar sa vijon në variablat në cilësimet e gitlbab:

titull spoilerKonfigurimi i CD-së përmes gitlab

Thjesht nxirrni përmbajtjen e certifikatave dhe çelësin përmes cat: cat ca.pem. Kopjoni dhe ngjisni në vlerat e ndryshueshme.

Le të shkruajmë një skript për vendosje nëpërmjet GitLab. Do të përdoret imazhi 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 # скрипт деплоя тут

Përmbajtja e skriptit të vendosjes me komente:

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

Problemi kryesor ishte “tërheqja” e përmbajtjes së certifikatave në një formë normale nga variablat gitlab CI/CD. Nuk mund ta kuptoja pse lidhja me hostin në distancë nuk po funksiononte. Në host shikova log sudo journalctl -u docker, pati një gabim gjatë shtrëngimit të duarve. Vendosa të shikoj se çfarë ruhet përgjithësisht në variabla; për ta bërë këtë, mund të dukeni kështu: cat -A $DOCKER_CERT_PATH/key.pem. E kapërceva gabimin duke shtuar heqjen e karakterit të karrocës tr -d 'r'.

Më pas, mund të shtoni detyra pas publikimit në skenar sipas gjykimit tuaj. Mund ta shikoni versionin e punës në depon time https://gitlab.com/isqad/gitlab-ci-cd

Burimi: www.habr.com

Shto një koment