CD opset fia gitlab

Ik haw ienris tocht oer it automatisearjen fan de ynset fan myn projekt. gitlab.com jout freonlik alle ark foar dit, en fansels ik besletten om te profitearjen fan it, útfine en it skriuwen fan in lyts ynset skript. Yn dit artikel diel ik myn ûnderfining mei de mienskip.

TL; DR

  1. VPS ynstelle: root útskeakelje, oanmelde mei wachtwurd, dockerd ynstallearje, ufw konfigurearje
  2. Generearje sertifikaten foar server en client docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Dockerd-kontrôle ynskeakelje fia tcp-socket: ferwiderje de -H fd: //-opsje út de docker-konfiguraasje.
  3. Registrearje paden nei sertifikaten yn docker.json
  4. Registrearje yn gitlab fariabelen yn de CI / CD ynstellings mei de ynhâld fan de sertifikaten. Skriuw in skript .gitlab-ci.yml foar ynset.

Ik sil alle foarbylden sjen litte oer de Debian-distribúsje.

Inisjele VPS opset

Sa kocht jo in eksimplaar bygelyks by DO, it earste ding dat jo moatte dwaan is jo tsjinner te beskermjen fan 'e agressive bûtenwrâld. Ik sil neat bewize of beweare, ik sil gewoan it log /var/log/berjochten fan myn firtuele server sjen litte:

SkermprintCD opset fia gitlab

Ynstallearje earst de ufw-firewall:

apt-get update && apt-get install ufw

Lit ús it standertbelied ynskeakelje: alle ynkommende ferbiningen blokkearje, alle útgeande ferbiningen tastean:

ufw default deny incoming
ufw default allow outgoing

Wichtich: ferjit net de ferbining fia ssh ta te stean:

ufw allow OpenSSH

De algemiene syntaksis is as folget: Tastean in ferbining troch poarte: ufw tastean 12345, wêrby't 12345 is it poartenûmer of de namme fan 'e tsjinst. Deny: ufw deny 12345

De firewall oansette:

ufw enable

Wy ferlitte de sesje en logje opnij yn fia ssh.

Foegje in brûker ta, jou him in wachtwurd ta en foegje him ta oan de sudo-groep.

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

Folgjende, neffens it plan, moatte jo wachtwurdoanmelding útskeakelje. om dit te dwaan, kopiearje jo ssh-kaai nei de tsjinner:

ssh-copy-id [email protected]

De server-ip moat fan jo wêze. Besykje no oan te melden mei de brûker dy't jo earder makke hawwe; jo hoege gjin wachtwurd mear yn te fieren. Folgjende, yn 'e konfiguraasje ynstellings, feroarje de folgjende:

sudo nano /etc/ssh/sshd_config

oanmelde wachtwurd útskeakelje:

PasswordAuthentication no

Start de sshd-daemon opnij:

sudo systemctl reload sshd

No as jo of immen oars besiket yn te loggen as de root-brûker, sil it net wurkje.

Ynstallearje dêrnei dockerd, ik sil it proses hjir net beskriuwe, om't alles al feroare kin, folgje de keppeling nei de offisjele webside en gean troch de stappen fan it ynstallearjen fan docker op jo firtuele masine: https://docs.docker.com/install/linux/docker-ce/debian/

It generearjen fan sertifikaten

Om de docker-daemon op ôfstân te kontrolearjen, is in fersifere TLS-ferbining nedich. Om dit te dwaan, moatte jo in sertifikaat en in kaai hawwe, dy't moatte wurde oanmakke en oerbrocht nei jo masine op ôfstân. Folgje de stappen jûn yn 'e ynstruksjes op' e offisjele docker-webside: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Alle oanmakke *.pem-bestannen foar de tsjinner, nammentlik ca.pem, server.pem, key.pem, moatte pleatst wurde yn de map /etc/docker op de tsjinner.

Dockerd ynstelle

Yn it startskript fan docker-daemon ferwiderje wy de -H df://-opsje, dizze opsje bepaalt op hokker host de docker-daemon kontrolearre wurde kin.

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

Dan moatte jo in ynstellingsbestân oanmeitsje, as it net al bestiet, en de opsjes spesifisearje:

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

Litte wy ferbiningen tastean op poarte 2376:

sudo ufw allow 2376

Litte wy dockerd opnij starte mei de nije ynstellings:

sudo systemctl daemon-reload && sudo systemctl restart docker

Litte wy kontrolearje:

sudo systemctl status docker

As alles "grien" is, beskôgje wy dat wy docker mei súkses hawwe konfigureare op 'e tsjinner.

Trochrinnende levering ynstelle op gitlab

Om de Gitalaba-arbeider kommando's út te fieren op in Docker-host op ôfstân, is it nedich om te besluten hoe en wêr't sertifikaten en de kaai foar in fersifere ferbining mei Dockerd opslaan wurde. Ik haw dit probleem oplost troch gewoan it folgjende ta te foegjen oan 'e fariabelen yn' e gitlbab-ynstellingen:

spoiler titelCD opset fia gitlab

Utfiere gewoan de ynhâld fan 'e sertifikaten en kaai fia kat: cat ca.pem. Kopiearje en plakke yn 'e fariabele wearden.

Litte wy in skript skriuwe foar ynset fia GitLab. De docker-in-docker (dind) ôfbylding sil brûkt wurde.

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

Ynhâld fan it ynsetskript mei opmerkingen:

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

It wichtichste probleem wie om de ynhâld fan 'e sertifikaten yn in normale foarm te "lûken" fan 'e gitlab CI / CD fariabelen. Ik koe net útfine wêrom't de ferbining mei de host op ôfstân net wurke. Op de host seach ik nei it log sudo journalctl -u docker, d'r wie in flater by de handshake. Ik besleat om te sjen nei wat yn 't algemien yn fariabelen opslein is; om dit te dwaan kinne jo der sa útsjen: cat -A $DOCKER_CERT_PATH/key.pem. Ik oerwûn de flater troch it tafoegjen fan it fuortheljen fan de koets karakter tr -d 'r'.

Folgjende kinne jo nei jo goedtinken taheakje post-release taken oan it skript. Jo kinne de wurkferzje besjen yn myn repository https://gitlab.com/isqad/gitlab-ci-cd

Boarne: www.habr.com

Add a comment