CD-asennus gitlabin kautta

Ajattelin kerran automatisoida projektini käyttöönoton. gitlab.com tarjoaa ystävällisesti kaikki työkalut tähän, ja tietysti päätin käyttää sitä selvittämällä se ja kirjoittamalla pienen käyttöönottoskriptin. Tässä artikkelissa jaan kokemukseni yhteisön kanssa.

TL; DR

  1. Asenna VPS: poista root käytöstä, kirjaudu sisään salasanalla, asenna dockerd, määritä ufw
  2. Luo varmenteita palvelimelle ja asiakkaalle docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Ota Dockerd-ohjaus käyttöön tcp-socketin kautta: poista -H fd:// -vaihtoehto Docker-kokoonpanosta.
  3. Aseta sertifikaattien polut docker.jsonissa
  4. Rekisteröidy gitlab-muuttujiin CI/CD-asetuksissa varmenteiden sisällöllä. Kirjoita .gitlab-ci.yml-skripti käyttöönottoa varten.

Näytän kaikki esimerkit Debian-jakelusta.

VPS:n alkuasetus

Täältä ostit instanssin esim DO, ensimmäinen asia on suojata palvelimesi aggressiiviselta ulkomaailmalta. En todista tai väitä mitään, näytän vain virtuaalipalvelimeni /var/log/messages-lokin:

kuvakaappausCD-asennus gitlabin kautta

Asenna ensin ufw-palomuuri:

apt-get update && apt-get install ufw

Ota oletuskäytäntö käyttöön: estä kaikki saapuvat yhteydet, salli kaikki lähtevät yhteydet:

ufw default deny incoming
ufw default allow outgoing

Tärkeää: älä unohda sallia yhteyttä ssh:n kautta:

ufw allow OpenSSH

Yleinen syntaksi on: Salli yhteys portissa: ufw allow 12345, jossa 12345 on portin numero tai palvelun nimi. Kiellä: ufw deny 12345

Ota palomuuri käyttöön:

ufw enable

Poistumme istunnosta ja kirjaudumme uudelleen sisään ssh:n kautta.

Lisää käyttäjä, anna hänelle salasana ja lisää hänet sudo-ryhmään.

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

Seuraavaksi sinun tulee suunnitelman mukaan poistaa salasanalla kirjautuminen käytöstä. tehdäksesi tämän kopioimalla ssh-avaimesi palvelimelle:

ssh-copy-id [email protected]

Palvelimen IP:n on oltava sinun. Yritä nyt kirjautua sisään aiemmin luodulla käyttäjällä, sinun ei tarvitse enää antaa salasanaa. Muuta seuraavaksi kokoonpanoasetuksissa seuraavaa:

sudo nano /etc/ssh/sshd_config

poista salasana kirjautuminen käytöstä:

PasswordAuthentication no

Käynnistä sshd-daemon uudelleen:

sudo systemctl reload sshd

Nyt jos sinä tai joku muu yrittää kirjautua sisään root-käyttäjänä, se epäonnistuu.

Seuraavaksi asennamme dockerdin, en kuvaile prosessia tässä, koska kaikki voidaan jo muuttaa, seuraa linkkiä viralliselle verkkosivustolle ja käy läpi dockerin asennusvaiheet virtuaalikoneellesi: https://docs.docker.com/install/linux/docker-ce/debian/

Sertifikaatin luominen

Docker-daemonin etähallinta edellyttää salattua TLS-yhteyttä. Tätä varten sinulla on oltava varmenne ja avain, jotka sinun on luotava ja siirrettävä etäkoneellesi. Noudata virallisen Docker-verkkosivuston ohjeissa annettuja ohjeita: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Kaikki palvelimelle luodut *.pem-tiedostot, eli ca.pem, server.pem, key.pem, tulee sijoittaa palvelimen /etc/docker-hakemistoon.

telakointiaseman asetukset

Poista Docker-daemonin käynnistyskomentosarjasta -H df:// -vaihtoehto. Tämä vaihtoehto kertoo, missä isännässä Docker-daemonia voidaan ohjata.

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

Luo seuraavaksi asetustiedosto, jos sitä ei vielä ole, ja aseta asetukset:

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

Salli yhteydet portissa 2376:

sudo ufw allow 2376

Käynnistä Dockerd uudelleen uusilla asetuksilla:

sudo systemctl daemon-reload && sudo systemctl restart docker

Tarkista:

sudo systemctl status docker

Jos kaikki on vihreää, katsomme, että olemme määrittäneet telakan onnistuneesti palvelimelle.

Jatkuvan toimituksen määrittäminen gitlabissa

Jotta gitalab-työntekijä voi suorittaa komentoja etätelakointiasemassa, sinun on päätettävä, miten ja missä tallennetaan varmenteita ja avain salattua yhteyttä varten Dockerd-laitteeseen. Ratkaisin tämän ongelman kirjoittamalla gitlbab-asetusten muuttujiin:

spoilerin otsikkoCD-asennus gitlabin kautta

Anna vain varmenteiden sisältö ja avain catin kautta: cat ca.pem. Kopioi ja liitä muuttujaarvoihin.

Kirjoitetaan skripti käyttöönottoa varten gitlabin kautta. Docker-in-docker (dind) -kuvaa käytetään.

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

Käyttöönottoskriptin sisältö kommentteineen:

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

Suurin ongelma oli sertifikaattien sisällön "vetäminen ulos" normaalimuodossa gitlab CI/CD -muuttujista. En pystynyt ymmärtämään, miksi yhteys etäisäntään ei toiminut. Katsoin sudo journalctl -u Dockerin lokia isännässä, kädenpuristuksessa on virhe. Päätin katsoa, ​​mitä yleensä on tallennettu muuttujiin, tätä varten voit nähdä cat -A $DOCKER_CERT_PATH/key.pem. Virhe on voitettu lisäämällä poistomerkki tr -d 'r'.

Lisäksi voit lisätä julkaisun jälkeisiä tehtäviä käsikirjoitukseen oman harkintasi mukaan. Voit tarkistaa toimivan version arkistostani https://gitlab.com/isqad/gitlab-ci-cd

Lähde: will.com

Lisää kommentti