Konfigurimi i CD përmes gitlab

Një ditë, u mendova për automatizimin e shpërndarjes së projektit tim. gitlab.com ofron gjithë mjetet për këtë, prandaj vendosa ta shfrytëzoj atë, duke kuptuar dhe shkruar një skenar të vogël për shpërndarjen. Në këtë artikull, ndaja përvojën time me komunitetin.

TL;DR

  1. Konfiguroni VPS: çaktivizoni root, hyrjen me fjalëkalim, instaloni dockerd, konfiguroni ufw
  2. Gjeneroni certifikatat për serverin dhe klientin docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktivizoni menaxhimin e dockerd përmes tcp socket: hiqni opsionin -H fd:// nga konfigurimi i docker.
  3. Прописать пути до сертификатов в docker.json
  4. Shtoni në variablat gitlab në cilësimet CI/CD përmbajtjen e certifikatave. Shkruani skenarin .gitlab-ci.yml për shpërndarjen.

Të gjitha shembujt do t'i tregoj në distribucionin Debian.

Konfigurimi fillestar i VPS

Keni blerë një instancë, për shembull, në DO, e para gjë që duhet të bëni është të mbroni serverin tuaj nga bota e jashtme e ashpër. Nuk do të argumentohem apo konfirmoj, thjesht do të tregoj logun /var/log/messages të serverit tim virtual:

ScreenshotKonfigurimi i CD përmes gitlab

Së pari, instaloni firewall-in ufw:

apt-get update && apt-get install ufw

Aktivizoni politikën e parazgjedhur: bllokoni të gjitha lidhjet hyrëse, lejoni të gjitha lidhjet dalje:

ufw default deny incoming
ufw default allow outgoing

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

ufw allow OpenSSH

Sintaksa e përgjithshme është kështu: Lejoni lidhjen për portin: ufw allow 12345, ku 12345 është numri i portit ose emri i shërbimit. Ndaloni: ufw deny 12345

Aktivizoni firewall-in:

ufw enable

Dalni nga sesioni dhe regjistrohuni përsëri me ssh.

Shtoni përdoruesin, caktoni një fjalëkalim dhe shtojeni atë në grupin sudo.

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

Më pas, në planin është të çaktivizoni hyrjen me fjalëkalim. Për këtë, kopjoni çelësin tuaj ssh në server:

ssh-copy-id root@10.101.10.28

ip i serverit duhet të jetë ai i juaji. Provoni tani të regjistroheni me përdoruesin e krijuar më parë, nuk keni nevojë të jepni më fjalëkalimin. Më pas, në cilësimet e konfigurimit, ndryshoni ndjekës:

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 ndonjë tjetër përpiqet të hyjë përmes përdoruesit root, nuk do të arrijë asgjë.

Më pas, instaloni dockerd, këtu procesi nuk do ta përshkruaj, pasi gjithçka mund të jetë ndryshuar tashmë, shkoni te lidhja në faqen zyrtare dhe përfundoni hapat për instalimin e docker në virtualin tuaj: https://docs.docker.com/install/linux/docker-ce/debian/

Generimi i certifikatave

Për të menaxhuar demonin e Dockerit në distancë, kërkohet një lidhje e enkriptuar TLS. Për këtë, është e nevojshme të keni një certifikat dhe një çelës, të cilat duhet të krijoni dhe transferoni në makinën tuaj të largët. Ndiqni hapat e caktuar në udhëzimet në faqen zyrtare të docker. https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Të gjitha skedaret *.pem të krijuara 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 lançimit të demonit të Dockerit, hiqni opsionin -H df://, ky opsion përcakton se në cilin host mund të menaxhohet demoni i Dockerit.

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

Më pas, krijoni një skedar konfigurimi, nëse nuk ekziston, dhe shkruani 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
}

Lejojmë lidhjet në portin 2376:

sudo ufw allow 2376

Rinisim dockerd me cilësimet e reja:

sudo systemctl daemon-reload && sudo systemctl restart docker

Të kontrollojmë:

sudo systemctl status docker

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

Konfigurimi i dërgimit të vazhdueshëm në gitlab

Për të lejuar që punëtorët e GitLab të kryejnë komanda në hostin e largët të Dockerit, është e nevojshme të vendosim se si dhe ku do të ruhen certifikatat dhe çelësi për lidhjen e enkriptuar me dockerd. Enë e madhe e problemit e zgjodha duke e vendosur thjesht në variablat në konfigurimet e GitLab:

Titulli i spoleritKonfigurimi i CD përmes gitlab

Thjesht printoni përmbajtjen e certifikatave dhe çelësit përmes cat: cat ca.pem. Kopjoni dhe ngjiteni në vlerën e variablave.

Do të shkruajmë një skript për shpërndarjen përmes GitLab. Do të përdorim imazhin docker-in-docker (dind).

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # do ta ripërdorim entrypoint, për ta bërë të punojë në 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 # skripti i shpërndarjes këtu

Përmbajtja e skriptit të shpërndarjes 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 për të "nxjerrë" nga variablat gitlab CI/CD përmbajtjen e certifikatave në një format të pranuar. Nuk mund të kuptoja pse lidhja me hostin e largët nuk funksiononte. Në host shikoja regjistrin sudo journalctl -u docker, aty kishte një gabim gjatë dorëzimit. Vendosa të shikoja se çfarë ruhet në variabla, për këtë mund të shikoja kështu cat -A $DOCKER_CERT_PATH/key.pem. E zgjidhja gabimin duke shtuar heqjen e simbolit të karrocës tr -d ‘r’.

Më pas, mund të shtoni detyra post-release sipas dëshirës tuaj. Mund ta shihni versionin e punës në depozitën time. https://gitlab.com/isqad/gitlab-ci-cd

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster