gitlab vasitəsilə CD quraşdırma

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.

TL; DR

  1. VPS qurun: kök, parol girişini söndürün, dockerd quraşdırın, ufw-ni konfiqurasiya edin
  2. Server və müştəri üçün sertifikatlar yaradın docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl tcp yuvası vasitəsilə dockerd nəzarətini aktivləşdirin: docker konfiqurasiyasından -H fd:// seçimini çıxarın.
  3. Docker.json-da sertifikatlara yollar təyin edin
  4. 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:

Screenshotgitlab vasitəsilə CD quraşdırma

Ə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:

ufw default deny incoming
ufw default allow outgoing

Vacib: ssh vasitəsilə əlaqəyə icazə verməyi unutmayın:

ufw allow OpenSSH

Ümumi sintaksis belədir: Portda əlaqəyə icazə ver: ufw icazə 12345, burada 12345 port nömrəsi və ya xidmət adıdır. İnkar et: ufw rədd et 12345

Firewall'u yandırın:

ufw enable

Sessiyadan çıxıb ssh vasitəsilə yenidən daxil oluruq.

İstifadəçi əlavə edin, ona parol təyin edin və onu sudo qrupuna əlavə edin.

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

Sonra, plana uyğun olaraq, parol girişini deaktiv etməlisiniz. Bunu etmək üçün ssh açarınızı serverə kopyalayın:

ssh-copy-id [email protected]

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:

/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 portunda bağlantılara icazə verin:

sudo ufw allow 2376

Dockerd-i yeni parametrlərlə yenidən başladın:

sudo systemctl daemon-reload && sudo systemctl restart docker

yoxlayaq:

sudo systemctl status docker

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ığıgitlab vasitəsilə CD quraşdırma

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.

.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 # скрипт деплоя тут

Şərhlərlə yerləşdirmə skriptinin məzmunu:

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

Ə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

Mənbə: www.habr.com

Добавить комментарий