Κάποτε σκέφτηκα να αυτοματοποιήσω την ανάπτυξη του έργου μου. Το gitlab.com παρέχει ευγενικά όλα τα εργαλεία για αυτό και φυσικά αποφάσισα να το χρησιμοποιήσω ανακαλύπτοντάς το και γράφοντας ένα μικρό σενάριο ανάπτυξης. Σε αυτό το άρθρο, μοιράζομαι την εμπειρία μου με την κοινότητα.
Ορίστε διαδρομές για πιστοποιητικά στο docker.json
Εγγραφείτε στις μεταβλητές gitlab στις ρυθμίσεις CI / CD με τα περιεχόμενα των πιστοποιητικών. Γράψτε ένα σενάριο .gitlab-ci.yml για ανάπτυξη.
Θα δείξω όλα τα παραδείγματα σχετικά με τη διανομή του Debian.
Αρχική ρύθμιση VPS
Εδώ αγοράσατε ένα παράδειγμα για παράδειγμα στο DO, το πρώτο πράγμα που πρέπει να κάνετε είναι να προστατέψετε τον διακομιστή σας από τον επιθετικό εξωτερικό κόσμο. Δεν θα αποδείξω ή δεν θα ισχυριστώ τίποτα, απλώς θα δείξω το αρχείο καταγραφής /var/log/messages του εικονικού διακομιστή μου:
Screenshot
Πρώτα, εγκαταστήστε το τείχος προστασίας ufw:
apt-get update && apt-get install ufw
Ενεργοποίηση της προεπιλεγμένης πολιτικής: αποκλεισμός όλων των εισερχόμενων συνδέσεων, επιτρέπονται όλες οι εξερχόμενες συνδέσεις:
Σημαντικό: μην ξεχάσετε να επιτρέψετε τη σύνδεση μέσω ssh:
ufw allow OpenSSH
Η γενική σύνταξη είναι: Να επιτρέπεται η σύνδεση στη θύρα: ufw allow 12345, όπου 12345 είναι ο αριθμός θύρας ή το όνομα της υπηρεσίας. Άρνηση: ufw deny 12345
Ενεργοποίηση τείχους προστασίας:
ufw enable
Βγαίνουμε από τη συνεδρία και συνδέουμε ξανά μέσω ssh.
Προσθέστε έναν χρήστη, εκχωρήστε του έναν κωδικό πρόσβασης και προσθέστε τον στην ομάδα sudo.
Στη συνέχεια, σύμφωνα με το σχέδιο, θα πρέπει να απενεργοποιήσετε τη σύνδεση με κωδικό πρόσβασης. για να το κάνετε αυτό, αντιγράψτε το κλειδί ssh στον διακομιστή:
Η 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
Στη συνέχεια, δημιουργήστε ένα αρχείο ρυθμίσεων εάν δεν υπάρχει ήδη και ορίστε τις επιλογές:
Εάν όλα είναι πράσινα, τότε θεωρούμε ότι έχουμε ρυθμίσει με επιτυχία το docker στον διακομιστή.
Ρύθμιση συνεχούς παράδοσης στο gitlab
Προκειμένου ο εργαζόμενος του gitalab να μπορεί να εκτελεί εντολές σε έναν απομακρυσμένο κεντρικό υπολογιστή docker, πρέπει να αποφασίσετε πώς και πού θα αποθηκεύσετε τα πιστοποιητικά και ένα κλειδί για μια κρυπτογραφημένη σύνδεση στο dockerd. Έλυσα αυτό το πρόβλημα γράφοντας απλώς στις μεταβλητές στις ρυθμίσεις του gitlbab:
τίτλος σπόιλερ
Απλώς εξάγετε τα περιεχόμενα των πιστοποιητικών και το κλειδί μέσω cat: cat ca.pem. Αντιγράψτε και επικολλήστε σε μεταβλητές τιμές.
Ας γράψουμε ένα σενάριο για ανάπτυξη μέσω gitlab. Θα χρησιμοποιηθεί η εικόνα docker-in-docker (dind).
#!/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