Насб кардани CD тавассути gitlab

Боре ман дар бораи автоматикунонии ҷойгиркунии лоиҳаи худ фикр кардам. gitlab.com бо меҳрубонӣ тамоми абзорҳоро барои ин пешниҳод мекунад ва албатта ман қарор додам, ки аз он истифода барам, онро муайян карда, скрипти хурди густаришро нависам. Дар ин мақола ман таҷрибаи худро бо ҷомеа мубодила мекунам.

ХИБ; DR

  1. VPS-ро насб кунед: решаро хомӯш кунед, бо парол ворид шавед, 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/хабарҳои сервери виртуалии худро нишон медиҳам:

ScreenshotНасб кардани CD тавассути gitlab

Аввалан, девори 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 ворид мешавем.

Истифодабаранда илова кунед, ба ӯ парол таъин кунед ва ӯро ба гурӯҳи 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

Ҳоло агар шумо ё ягон каси дигар кӯшиш кунед, ки ҳамчун корбари реша ворид шавед, он кор намекунад.

Минбаъд, dockerd-ро насб кунед, ман равандро дар ин ҷо тавсиф намекунам, зеро ҳама чизро аллакай тағир додан мумкин аст, истиноди вебсайти расмиро пайгирӣ кунед ва қадамҳои насби докерро дар мошини виртуалии худ гузаред: 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

Дар скрипти оғози демони докер мо опсияи -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

Агар ҳама чиз "сабз" бошад, мо фикр мекунем, ки мо докерро дар сервер бомуваффақият танзим кардем.

Танзими интиқоли пайваста дар gitlab

Барои он ки коргари Гиталаба тавонистааст фармонҳоро дар ҳости дурдасти Docker иҷро кунад, бояд муайян кард, ки чӣ гуна ва дар куҷо нигоҳ доштани сертификатҳо ва калиди пайвасти рамзшуда бо Dockerd. Ман ин мушкилотро тавассути илова кардани тағирёбандаҳо дар танзимоти gitlbab ҳал кардам:

Сарлавҳаи спойлерНасб кардани CD тавассути gitlab

Танҳо мундариҷаи сертификатҳо ва калидро тавассути cat бароред: cat ca.pem. Нусхабардорӣ ва ба арзишҳои тағирёбанда часбонед.

Биёед скриптро барои густариш тавассути GitLab нависед. Тасвири 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 буд. Ман фаҳмида наметавонистам, ки чаро пайвастшавӣ ба мизбони дурдаст кор намекунад. Дар мизбон ман ба log sudo journalctl -u docker нигоҳ кардам, ҳангоми дастфишорӣ хатогӣ ба вуҷуд омад. Ман қарор додам, ки он чизеро, ки одатан дар тағирёбандаҳо нигоҳ дошта мешавад, бубинам; барои ин, шумо метавонед чунин назар кунед: cat -A $DOCKER_CERT_PATH/key.pem. Ман хатогиро тавассути илова кардани аломати вагонча tr -d 'r' бартараф кардам.

Баъдан, шумо метавонед ба скрипт бо ихтиёри худ вазифаҳои пас аз нашр илова кунед. Шумо метавонед версияи кориро дар анбори ман дидан кунед https://gitlab.com/isqad/gitlab-ci-cd

Манбаъ: will.com

Илова Эзоҳ