Gitlab aracılığıyla CD kurma

Bir zamanlar projemin dağıtımını otomatikleştirmeyi düşündüm. gitlab.com bunun için tüm araçları nazikçe sağlıyor ve elbette ben de bundan yararlanmaya karar verdim, bunu çözdüm ve küçük bir dağıtım komut dosyası yazdım. Bu yazıda deneyimlerimi toplulukla paylaşıyorum.

TL; DR

  1. VPS'yi kurun: root'u devre dışı bırakın, şifreyle giriş yapın, dockerd'ı yükleyin, ufw'yi yapılandırın
  2. Sunucu ve istemci için sertifikalar oluşturun docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Tcp soketi aracılığıyla dockerd kontrolünü etkinleştirin: docker yapılandırmasından -H fd:// seçeneğini kaldırın.
  3. Docker.json'daki sertifikaların yollarını kaydedin
  4. Sertifikaların içeriğiyle CI/CD ayarlarında gitlab değişkenlerine kaydolun. Dağıtım için bir .gitlab-ci.yml komut dosyası yazın.

Tüm örnekleri Debian dağıtımı üzerinde göstereceğim.

İlk VPS kurulumu

Örneğin şu adresten bir örnek satın aldınız: DOYapmanız gereken ilk şey sunucunuzu agresif dış dünyadan korumaktır. Hiçbir şeyi kanıtlamayacağım veya iddia etmeyeceğim, sadece sanal sunucumun log /var/log/messages dosyasını göstereceğim:

Ekran GörüntüsüGitlab aracılığıyla CD kurma

İlk önce ufw güvenlik duvarını yükleyin:

apt-get update && apt-get install ufw

Varsayılan politikayı etkinleştirelim: tüm gelen bağlantıları engelle, tüm giden bağlantılara izin ver:

ufw default deny incoming
ufw default allow outgoing

Önemli: ssh aracılığıyla bağlantıya izin vermeyi unutmayın:

ufw allow OpenSSH

Genel sözdizimi aşağıdaki gibidir: Bağlantı noktasına göre bağlantıya izin ver: ufw 12345'e izin verir; burada 12345, bağlantı noktası numarası veya hizmetin adıdır. Reddet: ufw reddet 12345

Güvenlik duvarını açın:

ufw enable

Oturumdan çıkıp ssh ile tekrar giriş yapıyoruz.

Bir kullanıcı ekleyin, ona bir şifre atayın ve onu sudo grubuna ekleyin.

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

Daha sonra plana göre şifre girişini devre dışı bırakmalısınız. bunu yapmak için ssh anahtarınızı sunucuya kopyalayın:

ssh-copy-id [email protected]

Sunucu IP'si size ait olmalıdır. Şimdi daha önce oluşturduğunuz kullanıcıyı kullanarak giriş yapmayı deneyin; artık şifre girmenize gerek yok. Daha sonra yapılandırma ayarlarında aşağıdakileri değiştirin:

sudo nano /etc/ssh/sshd_config

şifre girişini devre dışı bırak:

PasswordAuthentication no

Sshd arka plan programını yeniden başlatın:

sudo systemctl reload sshd

Artık siz veya bir başkası kök kullanıcı olarak oturum açmayı denerseniz, bu işe yaramayacaktır.

Sonra, dockerd'ı yükleyin, süreci burada anlatmayacağım, çünkü her şey zaten değiştirilebilir, resmi web sitesine giden bağlantıyı izleyin ve sanal makinenize docker yükleme adımlarını izleyin: https://docs.docker.com/install/linux/docker-ce/debian/

Sertifikalar oluşturuluyor

Docker arka plan programını uzaktan kontrol etmek için şifreli bir TLS bağlantısı gereklidir. Bunu yapmak için, oluşturulup uzak makinenize aktarılması gereken bir sertifikaya ve bir anahtara sahip olmanız gerekir. Resmi liman işçisi web sitesindeki talimatlarda verilen adımları izleyin: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Sunucu için oluşturulan tüm *.pem dosyaları, yani ca.pem, server.pem, key.pem, sunucudaki /etc/docker dizinine yerleştirilmelidir.

Dockerd'ı ayarlama

Docker daemon launch scriptinde -H df:// seçeneğini kaldırıyoruz, bu seçenek docker daemonunun hangi hostta kontrol edilebileceğini belirliyor.

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

Daha sonra, eğer mevcut değilse, bir ayarlar dosyası oluşturmalı ve seçenekleri belirtmelisiniz:

/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 numaralı bağlantı noktasındaki bağlantılara izin verelim:

sudo ufw allow 2376

Dockerd'ı yeni ayarlarla yeniden başlatalım:

sudo systemctl daemon-reload && sudo systemctl restart docker

kontrol:

sudo systemctl status docker

Her şey “yeşil” ise, sunucuda docker'ı başarıyla yapılandırdığımızı düşünüyoruz.

Gitlab'da sürekli teslimatı ayarlama

Gitalaba çalışanının uzak bir Docker ana bilgisayarında komutları yürütebilmesi için, Dockerd ile şifreli bir bağlantı için sertifikaların ve anahtarın nasıl ve nerede saklanacağına karar verilmesi gerekir. Bu sorunu gitlbab ayarlarındaki değişkenlere aşağıdakileri ekleyerek çözdüm:

Spoiler başlığıGitlab aracılığıyla CD kurma

Sertifikaların ve anahtarın içeriğini cat aracılığıyla çıkarmanız yeterli: cat ca.pem. Değişken değerlerine kopyalayıp yapıştırın.

GitLab aracılığıyla dağıtım için bir komut dosyası yazalım. Docker-in-docker (dind) görüntüsü kullanılacaktır.

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

Açıklamalarla birlikte dağıtım komut dosyasının içeriği:

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

Asıl sorun, sertifikaların içeriğini gitlab CI/CD değişkenlerinden normal biçimde "çekmek"ti. Uzak ana bilgisayarla bağlantının neden çalışmadığını anlayamadım. Ana bilgisayarda Sudo Journalctl -u docker günlüğüne baktım, el sıkışma sırasında bir hata oluştu. Değişkenlerde genel olarak neyin saklandığına bakmaya karar verdim; bunu yapmak için şu şekilde görünebilirsiniz: cat -A $DOCKER_CERT_PATH/key.pem. tr -d 'r' satır karakterinin kaldırılmasını ekleyerek hatayı aştım.

Daha sonra, kendi takdirinize bağlı olarak komut dosyasına yayın sonrası görevleri ekleyebilirsiniz. Çalışma sürümünü depomda görebilirsiniz https://gitlab.com/isqad/gitlab-ci-cd

Kaynak: habr.com

Yorum ekle