Podešavanje CD-a preko gitlaba

Jednom sam razmišljao o automatizaciji implementacije mog projekta. gitlab.com ljubazno pruža sve alate za ovo, i naravno, odlučio sam da ga koristim tako što sam ga smislio i napisao malu skriptu za implementaciju. U ovom članku dijelim svoje iskustvo sa zajednicom.

TL; DR

  1. Podesite VPS: onemogućite root, lozinku za prijavu, instalirajte dockerd, konfigurišite ufw
  2. Generirajte certifikate za server i klijenta docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Omogućite kontrolu dockerda preko tcp utičnice: uklonite opciju -H fd:// iz docker konfiguracije.
  3. Postavite putanje do certifikata u docker.json
  4. Registrirajte se u gitlab varijable u CI/CD postavkama sa sadržajem certifikata. Napišite .gitlab-ci.yml skriptu za implementaciju.

Pokazat ću sve primjere o Debian distribuciji.

Početno podešavanje VPS-a

Ovdje ste kupili primjer na primjer na DO, prva stvar koju treba učiniti je da zaštitite svoj server od agresivnog vanjskog svijeta. Neću ništa dokazivati ​​niti tvrditi, samo ću pokazati /var/log/messages dnevnik mog virtuelnog servera:

Snimak ekranaPodešavanje CD-a preko gitlaba

Prvo instalirajte ufw firewall:

apt-get update && apt-get install ufw

Omogućite zadanu politiku: blokirajte sve dolazne veze, dozvolite sve odlazne veze:

ufw default deny incoming
ufw default allow outgoing

Važno: ne zaboravite dozvoliti vezu putem ssh-a:

ufw allow OpenSSH

Opšta sintaksa je: Dozvoli vezu na portu: ufw dozvoli 12345, gdje je 12345 broj porta ili ime usluge. Deny: ufw deny 12345

Uključite firewall:

ufw enable

Izlazimo iz sesije i ponovo se prijavljujemo preko ssh-a.

Dodajte korisnika, dodijelite mu lozinku i dodajte ga u sudo grupu.

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

Zatim, prema planu, trebali biste onemogućiti prijavu lozinkom. da to uradite, kopirajte svoj ssh ključ na server:

ssh-copy-id [email protected]

IP servera mora biti vaš. Sada se pokušajte prijaviti pod prethodno kreiranim korisnikom, više ne morate unositi lozinku. Zatim, u postavkama konfiguracije, promijenite sljedeće:

sudo nano /etc/ssh/sshd_config

onemogući prijavu lozinkom:

PasswordAuthentication no

Ponovo pokrenite sshd demon:

sudo systemctl reload sshd

Sada ako se vi ili neko drugi pokuša prijaviti kao root, neće uspjeti.

Zatim instaliramo dockerd, ovdje neću opisivati ​​proces, jer se sve već može promijeniti, slijedite link na službenu web stranicu i prođite kroz korake instaliranja dockera na vašu virtualnu mašinu: https://docs.docker.com/install/linux/docker-ce/debian/

Generisanje sertifikata

Za daljinsko upravljanje docker demonom potrebna je šifrirana TLS veza. Da biste to učinili, morate imati certifikat i ključ koji trebate generirati i prenijeti na udaljenu mašinu. Slijedite korake date u uputama na službenoj web stranici docker-a: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Sve generisane *.pem datoteke za server, odnosno ca.pem, server.pem, key.pem, treba da budu smeštene u /etc/docker direktorijum na serveru.

docker setup

U skripti za pokretanje docker demona, uklonite opciju -H df://, ova opcija govori na kojem hostu se može kontrolirati docker demon.

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

Zatim kreirajte datoteku postavki ako već ne postoji i postavite opcije:

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

Dozvolite veze na portu 2376:

sudo ufw allow 2376

Ponovo pokrenite dockerd s novim postavkama:

sudo systemctl daemon-reload && sudo systemctl restart docker

provjerimo:

sudo systemctl status docker

Ako je sve zeleno, onda smatramo da smo uspješno konfigurirali docker na serveru.

Postavljanje kontinuirane isporuke na gitlab-u

Da bi gitalab radnik mogao da izvršava komande na udaljenom docker hostu, potrebno je da odlučite kako i gde da pohranite sertifikate i ključ za šifrovanu vezu sa dockerd-om. Rešio sam ovaj problem jednostavnim pisanjem u varijable u postavkama gitlbaba:

naslov spojleraPodešavanje CD-a preko gitlaba

Samo ispišite sadržaj certifikata i ključa preko cat: cat ca.pem. Kopirajte i zalijepite u varijabilne vrijednosti.

Hajde da napišemo skriptu za implementaciju kroz gitlab. Koristit će se 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 # скрипт деплоя тут

Sadržaj skripte za implementaciju s komentarima:

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

Glavni problem je bio "izvući" sadržaj certifikata u normalnom obliku iz gitlab CI/CD varijabli. Nisam mogao da shvatim zašto veza sa udaljenim hostom ne radi. Pogledao sam sudo journalctl -u docker log na hostu, postoji greška sa rukovanjem. Odlučio sam pogledati šta je općenito pohranjeno u varijablama, za ovo možete vidjeti cat -A $DOCKER_CERT_PATH/key.pem. Greška je prevaziđena dodavanjem uklanjanja znaka za umetanje tr -d 'r'.

Nadalje, možete dodati zadatke nakon objavljivanja skripti po svom nahođenju. Radnu verziju možete pogledati u mom spremištu https://gitlab.com/isqad/gitlab-ci-cd

izvor: www.habr.com

Dodajte komentar