Pag-setup sa CD pinaagi sa gitlab

Kausa naghunahuna ko bahin sa pag-automate sa pag-deploy sa akong proyekto. Ang gitlab.com maluloton nga naghatag sa tanan nga mga himan alang niini, ug siyempre nakahukom ko nga gamiton kini pinaagi sa paghunahuna niini ug pagsulat og gamay nga script sa pag-deploy. Niini nga artikulo, akong gipaambit ang akong kasinatian sa komunidad.

TL; DR

  1. I-set up ang VPS: i-disable ang gamut, password login, i-install ang dockerd, i-configure ang ufw
  2. Paghimo mga sertipiko alang sa server ug kliyente docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl I-enable ang dockerd control pinaagi sa tcp socket: kuhaa ang -H fd:// option gikan sa docker config.
  3. Ibutang ang mga agianan sa mga sertipiko sa docker.json
  4. Pagrehistro sa gitlab nga mga variable sa mga setting sa CI / CD nga adunay sulud sa mga sertipiko. Pagsulat og .gitlab-ci.yml nga script para sa deployment.

Ipakita nako ang tanan nga mga pananglitan sa pag-apod-apod sa Debian.

Inisyal nga pag-setup sa VPS

Dinhi nagpalit ka usa ka pananglitan pananglitan sa DO, ang unang butang nga buhaton mao ang pagpanalipod sa imong server gikan sa agresibo sa gawas sa kalibutan. Dili ko pamatud-an o ipahayag ang bisan unsang butang, ipakita ko lang ang /var/log/messages log sa akong virtual server:

ScreenshotPag-setup sa CD pinaagi sa gitlab

Una, i-install ang ufw firewall:

apt-get update && apt-get install ufw

I-enable ang default policy: babagan ang tanang umaabot nga koneksyon, tugoti ang tanang outgoing connections:

ufw default deny incoming
ufw default allow outgoing

Importante: ayaw kalimot sa pagtugot sa koneksyon pinaagi sa ssh:

ufw allow OpenSSH

Ang kinatibuk-ang syntax mao ang: Tugoti ang koneksyon sa pantalan: ufw gitugotan ang 12345, diin ang 12345 mao ang numero sa pantalan o ngalan sa serbisyo. Deny: ufw deny 12345

I-on ang firewall:

ufw enable

Mogawas kami sa sesyon ug mag-log in pag-usab pinaagi sa ssh.

Pagdugang og user, paghatag kaniya og password, ug idugang siya sa sudo nga grupo.

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

Sunod, sumala sa plano, kinahanglan nimong i-disable ang pag-login sa password. aron mahimo kini, kopyaha ang imong ssh key sa server:

ssh-copy-id [email protected]

Ang ip sa server kinahanglang imoha. Karon sulayi ang pag-log in sa ilawom sa user nga gihimo sa sayo pa, dili na nimo kinahanglan nga magsulod ug password. Sunod, sa mga setting sa pag-configure, usba ang mosunod:

sudo nano /etc/ssh/sshd_config

disable password login:

PasswordAuthentication no

I-restart ang sshd daemon:

sudo systemctl reload sshd

Karon kung ikaw o ang uban mosulay sa pag-log in ingon nga gamut, kini mapakyas.

Sunod, gi-install namon ang dockerd, dili nako ihulagway ang proseso dinhi, tungod kay ang tanan mahimo nang mabag-o, sunda ang link sa opisyal nga website ug pag-agi sa mga lakang sa pag-install sa docker sa imong virtual machine: https://docs.docker.com/install/linux/docker-ce/debian/

Pagmugna og Sertipiko

Aron makontrol ang docker daemon sa layo, gikinahanglan ang usa ka naka-encrypt nga koneksyon sa TLS. Aron mahimo kini, kinahanglan nimo nga adunay usa ka sertipiko ug usa ka yawe nga kinahanglan nimo nga makamugna ug ibalhin sa imong hilit nga makina. Sunda ang mga lakang nga gihatag sa mga instruksyon sa opisyal nga docker website: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Ang tanang namugna nga *.pem files para sa server, nga mao ang ca.pem, server.pem, key.pem, kinahanglang ibutang sa /etc/docker directory sa server.

setup sa docker

Sa docker daemon startup script, kuhaa ang -H df:// nga kapilian, kini nga opsyon nagsulti kung asa nga host ang docker daemon mahimong kontrolado.

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

Sunod, paghimo og setting file kung wala pa kini ug itakda ang mga kapilian:

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

Tugoti ang mga koneksyon sa port 2376:

sudo ufw allow 2376

I-restart ang dockerd gamit ang bag-ong mga setting:

sudo systemctl daemon-reload && sudo systemctl restart docker

Atong susihon:

sudo systemctl status docker

Kung berde ang tanan, nan giisip namon nga malampuson namon nga na-configure ang docker sa server.

Pag-set up sa padayon nga pagpadala sa gitlab

Aron ang gitalab nga trabahante makahimo sa pagpatuman sa mga sugo sa usa ka hilit nga docker host, kinahanglan nimo nga magdesisyon kung giunsa ug asa ibutang ang mga sertipiko ug usa ka yawe alang sa usa ka naka-encrypt nga koneksyon sa dockerd. Gisulbad nako kini nga problema pinaagi lamang sa pagsulat sa mga variable sa gitlbab settings:

titulo sa spoilerPag-setup sa CD pinaagi sa gitlab

Ipagawas lang ang sulod sa mga sertipiko ug yawe pinaagi sa iring: cat ca.pem. Kopyaha ug idikit sa mga variable value.

Magsulat kita og script para sa deployment pinaagi sa gitlab. Ang docker-in-docker (dind) nga imahe gamiton.

.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 # скрипт дСплоя Ρ‚ΡƒΡ‚

Ang sulod sa deployment script nga adunay mga komento:

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

Ang nag-unang problema mao ang "pagbira" sa sulod sa mga sertipiko sa normal nga porma gikan sa gitlab CI / CD variables. Dili nako mahibal-an kung ngano nga ang koneksyon sa hilit nga host wala molihok. Gitan-aw nako ang sudo journalctl -u docker log sa host, adunay sayup sa paglamano. Nakahukom ko nga tan-awon kung unsa ang kasagarang gitipigan sa mga variable, tungod niini imong makita ang cat -A $DOCKER_CERT_PATH/key.pem. Nabuntog ang sayup pinaagi sa pagdugang sa pagtangtang sa karakter nga caret tr -d 'r'.

Dugang pa, mahimo nimong idugang ang mga buluhaton sa post-release sa script sa imong pagbuot. Mahimo nimong susihon ang nagtrabaho nga bersyon sa akong repository https://gitlab.com/isqad/gitlab-ci-cd

Source: www.habr.com

Idugang sa usa ka comment