Mete kanpe CD atravè gitlab

Yon fwa mwen te panse sou otomatize deplwaman pwojè mwen an. gitlab.com dous bay tout zouti pou sa a, e nan kou mwen deside pran avantaj de li, n ap kalkile li epi ekri yon ti script deplwaman. Nan atik sa a mwen pataje eksperyans mwen ak kominote a.

TL; DR

  1. Mete kanpe VPS: enfim rasin, konekte ak modpas, enstale dockerd, konfigirasyon ufw
  2. Jenere sètifika pou sèvè ak kliyan docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Pèmèt kontwòl dockerd atravè priz tcp: retire opsyon -H fd:// nan konfigirasyon docker la.
  3. Anrejistre chemen sètifika yo nan docker.json
  4. Enskri nan varyab gitlab nan anviwònman CI/CD ak sa ki nan sètifika yo. Ekri yon script .gitlab-ci.yml pou deplwaman.

Mwen pral montre tout egzanp sou distribisyon Debian.

Premye konfigirasyon VPS

Se konsa, ou te achte yon egzanp pou egzanp nan DO, Premye bagay ou bezwen fè se pwoteje sèvè ou kont agresif mond deyò a. Mwen pa pral pwouve oswa afime anyen, mwen pral jis montre log /var/log/messages nan sèvè vityèl mwen an:

EkranMete kanpe CD atravè gitlab

Premyèman, enstale firewall ufw la:

apt-get update && apt-get install ufw

Ann pèmèt règleman defo a: bloke tout koneksyon k ap fèk ap rantre, pèmèt tout koneksyon sortan yo:

ufw default deny incoming
ufw default allow outgoing

Enpòtan: pa bliye pèmèt koneksyon an atravè ssh:

ufw allow OpenSSH

Sentaks jeneral la se jan sa a: Pèmèt yon koneksyon pa pò: ufw pèmèt 12345, kote 12345 se nimewo pò a oswa non sèvis la. Deny: ufw deny 12345

Limen firewall la:

ufw enable

Nou soti nan sesyon an epi konekte ankò via ssh.

Ajoute yon itilizatè, bay li yon modpas, epi ajoute li nan gwoup sudo a.

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

Apre sa, dapre plan an, ou ta dwe enfim login modpas. pou fè sa, kopye kle ssh ou sou sèvè a:

ssh-copy-id [email protected]

IP sèvè a dwe pou ou. Koulye a, eseye konekte ak itilizatè ou te kreye pi bonè a; ou pa bezwen antre yon modpas ankò. Apre sa, nan paramèt konfigirasyon yo, chanje bagay sa yo:

sudo nano /etc/ssh/sshd_config

enfim login modpas:

PasswordAuthentication no

Rekòmanse demon sshd la:

sudo systemctl reload sshd

Koulye a, si oumenm oswa yon lòt moun eseye konekte kòm itilizatè rasin lan, li pa pral travay.

Apre sa, enstale dockerd, mwen pa pral dekri pwosesis la isit la, paske tout bagay ka deja chanje, swiv lyen ki mennen nan sit entènèt ofisyèl la epi ale nan etap sa yo enstale Docker sou machin vityèl ou: https://docs.docker.com/install/linux/docker-ce/debian/

Jenere sètifika

Pou kontwole daemon Docker a adistans, yon koneksyon TLS chiffres obligatwa. Pou fè sa, ou bezwen gen yon sètifika ak yon kle, ki dwe pwodwi ak transfere nan machin aleka ou. Swiv etap yo bay nan enstriksyon yo sou sit entènèt ofisyèl Docker la: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Tout fichye *.pem ki te pwodwi pou sèvè a, sètadi ca.pem, server.pem, key.pem, dwe mete nan anyè /etc/docker sou sèvè a.

Mete kanpe dockerd

Nan script lansman docker daemon, nou retire opsyon -H df://, opsyon sa a detèmine sou ki lame demon an ka kontwole.

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

Apre sa, ou ta dwe kreye yon dosye anviwònman, si li pa deja egziste, epi presize opsyon yo:

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

Ann pèmèt koneksyon sou pò 2376:

sudo ufw allow 2376

Ann rekòmanse dockerd ak nouvo paramèt yo:

sudo systemctl daemon-reload && sudo systemctl restart docker

Ann tcheke:

sudo systemctl status docker

Si tout bagay se "vèt", Lè sa a, nou konsidere ke nou te avèk siksè configuré Docker sou sèvè a.

Mete kanpe livrezon kontinyèl sou gitlab

Nan lòd pou travayè Gitalaba a kapab egzekite kòmandman sou yon lame Docker aleka, li nesesè deside ki jan ak ki kote yo estoke sètifika ak kle a pou yon koneksyon chiffres ak Dockerd. Mwen rezoud pwoblèm sa a pa senpleman ajoute sa ki annapre yo nan varyab yo nan anviwònman yo gitlbab:

Tit spoilerMete kanpe CD atravè gitlab

Jis soti sa ki nan sètifika yo ak kle atravè chat: cat ca.pem. Kopi epi kole nan valè varyab yo.

Ann ekri yon script pou deplwaman atravè GitLab. Y ap itilize imaj 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 # скрипт деплоя тут

Sa ki nan script deplwaman an ak kòmantè:

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

Pwoblèm prensipal la se te "rale" sa ki nan sètifika yo nan yon fòm nòmal soti nan varyab gitlab CI/CD yo. Mwen pa t 'kapab konnen poukisa koneksyon an ak lame a aleka pa t' ap travay. Sou lame a mwen gade log sudo journalctl -u docker, te gen yon erè pandan lanmen an. Mwen deside gade sa ki an jeneral ki estoke nan varyab yo; pou fè sa, ou ka gade tankou sa a: chat -A $DOCKER_CERT_PATH/key.pem. Mwen simonte erè a lè mwen ajoute retire karaktè cha la tr -d 'r'.

Apre sa, ou ka ajoute travay apre lage nan script la nan diskresyon ou. Ou ka wè vèsyon k ap travay la nan depo mwen an https://gitlab.com/isqad/gitlab-ci-cd

Sous: www.habr.com

Add nouvo kòmantè