CDди gitlab аркылуу орнотуу

Мен бир жолу өзүмдүн долбоорумду жайылтууну автоматташтыруу жөнүндө ойлонгом. gitlab.com бул үчүн бардык куралдарды боорукердик менен камсыз кылат, жана, албетте, мен анын пайдасын көрүүнү чечтим, аны түшүнүп, чакан жайылтуу сценарийин жазууну чечтим. Бул макалада мен өз тажрыйбамды коомчулук менен бөлүшөм.

TL; DR

  1. VPS орнотуу: тамырды өчүрүү, сырсөз менен кириңиз, dockerd орнотуу, 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 сценарийин жазыңыз.

Мен Debian бөлүштүрүү боюнча бардык мисалдарды көрсөтөм.

Баштапкы VPS орнотуу

Ошентип, мисалы, даректен мисал сатып алдыңыз DO, биринчи кезекте сервериңизди агрессивдүү тышкы дүйнөдөн коргоо керек. Мен эч нерсени далилдебейм же ырастабайм, мен жөн гана виртуалдык серверимдин /var/log/messages журналын көрсөтөм:

Экрандын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

Firewall күйгүзүү:

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

Эми сиз же башка бирөө түпкү колдонуучу катары кирүүгө аракет кылсаңыз, ал иштебейт.

Андан кийин, докерди орнотуңуз, мен бул жерде процессти сүрөттөп бербейм, анткени бардыгын өзгөртүүгө болот, расмий веб-сайтка шилтеме менен өтүп, виртуалдык машинаңызга докерди орнотуу кадамдарынан өтүңүз: 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 каталогуна жайгаштырылышы керек.

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

Келгиле, докердди жаңы орнотуулар менен кайра иштетели:

sudo systemctl daemon-reload && sudo systemctl restart docker

текшерип көрөлү:

sudo systemctl status docker

Эгерде бардыгы “жашыл” болсо, анда биз серверде докерди ийгиликтүү конфигурацияладык деп эсептейбиз.

gitlab боюнча үзгүлтүксүз жеткирүү орнотуу

Гиталаба жумушчусу алыскы Docker хостунда буйруктарды аткара алышы үчүн, сертификаттарды жана Dockerd менен шифрленген туташуунун ачкычын кантип жана кайда сактоону чечиш керек. Мен бул көйгөйдү жөн гана gitlbab орнотууларындагы өзгөрмөлөргө төмөнкүнү кошуу менен чечтим:

Спойлер аталышыCDди gitlab аркылуу орнотуу

Жөн гана сертификаттардын мазмунун жана мышык аркылуу ачкычты чыгарыңыз: 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 докерди карадым, кол алышуу учурунда ката кетти. Мен өзгөрмөлөрдө жалпысынан эмне сакталаарын карап көрүүнү чечтим; бул үчүн сиз төмөнкүдөй көрүнсөңүз болот: cat -A $DOCKER_CERT_PATH/key.pem. Мен tr -d 'r' каретка белгисин алып салуу менен катаны жеңдим.

Андан кийин, сиз өз каалооңуз боюнча скриптке релизден кийинки тапшырмаларды кошо аласыз. Сиз менин репозиторийимден жумушчу версиясын көрө аласыз https://gitlab.com/isqad/gitlab-ci-cd

Source: www.habr.com

Комментарий кошуу