Jag tänkte en gång på att automatisera implementeringen av mitt projekt. gitlab.com tillhandahåller alla verktyg för detta, och jag bestämde mig naturligtvis för att använda det genom att ta reda på det och skriva ett litet distributionsskript. I den här artikeln delar jag min erfarenhet med samhället.
TL; DR
Ställ in VPS: inaktivera root, lösenordsinloggning, installera dockerd, konfigurera ufw
Registrera i gitlab-variablerna i CI/CD-inställningarna med innehållet i certifikaten. Skriv ett .gitlab-ci.yml-skript för distribution.
Jag kommer att visa alla exempel på Debiandistributionen.
Initial VPS-inställning
Här köpte du en instans till exempel på DO, det första du ska göra är att skydda din server från den aggressiva omvärlden. Jag kommer inte att bevisa eller hävda någonting, jag kommer bara att visa /var/log/messages-loggen för min virtuella server:
skärmdump
Installera först ufw-brandväggen:
apt-get update && apt-get install ufw
Aktivera standardpolicyn: blockera alla inkommande anslutningar, tillåt alla utgående anslutningar:
Serverns ip måste vara din. Försök nu att logga in under användaren som skapats tidigare, du behöver inte ange något lösenord längre. Ändra sedan följande i konfigurationsinställningarna:
sudo nano /etc/ssh/sshd_config
inaktivera lösenordsinloggning:
PasswordAuthentication no
Starta om sshd-demonen:
sudo systemctl reload sshd
Om du eller någon annan försöker logga in som root kommer det att misslyckas.
Därefter installerar vi dockerd, jag kommer inte att beskriva processen här, eftersom allt redan kan ändras, följ länken till den officiella webbplatsen och gå igenom stegen för att installera docker på din virtuella maskin: https://docs.docker.com/install/linux/docker-ce/debian/
Certifikatgenerering
För att fjärrstyra docker-demonen krävs en krypterad TLS-anslutning. För att göra detta behöver du ha ett certifikat och en nyckel som du behöver för att generera och överföra till din fjärrdator. Följ stegen i instruktionerna på den officiella docker-webbplatsen: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Alla genererade *.pem-filer för servern, nämligen ca.pem, server.pem, key.pem, ska placeras i katalogen /etc/docker på servern.
docker-inställning
Ta bort alternativet -H df:// i startskriptet för docker-demonen, detta alternativ talar om vilken värd docker-demonen kan styras på.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Skapa sedan en inställningsfil om den inte redan finns och ställ in alternativen:
Om allt är grönt anser vi att vi framgångsrikt har konfigurerat docker på servern.
Ställer in kontinuerlig leverans på gitlab
För att gitalab-arbetaren ska kunna utföra kommandon på en fjärransluten docker-värd måste du bestämma hur och var du ska lagra certifikat och en nyckel för en krypterad anslutning till dockerd. Jag löste det här problemet genom att helt enkelt skriva till variablerna i gitlbab-inställningarna:
spoiler titel
Mata bara ut innehållet i certifikaten och nyckeln via cat: cat ca.pem. Kopiera och klistra in i variabelvärden.
Låt oss skriva ett skript för distribution via gitlab. Docker-in-docker-bilden (dind) kommer att användas.
Innehållet i distributionsskriptet med kommentarer:
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
Huvudproblemet var att "dra ut" innehållet i certifikaten i normal form från gitlabs CI/CD-variabler. Jag kunde inte lista ut varför anslutningen till fjärrvärden inte fungerade. Jag tittade på sudo journalctl -u docker-loggen på värden, det är ett fel med handskakningen. Jag bestämde mig för att titta på vad som vanligtvis lagras i variabler, för detta kan du se cat -A $DOCKER_CERT_PATH/key.pem. Övervann felet genom att lägga till borttagningen av caret-tecknet tr -d 'r'.
Vidare kan du lägga till uppgifter efter release till skriptet efter eget gottfinnande. Du kan kolla in den fungerande versionen i mitt arkiv https://gitlab.com/isqad/gitlab-ci-cd