CD-opstelling via gitlab

Ek het eenkeer daaraan gedink om die ontplooiing van my projek te outomatiseer. gitlab.com verskaf vriendelik al die gereedskap hiervoor, en natuurlik het ek besluit om dit te gebruik deur dit uit te vind en 'n klein ontplooiingsskrif te skryf. In hierdie artikel deel ek my ervaring met die gemeenskap.

TL; DR

  1. Stel VPS op: deaktiveer wortel, wagwoordaanmelding, installeer dockerd, stel ufw in
  2. Genereer sertifikate vir bediener en kliënt docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktiveer dockerd-beheer via tcp-sok: verwyder die -H fd://-opsie uit die docker-konfigurasie.
  3. Stel paaie na sertifikate in docker.json
  4. Registreer in die gitlab veranderlikes in die CI / CD instellings met die inhoud van die sertifikate. Skryf 'n .gitlab-ci.yml-skrip vir ontplooiing.

Ek sal alle voorbeelde oor die Debian-verspreiding wys.

Aanvanklike VPS-opstelling

Hier het jy byvoorbeeld 'n instansie gekoop op DO, die eerste ding om te doen is om jou bediener te beskerm teen die aggressiewe buitewêreld. Ek sal niks bewys of beweer nie, ek sal net die /var/log/messages log van my virtuele bediener wys:

kiekieCD-opstelling via gitlab

Installeer eers die ufw firewall:

apt-get update && apt-get install ufw

Aktiveer die verstekbeleid: blokkeer alle inkomende verbindings, laat alle uitgaande verbindings toe:

ufw default deny incoming
ufw default allow outgoing

Belangrik: moenie vergeet om verbinding via ssh toe te laat nie:

ufw allow OpenSSH

Die algemene sintaksis is: Laat verbinding op poort toe: ufw toelaat 12345, waar 12345 die poortnommer of diensnaam is. Weier: ufw ontken 12345

Skakel die firewall aan:

ufw enable

Ons verlaat die sessie en meld weer aan via ssh.

Voeg 'n gebruiker by, gee vir hom 'n wagwoord en voeg hom by die sudo-groep.

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

Volgende, volgens die plan, moet u wagwoordaanmelding deaktiveer. om dit te doen, kopieer jou ssh-sleutel na die bediener:

ssh-copy-id [email protected]

Die ip van die bediener moet joune wees. Probeer nou om aan te meld onder die gebruiker wat vroeër geskep is, jy hoef nie meer 'n wagwoord in te voer nie. Vervolgens, in die konfigurasie-instellings, verander die volgende:

sudo nano /etc/ssh/sshd_config

deaktiveer wagwoordaanmelding:

PasswordAuthentication no

Herbegin die sshd daemon:

sudo systemctl reload sshd

As jy of iemand anders as root probeer aanmeld, sal dit misluk.

Vervolgens installeer ons dockerd, ek sal nie die proses hier beskryf nie, aangesien alles reeds verander kan word, volg die skakel na die amptelike webwerf en gaan deur die stappe om docker op u virtuele masjien te installeer: https://docs.docker.com/install/linux/docker-ce/debian/

Sertifikaat generering

Om die docker-demon op afstand te beheer, word 'n geënkripteerde TLS-verbinding vereis. Om dit te doen, moet jy 'n sertifikaat en 'n sleutel hê wat jy moet genereer en na jou afgeleë masjien oordra. Volg die stappe in die instruksies op die amptelike docker-webwerf: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Alle gegenereerde *.pem-lêers vir die bediener, naamlik ca.pem, server.pem, key.pem, moet in die /etc/docker-gids op die bediener geplaas word.

docker-opstelling

Verwyder die -H df://-opsie in die docker-daemon-opstartskrip, hierdie opsie vertel op watter gasheer die docker-demoon beheer kan word.

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

Skep dan 'n instellingslêer as dit nie reeds bestaan ​​nie en stel die opsies in:

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

Laat verbindings op poort 2376 toe:

sudo ufw allow 2376

Herbegin dockerd met nuwe instellings:

sudo systemctl daemon-reload && sudo systemctl restart docker

Kom ons kyk:

sudo systemctl status docker

As alles groen is, is ons van mening dat ons docker suksesvol op die bediener opgestel het.

Stel deurlopende aflewering op gitlab op

Om die gitalab-werker in staat te stel om opdragte op 'n afgeleë docker-gasheer uit te voer, moet jy besluit hoe en waar om sertifikate en 'n sleutel vir 'n geënkripteerde verbinding met dockerd te stoor. Ek het hierdie probleem opgelos deur eenvoudig na die veranderlikes in die gitlbab-instellings te skryf:

spoiler titelCD-opstelling via gitlab

Voer net die inhoud van die sertifikate en sleutel uit via kat: cat ca.pem. Kopieer en plak in veranderlike waardes.

Kom ons skryf 'n skrif vir implementering deur gitlab. Die docker-in-doker (dind)-prent sal gebruik word.

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

Die inhoud van die ontplooiingskrip met opmerkings:

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

Die grootste probleem was om die inhoud van die sertifikate in die normale vorm uit die gitlab CI / CD veranderlikes te "trek". Ek kon nie agterkom hoekom die verbinding met die afgeleë gasheer nie werk nie. Ek het na die sudo journalctl -u docker log op die gasheer gekyk, daar is 'n fout met die handdruk. Ek het besluit om te kyk na wat oor die algemeen in veranderlikes gestoor word, hiervoor kan jy cat -A $DOCKER_CERT_PATH/key.pem sien. Het die fout oorkom deur die verwydering van die karetkarakter tr -d 'r' by te voeg.

Verder kan jy na-vrystelling take by die skrif voeg na jou goeddunke. U kan die werkende weergawe in my bewaarplek nagaan https://gitlab.com/isqad/gitlab-ci-cd

Bron: will.com

Voeg 'n opmerking