CD seadistamine läbi gitlab

Mõtlesin kord, kuidas automatiseerida oma projekti juurutamist. gitlab.com pakub selleks kõiki vajalikke tööriistu, ja ma otsustasin seda kasutada, õppides ja kirjutades väikese juurutusskeemi. Artiklis jagan oma kogemust kogukonnaga.

TL;DR

  1. Seadista VPS: lülita välja root, parooliga sisenemine, paigalda dockerd, seadista ufw.
  2. Generaatori sertifikaadid serveri ja kliendi jaoks. docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Luba dockerd haldus TCP soketi kaudu: eemalda -H fd:// valik dokseri konfigureerimisfailist.
  3. Прописать пути до сертификатов в docker.json
  4. Kirjuta gitlabi keskkonnas CI/CD muutujatesse sertifikaatide sisu. Kirjuta .gitlab-ci.yml juurutamiseks skript.

Katan kõik näited Debian'i distributsioonil.

Esialgne VPS seadistamine.

Oletame, et ostsite näiteks instantsi aadressilt DO, esmalt on vajalik kaitsta oma serverit agressiivse välismaailma eest. Ma ei hakka midagi tõestama ega väitma, vaid näitan lihtsalt logi /var/log/messages oma virtuaalsest serverist:

KuvamineCD seadistamine läbi gitlab

Esiteks installime tulemüüre ufw:

apt-get update && apt-get install ufw

Lülitame sisse vaikimisi poliitika: blokeerime kõik sissetulevad ühendused, lubame kõik väljuvad ühendused:

ufw vaikimisi keelata sissetulevad
ufw vaikimisi lubada väljuvad

Oluline: ärge unustage lubada ssh-ühendust:

ufw luba OpenSSH

Üldine süntaks on järgmine: Lubage ühendus pordil: ufw luba 12345, kus 12345 on sadama number või teenuse nimi. Keelake: ufw keelata 12345

Lülitame tulemüüri sisse:

ufw luba

Väljuge sessioonist ja logige uuesti ssh-i sisse.

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

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

Järgmise sammuna tuleb keelata sisselogimine parooliga. Selleks kopeerige oma ssh-võti serverisse:

ssh-copy-id root@10.101.10.28

serveri ip peab olema teie oma. Proovige nüüd logida loodud kasutaja alla, parooli ei pea enam sisestama. Seejärel muudame konfiguratsiooni seadetes järgmist:

sudo nano /etc/ssh/sshd_config

keela sisselogimine parooliga:

PasswordAuthentication no

Käivitame sshd teenuse uuesti:

sudo systemctl reload sshd

Nüüd, kui proovite te või keegi teine root-kasutajana sisse logida, ei õnnestu see.

Seejärel installime dockerd, siinkohal ei hakka ma protsessi kirjeldama, kuna kõik võib juba muutuda, minge ametlikule veebisaidile ja järgige stepide korralikult docker'i installimist oma virtuaalmasinasse: https://docs.docker.com/install/linux/docker-ce/debian/

Sertifikaatide genereerimine

Kaugtöötluseks Docker daemoni juhtimiseks on vajalik krüptitud TLS-ühendus. Selleks on vaja sertifikaati ja võtit, mis tuleb genereerida ja kanda üle teie kaugmasinale. Järgige ametliku docker'i veebisaidi juhistes antud samme: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Kõik genereeritud *.pem failid serveri jaoks, nimelt ca.pem, server.pem, key.pem, peavad olema paigutatud katalooge /etc/docker serveris.

Dockerd seadistamine

Docker daemoni käivitusskriptis eemaldame valiku -H df://, see valik määrab, millisel hostil saab docker daemoni juhtida.

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

Seejärel tuleb luua konfiguratsioonifail, kui see veel ei eksisteeri, ja määrata 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
}

Lubame ühendusi porti 2376 kaudu:

sudo ufw allow 2376

Taaskäivitame dockerd uute seadistustega:

sudo systemctl daemon-reload && sudo systemctl restart docker

Kontrollime:

sudo systemctl status docker

Kui kõik on "roheline", siis peame vajalikuks, et oleme serveris docker'i edukalt seadistanud.

Continuous delivery seadistamine GitLabis

Ettevalmistamisel, et GitLabi töötaja saaks täita käske kaugserveris, on vaja otsustada, kuidas ja kus hoida sertifikaate ja võtmeid krüpteeritud ühenduse jaoks dockerd-iga. Otsustasin selle probleemi lahendada, sisestades selle GitLabi seadetes muutujatesse:

SpoilertitleCD seadistamine läbi gitlab

Lihtsalt kuvage sertifikaatide ja võtme sisu cat käsuga: cat ca.pem. Kopeerige ja kleepige väärtustesse muutujaid.

Kirjutame skripti juurutamiseks läbi GitLabi. Kasutame docker-in-docker (dind) konteinerit.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # kirjutame entrypoint'i ümber, et see töötaks dind'is
  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 # juurutamise skript siin

Juurutamise skripti 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 selles, et «välja tõmmata» gitlab CI/CD muutujatest sertifikaatide sisu normaalses vormis. Ma ei saanud aru, miks kaugserveriga ühendus ei töötanud. Vaatasin serveris logi sudo journalctl -u docker, seal oli viga käepigistuses. Otsustasin uurida, mis üldse muutujatesse salvestatakse, selleks saab vaadata nii: cat -A $DOCKER_CERT_PATH/key.pem. Vea lahendasin, lisades karaktersümboli eemaldamise: tr -d 'r'.

Edasi võib skripti lisada post-release ülesandeid oma äranägemise järgi. Tööversiooniga saate tutvuda minu hoidlas. https://gitlab.com/isqad/gitlab-ci-cd

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster