Ρύθμιση CD μέσω gitlab

Κάποτε σκέφτηκα να αυτοματοποιήσω την ανάπτυξη του έργου μου. Το gitlab.com παρέχει ευγενικά όλα τα εργαλεία για αυτό και φυσικά αποφάσισα να το χρησιμοποιήσω ανακαλύπτοντάς το και γράφοντας ένα μικρό σενάριο ανάπτυξης. Σε αυτό το άρθρο, μοιράζομαι την εμπειρία μου με την κοινότητα.

TL? DR

  1. Ρύθμιση VPS: απενεργοποίηση root, σύνδεση με κωδικό πρόσβασης, εγκατάσταση dockerd, διαμόρφωση ufw
  2. Δημιουργήστε πιστοποιητικά για διακομιστή και πελάτη docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Ενεργοποίηση ελέγχου dockerd μέσω της υποδοχής tcp: αφαιρέστε την επιλογή -H fd:// από τη διαμόρφωση του docker.
  3. Ορίστε διαδρομές για πιστοποιητικά στο docker.json
  4. Εγγραφείτε στις μεταβλητές gitlab στις ρυθμίσεις CI / CD με τα περιεχόμενα των πιστοποιητικών. Γράψτε ένα σενάριο .gitlab-ci.yml για ανάπτυξη.

Θα δείξω όλα τα παραδείγματα σχετικά με τη διανομή του Debian.

Αρχική ρύθμιση VPS

Εδώ αγοράσατε ένα παράδειγμα για παράδειγμα στο DO, το πρώτο πράγμα που πρέπει να κάνετε είναι να προστατέψετε τον διακομιστή σας από τον επιθετικό εξωτερικό κόσμο. Δεν θα αποδείξω ή δεν θα ισχυριστώ τίποτα, απλώς θα δείξω το αρχείο καταγραφής /var/log/messages του εικονικού διακομιστή μου:

ScreenshotΡύθμιση CD μέσω gitlab

Πρώτα, εγκαταστήστε το τείχος προστασίας ufw:

apt-get update && apt-get install ufw

Ενεργοποίηση της προεπιλεγμένης πολιτικής: αποκλεισμός όλων των εισερχόμενων συνδέσεων, επιτρέπονται όλες οι εξερχόμενες συνδέσεις:

ufw default deny incoming
ufw default allow outgoing

Σημαντικό: μην ξεχάσετε να επιτρέψετε τη σύνδεση μέσω ssh:

ufw allow OpenSSH

Η γενική σύνταξη είναι: Να επιτρέπεται η σύνδεση στη θύρα: ufw allow 12345, όπου 12345 είναι ο αριθμός θύρας ή το όνομα της υπηρεσίας. Άρνηση: ufw deny 12345

Ενεργοποίηση τείχους προστασίας:

ufw enable

Βγαίνουμε από τη συνεδρία και συνδέουμε ξανά μέσω ssh.

Προσθέστε έναν χρήστη, εκχωρήστε του έναν κωδικό πρόσβασης και προσθέστε τον στην ομάδα sudo.

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

Στη συνέχεια, σύμφωνα με το σχέδιο, θα πρέπει να απενεργοποιήσετε τη σύνδεση με κωδικό πρόσβασης. για να το κάνετε αυτό, αντιγράψτε το κλειδί ssh στον διακομιστή:

ssh-copy-id [email protected]

Η ip του διακομιστή πρέπει να είναι δική σας. Τώρα προσπαθήστε να συνδεθείτε κάτω από τον χρήστη που δημιουργήθηκε νωρίτερα, δεν χρειάζεται πλέον να εισάγετε κωδικό πρόσβασης. Στη συνέχεια, στις ρυθμίσεις διαμόρφωσης, αλλάξτε τα εξής:

sudo nano /etc/ssh/sshd_config

απενεργοποιήστε τη σύνδεση με κωδικό πρόσβασης:

PasswordAuthentication no

Επανεκκινήστε τον δαίμονα sshd:

sudo systemctl reload sshd

Τώρα, εάν εσείς ή κάποιος άλλος προσπαθήσετε να συνδεθείτε ως root, θα αποτύχει.

