Postavljanje CD-a preko gitlaba

Jednom sam razmišljao o automatizaciji implementacije svog projekta. gitlab.com ljubazno pruža sve alate za to, i naravno da sam odlučio iskoristiti to, shvatiti to i napisati malu skriptu za implementaciju. U ovom članku dijelim svoje iskustvo sa zajednicom.

TL; DR

  1. Postavite VPS: onemogućite root, prijavite se lozinkom, instalirajte dockerd, konfigurirajte ufw
  2. Generirajte certifikate za poslužitelj i klijent docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Omogućite kontrolu dockerda putem tcp utičnice: uklonite opciju -H fd:// iz konfiguracije dockera.
  3. Registrirajte staze do certifikata u docker.json
  4. Registrirajte se u gitlab varijablama u CI/CD postavkama sa sadržajem certifikata. Napišite skriptu .gitlab-ci.yml za implementaciju.

Pokazat ću sve primjere na Debian distribuciji.

Početno postavljanje VPS-a

Dakle, kupili ste primjerak na primjer na DO, prvo što trebate učiniti je zaštititi svoj poslužitelj od agresivnog vanjskog svijeta. Neću ništa dokazivati ​​niti tvrditi, samo ću pokazati dnevnik /var/log/messages mog virtualnog poslužitelja:

zaslonaPostavljanje CD-a preko gitlaba

Prvo instalirajte ufw vatrozid:

apt-get update && apt-get install ufw

Omogućimo zadanu politiku: blokiraj sve dolazne veze, dopusti sve odlazne veze:

ufw default deny incoming
ufw default allow outgoing

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

ufw allow OpenSSH

Opća sintaksa je sljedeća: Dopusti vezu putem porta: ufw allow 12345, gdje je 12345 broj porta ili naziv usluge. Odbij: ufw odbij 12345

Uključite vatrozid:

ufw enable

Izlazimo iz sesije i ponovno se logiramo 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 biste to učinili, kopirajte svoj ssh ključ na poslužitelj:

ssh-copy-id [email protected]

IP adresa poslužitelja mora biti vaša. Sada se pokušajte prijaviti pomoću korisnika kojeg ste prethodno stvorili; 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

Ponovno pokrenite sshd demon:

sudo systemctl reload sshd

Sada ako se vi ili netko drugi pokuša prijaviti kao root korisnik, to neće raditi.

Zatim instalirajte dockerd, neću opisivati ​​proces ovdje, jer se sve već može promijeniti, slijedite poveznicu na službenu web stranicu i prođite kroz korake instaliranja dockera na vašem virtualnom računalu: https://docs.docker.com/install/linux/docker-ce/debian/

Generiranje certifikata

Za daljinsko upravljanje docker demonom potrebna je šifrirana TLS veza. Da biste to učinili, morate imati certifikat i ključ koji se moraju generirati i prenijeti na vaš udaljeni stroj. Slijedite korake navedene u uputama na službenoj web stranici dockera: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Sve generirane *.pem datoteke za poslužitelj, naime ca.pem, server.pem, key.pem, moraju se smjestiti u /etc/docker direktorij na poslužitelju.

Postavljanje dockerda

U skripti za pokretanje docker daemona uklanjamo opciju -H df://, ova opcija određuje na kojem se hostu docker daemon može kontrolirati.

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

Zatim biste trebali izraditi datoteku postavki, ako već ne postoji, i odrediti 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
}

Dopustimo veze na portu 2376:

sudo ufw allow 2376

Ponovno pokrenimo dockerd s novim postavkama:

sudo systemctl daemon-reload && sudo systemctl restart docker

Provjerimo:

sudo systemctl status docker

Ako je sve “zeleno”, smatramo da smo uspješno konfigurirali docker na poslužitelju.

Postavljanje kontinuirane dostave na gitlabu

Kako bi Gitalaba worker mogao izvršavati naredbe na udaljenom Docker hostu, potrebno je odlučiti kako i gdje pohraniti certifikate i ključ za kriptiranu vezu s Dockerdom. Riješio sam ovaj problem jednostavnim dodavanjem sljedećeg varijablama u postavkama gitlbaba:

Naslov spojleraPostavljanje CD-a preko gitlaba

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

Napišimo skriptu za implementaciju putem GitLaba. Koristit će se docker-in-docker (dind) slika.

.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 shvatiti zašto veza s udaljenim hostom ne radi. Na hostu sam pogledao log sudo journalctl -u docker, došlo je do greške tijekom rukovanja. Odlučio sam pogledati što se općenito pohranjuje u varijablama; da biste to učinili, možete izgledati ovako: cat -A $DOCKER_CERT_PATH/key.pem. Pogrešku sam prevladao dodavanjem uklanjanja znaka reda tr -d 'r'.

Zatim možete dodati zadatke nakon izdavanja u skriptu prema vlastitom nahođenju. Radnu verziju možete vidjeti u mom repozitoriju https://gitlab.com/isqad/gitlab-ci-cd

Izvor: www.habr.com

Dodajte komentar