Mən bir dəfə layihəmin yerləşdirilməsinin avtomatlaşdırılması haqqında düşündüm. gitlab.com lütfən bunun üçün bütün alətləri təqdim edir və əlbəttə ki, mən onu başa düşərək və kiçik bir yerləşdirmə skripti yazaraq istifadə etmək qərarına gəldim. Bu yazıda mən öz təcrübəmi cəmiyyətlə bölüşürəm.
Sertifikatların məzmunu ilə CI / CD parametrlərində gitlab dəyişənlərində qeydiyyatdan keçin. Yerləşdirmə üçün .gitlab-ci.yml skripti yazın.
Debian paylanması ilə bağlı bütün nümunələri göstərəcəyəm.
İlkin VPS quraşdırması
Burada misal üçün bir nümunə aldınız DO, ediləcək ilk şey serverinizi aqressiv xarici dünyadan qorumaqdır. Mən heç nə sübut etməyəcəyəm və ya təsdiq etməyəcəyəm, sadəcə virtual serverimin /var/log/messages jurnalını göstərəcəyəm:
Screenshot
Əvvəlcə ufw firewallını quraşdırın:
apt-get update && apt-get install ufw
Defolt siyasəti aktivləşdirin: bütün daxil olan əlaqələri bloklayın, bütün gedən bağlantılara icazə verin:
Serverin IP-si sizin olmalıdır. İndi əvvəllər yaradılmış istifadəçinin altında daxil olmağa çalışın, artıq parol daxil etməyə ehtiyac yoxdur. Sonra, konfiqurasiya parametrlərində aşağıdakıları dəyişdirin:
sudo nano /etc/ssh/sshd_config
parol girişini deaktiv edin:
PasswordAuthentication no
Sshd demonunu yenidən başladın:
sudo systemctl reload sshd
İndi siz və ya başqası root olaraq daxil olmağa çalışsanız, uğursuz olacaq.
Sonra, biz dockerd quraşdırırıq, prosesi burada təsvir etməyəcəyəm, çünki hər şey artıq dəyişdirilə bilər, rəsmi veb-saytın linkinə daxil olun və virtual maşınınızda docker quraşdırma addımlarını keçin: https://docs.docker.com/install/linux/docker-ce/debian/
Sertifikatın yaradılması
Docker demonunu uzaqdan idarə etmək üçün şifrəli TLS bağlantısı tələb olunur. Bunu etmək üçün, yaratmaq və uzaq maşınınıza köçürmək üçün lazım olan sertifikat və açarınız olmalıdır. Rəsmi docker saytındakı təlimatlarda verilən addımları yerinə yetirin: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Server üçün yaradılan bütün *.pem faylları, yəni ca.pem, server.pem, key.pem serverdəki /etc/docker kataloquna yerləşdirilməlidir.
docker quraşdırma
Docker daemon başlanğıc skriptində -H df:// seçimini silin, bu seçim docker demonunun hansı hostda idarə oluna biləcəyini bildirir.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Sonra, artıq mövcud deyilsə, parametrlər faylı yaradın və seçimləri təyin edin:
Hər şey yaşıldırsa, biz hesab edirik ki, serverdə docker-i uğurla konfiqurasiya etmişik.
Gitlab-da davamlı çatdırılmanın qurulması
Gitalab işçisinin uzaq docker hostunda əmrləri yerinə yetirə bilməsi üçün sertifikatları və dockerd ilə şifrələnmiş əlaqə üçün açarı necə və harada saxlamağınıza qərar verməlisiniz. Mən bu problemi sadəcə olaraq gitlbab parametrlərində dəyişənlərə yazmaqla həll etdim:
spoyler başlığı
Sadəcə sertifikatların məzmununu və açarı cat vasitəsilə çıxarın: cat ca.pem. Dəyişən dəyərlərə kopyalayın və yapışdırın.
Gitlab vasitəsilə yerləşdirmə üçün skript yazaq. Docker-in-docker (dind) təsvirindən istifadə olunacaq.
#!/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
Əsas problem gitlab CI / CD dəyişənlərindən normal formada sertifikatların məzmununu "çıxarmaq" idi. Uzaq hostla əlaqənin niyə işləmədiyini anlaya bilmədim. Hostda sudo journalctl -u docker jurnalına baxdım, əl sıxmada xəta var. Dəyişənlərdə ümumiyyətlə saxlananlara baxmaq qərarına gəldim, bunun üçün cat -A $DOCKER_CERT_PATH/key.pem görə bilərsiniz. tr -d 'r' karet simvolunun silinməsini əlavə etməklə səhvi aradan qaldırdı.
Bundan əlavə, öz istəyinizlə skriptə buraxılışdan sonrakı tapşırıqlar əlavə edə bilərsiniz. İşçi versiyasını mənim depomda yoxlaya bilərsiniz https://gitlab.com/isqad/gitlab-ci-cd