CD instellen via gitlab

Ik heb er ooit aan gedacht om de implementatie van mijn project te automatiseren. gitlab.com is zo vriendelijk om alle tools hiervoor aan te bieden, en natuurlijk besloot ik hiervan te profiteren, het uit te zoeken en een klein implementatiescript te schrijven. In dit artikel deel ik mijn ervaringen met de community.

TL; DR

  1. VPS instellen: root uitschakelen, inloggen met wachtwoord, dockerd installeren, ufw configureren
  2. Genereer certificaten voor server en client docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Schakel dockerd-besturing in via tcp-socket: verwijder de optie -H fd:// uit de docker-configuratie.
  3. Registreer paden naar certificaten in docker.json
  4. Registreer in gitlab-variabelen in de CI/CD-instellingen met de inhoud van de certificaten. Schrijf een script .gitlab-ci.yml voor implementatie.

Ik zal alle voorbeelden van de Debian-distributie laten zien.

Eerste VPS-installatie

U hebt dus bijvoorbeeld een exemplaar gekocht bij DO, het eerste wat u hoeft te doen is uw server beschermen tegen de agressieve buitenwereld. Ik zal niets bewijzen of beweren, ik laat alleen de log /var/log/messages van mijn virtuele server zien:

ScreenshotCD instellen via gitlab

Installeer eerst de ufw-firewall:

apt-get update && apt-get install ufw

Laten we het standaardbeleid inschakelen: blokkeer alle inkomende verbindingen, sta alle uitgaande verbindingen toe:

ufw default deny incoming
ufw default allow outgoing

Belangrijk: vergeet niet de verbinding via ssh toe te staan:

ufw allow OpenSSH

De algemene syntaxis is als volgt: Een verbinding per poort toestaan: ufw allow 12345, waarbij 12345 het poortnummer of de naam van de service is. Weigeren: ufw ontkennen 12345

Schakel de firewall in:

ufw enable

We verlaten de sessie en loggen opnieuw in via ssh.

Voeg een gebruiker toe, wijs hem een ​​wachtwoord toe en voeg hem toe aan de sudo-groep.

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

Vervolgens moet u volgens het plan het inloggen met een wachtwoord uitschakelen. Om dit te doen, kopieert u uw ssh-sleutel naar de server:

ssh-copy-id [email protected]

Het server-IP moet van jou zijn. Probeer nu in te loggen met de gebruiker die u eerder heeft aangemaakt; u hoeft geen wachtwoord meer in te voeren. Wijzig vervolgens in de configuratie-instellingen het volgende:

sudo nano /etc/ssh/sshd_config

wachtwoordaanmelding uitschakelen:

PasswordAuthentication no

Start de sshd-daemon opnieuw:

sudo systemctl reload sshd

Als u of iemand anders nu probeert in te loggen als rootgebruiker, zal dit niet werken.

Installeer vervolgens dockerd, ik zal het proces hier niet beschrijven, aangezien alles al kan worden gewijzigd, volg de link naar de officiΓ«le website en doorloop de stappen van het installeren van docker op uw virtuele machine: https://docs.docker.com/install/linux/docker-ce/debian/

Certificaten genereren

Om de docker-daemon op afstand te besturen, is een gecodeerde TLS-verbinding vereist. Om dit te doen, heeft u een certificaat en een sleutel nodig, die moeten worden gegenereerd en naar uw externe machine moeten worden overgebracht. Volg de stappen in de instructies op de officiΓ«le docker-website: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Alle gegenereerde *.pem-bestanden voor de server, namelijk ca.pem, server.pem, key.pem, moeten in de directory /etc/docker op de server worden geplaatst.

Dockerd instellen

In het docker daemon-startscript verwijderen we de -H df:// optie, deze optie bepaalt op welke host de docker daemon kan worden bestuurd.

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

Vervolgens moet u een instellingenbestand maken, als dit nog niet bestaat, en de opties opgeven:

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

Laten we verbindingen op poort 2376 toestaan:

sudo ufw allow 2376

Laten we dockerd opnieuw opstarten met de nieuwe instellingen:

sudo systemctl daemon-reload && sudo systemctl restart docker

Laten we het controleren:

sudo systemctl status docker

Als alles β€œgroen” is, zijn we van mening dat we Docker met succes op de server hebben geconfigureerd.

Continue levering instellen op gitlab

Om ervoor te zorgen dat de Gitalaba-werker opdrachten kan uitvoeren op een externe Docker-host, is het noodzakelijk om te beslissen hoe en waar de certificaten en de sleutel voor een gecodeerde verbinding met Dockerd moeten worden opgeslagen. Ik heb dit probleem opgelost door simpelweg het volgende toe te voegen aan de variabelen in de gitlbab-instellingen:

SpoilertitelCD instellen via gitlab

Voer gewoon de inhoud van de certificaten en sleutel uit via cat: cat ca.pem. Kopieer en plak in de variabelewaarden.

Laten we een script schrijven voor implementatie via GitLab. De docker-in-docker (dind) afbeelding wordt gebruikt.

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

Inhoud van het implementatiescript met commentaar:

bin/implementeren.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

Het grootste probleem was om de inhoud van de certificaten in een normale vorm uit de gitlab CI/CD-variabelen te β€œhalen”. Ik kon er niet achter komen waarom de verbinding met de externe host niet werkte. Op de host keek ik naar het log sudo journalctl -u docker, er was een fout tijdens de handshake. Ik besloot te kijken naar wat er doorgaans in variabelen wordt opgeslagen; om dit te doen, kun je er als volgt uitzien: cat -A $DOCKER_CERT_PATH/key.pem. Ik heb de fout overwonnen door de verwijdering van het wagenteken tr -d 'r' toe te voegen.

Vervolgens kunt u naar eigen goeddunken taken na de release aan het script toevoegen. Je kunt de werkende versie bekijken in mijn repository https://gitlab.com/isqad/gitlab-ci-cd

Bron: www.habr.com

Voeg een reactie