CD nustatymas per gitlab

Kartą galvojau apie savo projekto diegimo automatizavimą. gitlab.com maloniai pateikia visus tam reikalingus įrankius, ir, žinoma, nusprendžiau tuo pasinaudoti, išsiaiškinti ir parašyti nedidelį diegimo scenarijų. Šiame straipsnyje dalinuosi savo patirtimi su bendruomene.

Lt; DR

  1. Nustatykite VPS: išjunkite root, prisijunkite naudodami slaptažodį, įdiekite dockerd, sukonfigūruokite ufw
  2. Generuokite serverio ir kliento sertifikatus docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Įgalinti dockerd valdymą per tcp lizdą: pašalinkite parinktį -H fd:// iš docker konfigūracijos.
  3. Užregistruokite sertifikatų kelius docker.json
  4. Registruokitės gitlab kintamuosiuose CI/CD nustatymuose su sertifikatų turiniu. Parašykite scenarijų .gitlab-ci.yml diegimui.

Parodysiu visus Debian platinimo pavyzdžius.

Pradinė VPS sąranka

Taigi, pavyzdžiui, nusipirkote egzempliorių adresu DO, pirmas dalykas, kurį turite padaryti, yra apsaugoti savo serverį nuo agresyvaus išorinio pasaulio. Nieko neįrodysiu ir neteigsiu, tiesiog parodysiu savo virtualaus serverio žurnalą /var/log/messages:

Ekrano kopijaCD nustatymas per gitlab

Pirmiausia įdiekite ufw ugniasienę:

apt-get update && apt-get install ufw

Įgalinkime numatytąją politiką: blokuoti visus gaunamus ryšius, leisti visus išeinančius ryšius:

ufw default deny incoming
ufw default allow outgoing

Svarbu: nepamirškite leisti prisijungti per ssh:

ufw allow OpenSSH

Bendroji sintaksė yra tokia: Leisti ryšį naudojant prievadą: ufw allow 12345, kur 12345 yra prievado numeris arba paslaugos pavadinimas. Neleisti: ufw deny 12345

Įjunkite ugniasienę:

ufw enable

Išeiname iš sesijos ir vėl prisijungiame per ssh.

Pridėkite vartotoją, priskirkite jam slaptažodį ir pridėkite jį prie sudo grupės.

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

Toliau, pagal planą, turėtumėte išjungti prisijungimą prie slaptažodžio. Norėdami tai padaryti, nukopijuokite ssh raktą į serverį:

ssh-copy-id [email protected]

Serverio IP turi būti jūsų. Dabar pabandykite prisijungti naudodami anksčiau sukurtą vartotoją; jums nebereikia įvesti slaptažodžio. Tada konfigūracijos nustatymuose pakeiskite šiuos nustatymus:

sudo nano /etc/ssh/sshd_config

išjungti slaptažodžio prisijungimą:

PasswordAuthentication no

Iš naujo paleiskite sshd demoną:

sudo systemctl reload sshd

Dabar, jei jūs ar kas nors kitas bandys prisijungti kaip root naudotojas, tai neveiks.

Tada įdiekite dockerd, aš čia neaprašysiu proceso, nes viską jau galima pakeisti, spustelėkite nuorodą į oficialią svetainę ir atlikite docker diegimo virtualioje mašinoje veiksmus: https://docs.docker.com/install/linux/docker-ce/debian/

Sertifikatų generavimas

Norint nuotoliniu būdu valdyti dokerio demoną, reikalingas šifruotas TLS ryšys. Norėdami tai padaryti, turite turėti sertifikatą ir raktą, kurie turi būti sugeneruoti ir perkelti į nuotolinį įrenginį. Atlikite veiksmus, pateiktus instrukcijose oficialioje docker svetainėje: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Visi serveriui sukurti *.pem failai, būtent ca.pem, server.pem, key.pem, turi būti patalpinti serverio /etc/docker kataloge.

„Dockerd“ nustatymas

Docker demono paleidimo scenarijuje pašaliname parinktį -H df://. Ši parinktis nustato, kuriame pagrindiniame kompiuteryje galima valdyti dokerio demoną.

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

Tada turėtumėte sukurti nustatymų failą, jei jo dar nėra, ir nurodyti parinktis:

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

Leiskime prisijungti prie 2376 prievado:

sudo ufw allow 2376

Iš naujo paleiskite dockerd su naujais nustatymais:

sudo systemctl daemon-reload && sudo systemctl restart docker

Patikrinkime:

sudo systemctl status docker

Jei viskas yra „žalia“, manome, kad sėkmingai sukonfigūravome dokerį serveryje.

Nepertraukiamo pristatymo nustatymas „gitlab“.

Kad „Gitalaba“ darbuotojas galėtų vykdyti komandas nuotoliniame „Docker“ pagrindiniame kompiuteryje, būtina nuspręsti, kaip ir kur saugoti sertifikatus ir šifruoto ryšio su „Dockerd“ raktą. Aš išsprendžiau šią problemą tiesiog pridėdamas šiuos kintamuosius „gitlbab“ nustatymuose:

Spoilerio pavadinimasCD nustatymas per gitlab

Tiesiog išveskite sertifikatų turinį ir raktą per cat: cat ca.pem. Nukopijuokite ir įklijuokite į kintamųjų reikšmes.

Parašykime scenarijų diegimui per „GitLab“. Bus naudojamas docker-in-docker (dind) vaizdas.

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

Diegimo scenarijaus turinys su komentarais:

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

Pagrindinė problema buvo „ištraukti“ sertifikatų turinį normalia forma iš gitlab CI/CD kintamųjų. Negalėjau suprasti, kodėl neveikia ryšys su nuotoliniu kompiuteriu. Priegloboje pažiūrėjau į log sudo journalctl -u docker, rankos paspaudimo metu įvyko klaida. Nusprendžiau pažvelgti į tai, kas paprastai saugoma kintamuosiuose; norėdami tai padaryti, galite atrodyti taip: cat -A $DOCKER_CERT_PATH/key.pem. Įveikiau klaidą pašalindamas vežimėlio simbolį tr -d 'r'.

Tada savo nuožiūra prie scenarijaus galite pridėti užduotis po išleidimo. Darbinę versiją galite peržiūrėti mano saugykloje https://gitlab.com/isqad/gitlab-ci-cd

Šaltinis: www.habr.com

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