గిట్‌లాబ్ ద్వారా CDని సెటప్ చేస్తోంది

నేను ఒకసారి నా ప్రాజెక్ట్ యొక్క విస్తరణను ఆటోమేట్ చేయడం గురించి ఆలోచించాను. gitlab.com దయతో దీని కోసం అన్ని సాధనాలను అందిస్తుంది మరియు నేను దాని ప్రయోజనాన్ని పొందాలని నిర్ణయించుకున్నాను, దానిని గుర్తించి మరియు ఒక చిన్న విస్తరణ స్క్రిప్ట్‌ను వ్రాస్తాను. ఈ వ్యాసంలో నేను సంఘంతో నా అనుభవాన్ని పంచుకుంటాను.

TL; DR

  1. VPSని సెటప్ చేయండి: రూట్‌ని నిలిపివేయండి, పాస్‌వర్డ్‌తో లాగిన్ చేయండి, డాకర్డ్‌ని ఇన్‌స్టాల్ చేయండి, ufwని కాన్ఫిగర్ చేయండి
  2. సర్వర్ మరియు క్లయింట్ కోసం సర్టిఫికేట్‌లను రూపొందించండి docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl tcp సాకెట్ ద్వారా డాకర్డ్ నియంత్రణను ప్రారంభించండి: డాకర్ కాన్ఫిగరేషన్ నుండి -H fd:// ఎంపికను తీసివేయండి.
  3. docker.jsonలో సర్టిఫికేట్‌లకు పాత్‌లను నమోదు చేయండి
  4. సర్టిఫికెట్ల కంటెంట్‌లతో CI/CD సెట్టింగ్‌లలో gitlab వేరియబుల్స్‌లో నమోదు చేయండి. విస్తరణ కోసం .gitlab-ci.yml స్క్రిప్ట్‌ను వ్రాయండి.

నేను డెబియన్ పంపిణీకి సంబంధించిన అన్ని ఉదాహరణలను చూపుతాను.

ప్రారంభ VPS సెటప్

కాబట్టి మీరు ఉదాహరణకు ఒక ఉదాహరణను కొనుగోలు చేసారు DO, మీరు చేయవలసిన మొదటి విషయం మీ సర్వర్‌ను దూకుడుగా ఉండే బయటి ప్రపంచం నుండి రక్షించడం. నేను దేనినీ నిరూపించను లేదా ధృవీకరించను, నేను నా వర్చువల్ సర్వర్ యొక్క లాగ్ /var/log/messagesని చూపుతాను:

స్క్రీన్గిట్‌లాబ్ ద్వారా CDని సెటప్ చేస్తోంది

ముందుగా, ufw ఫైర్‌వాల్‌ను ఇన్‌స్టాల్ చేయండి:

apt-get update && apt-get install ufw

డిఫాల్ట్ విధానాన్ని ప్రారంభిద్దాం: అన్ని ఇన్‌కమింగ్ కనెక్షన్‌లను బ్లాక్ చేయండి, అన్ని అవుట్‌గోయింగ్ కనెక్షన్‌లను అనుమతించండి:

ufw default deny incoming
ufw default allow outgoing

ముఖ్యమైనది: ssh ద్వారా కనెక్షన్‌ని అనుమతించడం మర్చిపోవద్దు:

ufw allow OpenSSH

సాధారణ వాక్యనిర్మాణం క్రింది విధంగా ఉంటుంది: పోర్ట్ ద్వారా కనెక్షన్‌ను అనుమతించండి: ufw అనుమతి 12345, ఇక్కడ 12345 అనేది పోర్ట్ నంబర్ లేదా సేవ పేరు. తిరస్కరించు: ufw తిరస్కరించు 12345

ఫైర్‌వాల్‌ను ఆన్ చేయండి:

ufw enable

మేము సెషన్ నుండి నిష్క్రమించి, ssh ద్వారా మళ్లీ లాగిన్ చేస్తాము.

వినియోగదారుని జోడించండి, అతనికి పాస్‌వర్డ్‌ను కేటాయించండి మరియు అతనిని సుడో గ్రూప్‌కి జోడించండి.

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

ఇప్పుడు మీరు లేదా మరెవరైనా రూట్ యూజర్‌గా లాగిన్ అవ్వడానికి ప్రయత్నిస్తే, అది పని చేయదు.