Στη συνέχεια, εγκαθιστούμε το dockerd, δεν θα περιγράψω τη διαδικασία εδώ, καθώς όλα μπορούν ήδη να αλλάξουν, ακολουθήστε τον σύνδεσμο στον επίσημο ιστότοπο και ακολουθήστε τα βήματα εγκατάστασης του docker στην εικονική σας μηχανή: https://docs.docker.com/install/linux/docker-ce/debian/

Δημιουργία πιστοποιητικού

Για τον απομακρυσμένο έλεγχο του docker daemon, απαιτείται μια κρυπτογραφημένη σύνδεση TLS. Για να το κάνετε αυτό, πρέπει να έχετε ένα πιστοποιητικό και ένα κλειδί που πρέπει να δημιουργήσετε και να μεταφέρετε στο απομακρυσμένο μηχάνημά σας. Ακολουθήστε τα βήματα που δίνονται στις οδηγίες στον επίσημο ιστότοπο του docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Όλα τα αρχεία *.pem που δημιουργούνται για τον διακομιστή, συγκεκριμένα ca.pem, server.pem, key.pem, θα πρέπει να τοποθετηθούν στον κατάλογο /etc/docker του διακομιστή.

εγκατάσταση αποβάθρας

Στο σενάριο εκκίνησης docker daemon, καταργήστε την επιλογή -H df://, αυτή η επιλογή λέει σε ποιον κεντρικό υπολογιστή μπορεί να ελεγχθεί ο δαίμονας docker.

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

Στη συνέχεια, δημιουργήστε ένα αρχείο ρυθμίσεων εάν δεν υπάρχει ήδη και ορίστε τις επιλογές:

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

Επιτρέπονται οι συνδέσεις στη θύρα 2376:

sudo ufw allow 2376

Επανεκκινήστε το dockerd με νέες ρυθμίσεις:

sudo systemctl daemon-reload && sudo systemctl restart docker

Ας ελέγξουμε:

sudo systemctl status docker

Εάν όλα είναι πράσινα, τότε θεωρούμε ότι έχουμε ρυθμίσει με επιτυχία το docker στον διακομιστή.

Ρύθμιση συνεχούς παράδοσης στο gitlab

Προκειμένου ο εργαζόμενος του gitalab να μπορεί να εκτελεί εντολές σε έναν απομακρυσμένο κεντρικό υπολογιστή docker, πρέπει να αποφασίσετε πώς και πού θα αποθηκεύσετε τα πιστοποιητικά και ένα κλειδί για μια κρυπτογραφημένη σύνδεση στο dockerd. Έλυσα αυτό το πρόβλημα γράφοντας απλώς στις μεταβλητές στις ρυθμίσεις του gitlbab:

τίτλος σπόιλερΡύθμιση CD μέσω gitlab

Απλώς εξάγετε τα περιεχόμενα των πιστοποιητικών και το κλειδί μέσω cat: cat ca.pem. Αντιγράψτε και επικολλήστε σε μεταβλητές τιμές.

Ας γράψουμε ένα σενάριο για ανάπτυξη μέσω gitlab. Θα χρησιμοποιηθεί η εικόνα 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 # скрипт деплоя тут

Τα περιεχόμενα του σεναρίου ανάπτυξης με σχόλια:

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

Το κύριο πρόβλημα ήταν να «βγάλουμε» τα περιεχόμενα των πιστοποιητικών στην κανονική μορφή από τις μεταβλητές gitlab CI / CD. Δεν μπορούσα να καταλάβω γιατί δεν λειτούργησε η σύνδεση με τον απομακρυσμένο κεντρικό υπολογιστή. Κοίταξα το αρχείο καταγραφής sudo journalctl -u docker στον κεντρικό υπολογιστή, υπάρχει ένα σφάλμα με τη χειραψία. Αποφάσισα να εξετάσω τι είναι γενικά αποθηκευμένο σε μεταβλητές, για αυτό μπορείτε να δείτε το cat -A $DOCKER_CERT_PATH/key.pem. Ξεπέρασε το σφάλμα προσθέτοντας την αφαίρεση του χαρακτήρα caret tr -d 'r'.

Επιπλέον, μπορείτε να προσθέσετε εργασίες μετά την κυκλοφορία στο σενάριο κατά την κρίση σας. Μπορείτε να δείτε την λειτουργική έκδοση στο αποθετήριο μου https://gitlab.com/isqad/gitlab-ci-cd

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο