Nastavitev CD-ja prek gitlaba

Nekoč sem razmišljal o avtomatizaciji uvajanja svojega projekta. gitlab.com prijazno ponuja vsa orodja za to in seveda sem se odločil, da ga bom uporabil tako, da sem ugotovil in napisal majhen skript za uvajanje. V tem članku delim svojo izkušnjo s skupnostjo.

TL; DR

  1. Nastavite VPS: onemogočite root, prijavo z geslom, namestite dockerd, konfigurirajte ufw
  2. Ustvari potrdila za strežnik in odjemalca docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Omogoči nadzor dockerd prek vtičnice tcp: odstranite možnost -H fd:// iz konfiguracije dockerja.
  3. Nastavite poti do potrdil v docker.json
  4. Registrirajte se v spremenljivkah gitlab v nastavitvah CI / CD z vsebino potrdil. Napišite skript .gitlab-ci.yml za uvajanje.

Pokazal bom vse primere distribucije Debian.

Začetna nastavitev VPS

Tukaj ste kupili primerek na primer na DO, morate najprej zaščititi svoj strežnik pred agresivnim zunanjim svetom. Ničesar ne bom dokazoval ali trdil, pokazal bom le dnevnik /var/log/messages mojega virtualnega strežnika:

Posnetek zaslonaNastavitev CD-ja prek gitlaba

Najprej namestite požarni zid ufw:

apt-get update && apt-get install ufw

Omogoči privzeti pravilnik: blokiraj vse dohodne povezave, dovoli vse odhodne povezave:

ufw default deny incoming
ufw default allow outgoing

Pomembno: ne pozabite omogočiti povezave prek ssh:

ufw allow OpenSSH

Splošna sintaksa je: Dovoli povezavo na vratih: ufw allow 12345, kjer je 12345 številka vrat ali ime storitve. Zavrni: ufw zavrni 12345

Vklopi požarni zid:

ufw enable

Zapustimo sejo in se ponovno prijavimo preko ssh.

Dodajte uporabnika, mu dodelite geslo in ga dodajte v skupino sudo.

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

Nato bi morali po načrtu onemogočiti prijavo z geslom. če želite to narediti, kopirajte svoj ssh ključ na strežnik:

ssh-copy-id [email protected]

IP strežnika mora biti vaš. Zdaj se poskusite prijaviti pod prej ustvarjenim uporabnikom, gesla vam ni treba več vnesti. Nato v konfiguracijskih nastavitvah spremenite naslednje:

sudo nano /etc/ssh/sshd_config

onemogoči prijavo z geslom:

PasswordAuthentication no

Znova zaženite demon sshd:

sudo systemctl reload sshd

Zdaj, če se vi ali kdo drug poskuša prijaviti kot root, ne bo uspelo.

Nato namestimo dockerd, tukaj ne bom opisoval postopka, saj je vse že mogoče spremeniti, sledite povezavi do uradne spletne strani in pojdite skozi korake namestitve dockerja na vaš virtualni stroj: https://docs.docker.com/install/linux/docker-ce/debian/

Generiranje certifikata

Za nadzor docker demona na daljavo je potrebna šifrirana povezava TLS. Če želite to narediti, morate imeti potrdilo in ključ, ki ju morate ustvariti in prenesti na oddaljeno napravo. Sledite korakom v navodilih na uradni spletni strani dockerja: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Vse ustvarjene datoteke *.pem za strežnik, in sicer ca.pem, server.pem, key.pem, je treba postaviti v imenik /etc/docker na strežniku.

nastavitev dockerja

V zagonskem skriptu docker daemon odstranite možnost -H df://, ta možnost pove, na katerem gostitelju je mogoče nadzorovati docker daemon.

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

Nato ustvarite datoteko z nastavitvami, če še ne obstaja, in nastavite možnosti:

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

Dovoli povezave na vratih 2376:

sudo ufw allow 2376

Znova zaženite dockerd z novimi nastavitvami:

sudo systemctl daemon-reload && sudo systemctl restart docker

Preveri:

sudo systemctl status docker

Če je vse zeleno, potem štejemo, da smo uspešno konfigurirali docker na strežniku.

Nastavitev stalne dostave na gitlab

Da bi delavec gitalaba lahko izvajal ukaze na oddaljenem gostitelju dockerja, se morate odločiti, kako in kje boste shranili potrdila in ključ za šifrirano povezavo z dockerdom. To težavo sem rešil tako, da sem preprosto zapisal spremenljivkam v nastavitvah gitlbab:

naslov spojlerjaNastavitev CD-ja prek gitlaba

Samo izpišite vsebino potrdil in ključ prek cat: cat ca.pem. Kopirajte in prilepite v vrednosti spremenljivk.

Napišimo skript za uvajanje prek gitlaba. Uporabljena bo slika 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 # скрипт деплоя тут

Vsebina skripta za uvajanje s komentarji:

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

Glavna težava je bila "izvleči" vsebino potrdil v običajni obliki iz spremenljivk gitlab CI / CD. Nisem mogel ugotoviti, zakaj povezava z oddaljenim gostiteljem ne deluje. Pogledal sem dnevnik sudo journalctl -u docker na gostitelju, prišlo je do napake pri rokovanju. Odločil sem se pogledati, kaj je običajno shranjeno v spremenljivkah, za to lahko vidite cat -A $DOCKER_CERT_PATH/key.pem. Napako smo odpravili z dodajanjem odstranitve znaka kazalke tr -d 'r'.

Poleg tega lahko skriptu po lastni presoji dodate naloge po izdaji. Delujočo različico si lahko ogledate v mojem repozitoriju https://gitlab.com/isqad/gitlab-ci-cd

Vir: www.habr.com

Dodaj komentar