తరువాత, డాకర్డ్‌ని ఇన్‌స్టాల్ చేయండి, నేను ప్రాసెస్‌ను ఇక్కడ వివరించను, ఎందుకంటే ప్రతిదీ ఇప్పటికే మార్చవచ్చు, అధికారిక వెబ్‌సైట్‌కి లింక్‌ని అనుసరించండి మరియు మీ వర్చువల్ మెషీన్‌లో డాకర్‌ని ఇన్‌స్టాల్ చేసే దశలను అనుసరించండి: https://docs.docker.com/install/linux/docker-ce/debian/

ధృవపత్రాలను రూపొందిస్తోంది

డాకర్ డెమోన్‌ను రిమోట్‌గా నియంత్రించడానికి, ఎన్‌క్రిప్టెడ్ TLS కనెక్షన్ అవసరం. దీన్ని చేయడానికి, మీరు ఒక సర్టిఫికేట్ మరియు కీని కలిగి ఉండాలి, ఇది తప్పనిసరిగా ఉత్పత్తి చేయబడాలి మరియు మీ రిమోట్ మెషీన్‌కు బదిలీ చేయబడుతుంది. అధికారిక డాకర్ వెబ్‌సైట్‌లోని సూచనలలో ఇచ్చిన దశలను అనుసరించండి: 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 డైరెక్టరీలో తప్పనిసరిగా ఉంచబడతాయి.

డాకర్డ్‌ని సెటప్ చేస్తోంది

డాకర్ డెమోన్ లాంచ్ స్క్రిప్ట్‌లో, మేము -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

కొత్త సెట్టింగ్‌లతో డాకర్డ్‌ని పునఃప్రారంభిద్దాం:

sudo systemctl daemon-reload && sudo systemctl restart docker

తనిఖీ చేద్దాం:

sudo systemctl status docker

ప్రతిదీ "ఆకుపచ్చ" అయితే, మేము సర్వర్‌లో డాకర్‌ని విజయవంతంగా కాన్ఫిగర్ చేసాము.

గిట్‌లాబ్‌లో నిరంతర డెలివరీని ఏర్పాటు చేస్తోంది

Gitalaba వర్కర్ రిమోట్ డాకర్ హోస్ట్‌లో ఆదేశాలను అమలు చేయగలిగేలా చేయడానికి, డాకర్డ్‌తో ఎన్‌క్రిప్టెడ్ కనెక్షన్ కోసం సర్టిఫికేట్‌లను మరియు కీని ఎలా మరియు ఎక్కడ నిల్వ చేయాలో నిర్ణయించడం అవసరం. నేను gitlbab సెట్టింగ్‌లలోని వేరియబుల్స్‌కు క్రింది వాటిని జోడించడం ద్వారా ఈ సమస్యను పరిష్కరించాను:

స్పాయిలర్ టైటిల్గిట్‌లాబ్ ద్వారా CDని సెటప్ చేస్తోంది

క్యాట్ ద్వారా సర్టిఫికెట్లు మరియు కీ యొక్క కంటెంట్‌లను అవుట్‌పుట్ చేయండి: cat ca.pem. వేరియబుల్ విలువలలోకి కాపీ చేసి అతికించండి.

GitLab ద్వారా విస్తరణ కోసం స్క్రిప్ట్‌ను వ్రాద్దాం. డాకర్-ఇన్-డాకర్ (డిండ్) చిత్రం ఉపయోగించబడుతుంది.

.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

గిట్‌లాబ్ CI/CD వేరియబుల్స్ నుండి సాధారణ రూపంలో సర్టిఫికెట్‌ల కంటెంట్‌లను "పుల్" చేయడం ప్రధాన సమస్య. రిమోట్ హోస్ట్‌కి కనెక్షన్ ఎందుకు పని చేయడం లేదని నేను గుర్తించలేకపోయాను. హోస్ట్‌లో నేను లాగ్ sudo journalctl -u డాకర్‌ని చూశాను, హ్యాండ్‌షేక్ సమయంలో లోపం ఏర్పడింది. నేను సాధారణంగా వేరియబుల్స్‌లో నిల్వ చేయబడిన వాటిని చూడాలని నిర్ణయించుకున్నాను; దీన్ని చేయడానికి, మీరు ఇలా చూడవచ్చు: cat -A $DOCKER_CERT_PATH/key.pem. నేను క్యారేజ్ అక్షరం tr -d 'r' తొలగింపును జోడించడం ద్వారా లోపాన్ని అధిగమించాను.

తర్వాత, మీరు మీ అభీష్టానుసారం స్క్రిప్ట్‌కి పోస్ట్-రిలీజ్ టాస్క్‌లను జోడించవచ్చు. మీరు నా రిపోజిటరీలో పని చేసే సంస్కరణను చూడవచ్చు https://gitlab.com/isqad/gitlab-ci-cd

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి