CD seadistamine Gitlabi kaudu

Kunagi mõtlesin oma projekti juurutamise automatiseerimisele. gitlab.com pakub selleks lahkelt kõik tööriistad ja loomulikult otsustasin seda kasutada, mõeldes selle välja ja kirjutades väikese juurutusskripti. Selles artiklis jagan oma kogemusi kogukonnaga.

TL; DR

  1. Seadistage VPS: keelake root, parooliga sisselogimine, installige dockerd, konfigureerige ufw
  2. Sertifikaatide genereerimine serverile ja kliendile docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Dockerdi juhtimise lubamine tcp-pesa kaudu: eemaldage dokkeri konfiguratsioonist suvand -H fd://.
  3. Määrake failis docker.json sertifikaatide teed
  4. Registreeruge gitlabi muutujates CI / CD sätetes sertifikaatide sisuga. Kirjutage juurutamiseks .gitlab-ci.yml skript.

Näitan kõiki näiteid Debiani distributsiooni kohta.

VPS-i esialgne seadistamine

Siit ostsite näiteks eksemplari DO, on esimene asi, mida teha, kaitsta oma serverit agressiivse välismaailma eest. Ma ei tõesta ega väida midagi, näitan lihtsalt oma virtuaalserveri logi /var/log/messages:

ScreenshotCD seadistamine Gitlabi kaudu

Esmalt installige ufw tulemüür:

apt-get update && apt-get install ufw

Luba vaikepoliitika: blokeeri kõik sissetulevad ühendused, luba kõik väljaminevad ühendused:

ufw default deny incoming
ufw default allow outgoing

Tähtis: ärge unustage lubada ühendust ssh kaudu:

ufw allow OpenSSH

Üldine süntaks on: Luba ühendus pordis: ufw enable 12345, kus 12345 on pordi number või teenuse nimi. Keela: ufw deny 12345

Lülitage tulemüür sisse:

ufw enable

Väljume seansist ja logime ssh kaudu uuesti sisse.

Lisage kasutaja, määrake talle parool ja lisage ta sudo gruppi.

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

Järgmiseks tuleks plaani järgi parooliga sisselogimine keelata. selleks kopeerige oma ssh-võti serverisse:

ssh-copy-id [email protected]

Serveri IP peab olema teie oma. Proovi nüüd sisse logida varem loodud kasutaja alt, parooli enam sisestama ei pea. Järgmisena muutke konfiguratsiooniseadetes järgmist.

sudo nano /etc/ssh/sshd_config

keela parooliga sisselogimine:

PasswordAuthentication no

Taaskäivitage sshd deemon:

sudo systemctl reload sshd

Nüüd, kui teie või keegi teine ​​proovib administraatorina sisse logida, siis see ebaõnnestub.

Järgmisena installime dockerdi, ma ei kirjelda siin protsessi, kuna kõike saab juba muuta, järgige ametliku veebisaidi linki ja tehke oma virtuaalmasinasse dockeri installimise etapid: https://docs.docker.com/install/linux/docker-ce/debian/

Sertifikaadi genereerimine

Dockeri deemoni kaugjuhtimiseks on vaja krüptitud TLS-ühendust. Selleks peab teil olema sertifikaat ja võti, mille peate genereerima ja oma kaugmasinasse üle kandma. Järgige dokkeri ametlikul veebisaidil toodud juhiseid. https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Kõik serveri jaoks loodud *.pem-failid, nimelt ca.pem, server.pem, key.pem, tuleks paigutada serveri kataloogi /etc/docker.

doki seadistamine

Dockeri deemoni käivitusskriptist eemaldage suvand -H df://, see suvand ütleb, millisel hostil saab dokkedeemonit juhtida.

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

Järgmisena looge seadete fail, kui seda veel pole, ja määrake valikud:

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

Luba ühendused pordis 2376:

sudo ufw allow 2376

Taaskäivitage docker uute seadetega:

sudo systemctl daemon-reload && sudo systemctl restart docker

Kontrollime:

sudo systemctl status docker

Kui kõik on roheline, siis arvame, et oleme serveris dokkeri edukalt konfigureerinud.

Pidev kohaletoimetamise seadistamine Gitlabis

Selleks, et gitalabi töötaja saaks kaugdokeri hostis käske täita, peate otsustama, kuidas ja kuhu salvestada sertifikaate ja dockerdi krüpteeritud ühenduse võtit. Lahendasin selle probleemi, kirjutades lihtsalt gitlbabi seadete muutujatele:

spoileri pealkiriCD seadistamine Gitlabi kaudu

Lihtsalt väljastage sertifikaatide sisu ja võti cati kaudu: cat ca.pem. Kopeerige ja kleepige muutuvatesse väärtustesse.

Kirjutame Gitlabi kaudu juurutamiseks skripti. Kasutatakse docker-in-doccker (dind) pilti.

.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 # скрипт деплоя тут

Juurutusskripti sisu koos kommentaaridega:

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

Peamine probleem oli gitlabi CI / CD muutujatest sertifikaatide sisu tavakujul "välja tõmbamine". Ma ei saanud aru, miks ühendus kaughostiga ei tööta. Vaatasin hostis sudo journalctl -u dockeri logi, käepigistuses on viga. Otsustasin vaadata, mida üldiselt muutujatesse salvestatakse, selle jaoks näete kassi -A $DOCKER_CERT_PATH/key.pem. Vea sai üle, lisades tähise tr -d 'r' eemaldamise.

Lisaks saate oma äranägemise järgi skriptile lisada avaldamisjärgseid ülesandeid. Tööversiooni saate vaadata minu hoidlast https://gitlab.com/isqad/gitlab-ci-cd

Allikas: www.habr.com

Lisa kommentaar