Setup CD via gitlab

Kuring sakali panginten ngeunaan ngajadikeun otomatis panyebaran proyék kuring. gitlab.com bageur nawaran reureuh di nyadiakeun sagala parabot pikeun ieu, sarta tangtu kuring mutuskeun ngagunakeun eta ku figuring kaluar jeung nulis Aksara deployment leutik. Dina artikel ieu, kuring babagi pangalaman kuring jeung masarakat.

TL; DR

  1. Nyetél VPS: mareuman root, login sandi, install dockerd, ngonpigurasikeun ufw
  2. Ngahasilkeun sertipikat pikeun server sareng klien docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktipkeun kontrol dockerd via stop kontak tcp: cabut pilihan -H fd: // ti config docker.
  3. Setel jalur ka sertipikat dina docker.json
  4. Ngadaptar dina variabel gitlab dina setélan CI / CD sareng eusi sertipikat. Nulis Aksara .gitlab-ci.yml pikeun deployment.

Kuring bakal nunjukkeun sadaya conto dina distribusi Debian.

Setélan VPS awal

Di dieu Anjeun meuli hiji conto misalna dina DO, Hal kahiji anu kudu dipigawé nyaéta ngajaga server anjeun ti dunya luar agrésif. Kuring moal ngabuktikeun atawa negeskeun nanaon, kuring ngan bakal nembongkeun / var / log / log pesen tina server maya kuring:

TangkepanSetup CD via gitlab

Mimiti, pasang firewall ufw:

apt-get update && apt-get install ufw

Aktipkeun kawijakan standar: meungpeuk sadaya sambungan asup, ngidinan sadaya sambungan kaluar:

ufw default deny incoming
ufw default allow outgoing

Nu penting: ulah poho pikeun ngidinan sambungan via ssh:

ufw allow OpenSSH

Sintaksis umum nyaéta: Ngidinan sambungan dina port: ufw ngawenangkeun 12345, dimana 12345 mangrupikeun nomer port atanapi nami jasa. mungkir: ufw mungkir 12345

Hurungkeun firewall:

ufw enable

Urang kaluar tina sési jeung asup deui via ssh.

Tambahkeun pangguna, pasihan anjeunna kecap konci, sareng tambahkeun anjeunna kana grup sudo.

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

Salajengna, nurutkeun rencana, anjeun kedah nganonaktipkeun login sandi. Jang ngalampahkeun ieu, salin konci ssh anjeun ka server:

ssh-copy-id [email protected]

The ip tina server kedah milik anjeun. Ayeuna coba log in handapeun pamaké dijieun saméméhna, anjeun teu kudu ngasupkeun sandi deui. Salajengna, dina setélan konfigurasi, robih ieu:

sudo nano /etc/ssh/sshd_config

mareuman sandi login:

PasswordAuthentication no

Balikan deui daemon sshd:

sudo systemctl reload sshd

Ayeuna upami anjeun atanapi batur nyobian asup salaku root, éta bakal gagal.

Salajengna, urang pasang dockerd, kuring moal ngajelaskeun prosésna di dieu, sabab sadayana parantos dirobih, tuturkeun tautan kana halaman wéb resmi sareng ngalangkungan léngkah-léngkah masang docker dina mesin virtual anjeun: https://docs.docker.com/install/linux/docker-ce/debian/

Generasi sertipikat

Pikeun ngadalikeun daemon docker jarak jauh, sambungan TLS énkripsi diperlukeun. Jang ngalampahkeun ieu, anjeun kedah gaduh sertipikat sareng konci anu anjeun peryogikeun pikeun ngahasilkeun sareng mindahkeun kana mesin jauh anjeun. Turutan léngkah-léngkah anu dipasihkeun dina petunjuk dina halaman wéb docker resmi: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Sadaya file *.pem anu dihasilkeun pikeun server, nyaéta ca.pem, server.pem, key.pem, kedah disimpen dina diréktori /etc/docker dina server.

setelan docker

Dina skrip ngamimitian daemon docker, cabut pilihan -H df: //, pilihan ieu nyarioskeun mana host daemon docker tiasa dikontrol.

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

Teras, jieun file setélan upami éta henteu acan aya sareng setel pilihan:

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

Ngidinan sambungan dina port 2376:

sudo ufw allow 2376

Balikan deui dockerd sareng setélan énggal:

sudo systemctl daemon-reload && sudo systemctl restart docker

Hayu urang parios:

sudo systemctl status docker

Upami sadayana "héjo", maka urang nganggap yén kami parantos suksés ngonpigurasi docker dina server.

Nyetél pangiriman kontinyu dina gitlab

Supados pagawe gitalab tiasa ngalaksanakeun paréntah dina host docker jauh, anjeun kedah mutuskeun kumaha sareng dimana nyimpen sertipikat sareng konci pikeun sambungan énkripsi ka dockerd. Kuring direngsekeun masalah ieu ku saukur nulis ka variabel dina setélan gitlbab:

judul spoilerSetup CD via gitlab

Ngan kaluaran eusi sertipikat sareng konci via ucing: cat ca.pem. Salin sareng témpél kana nilai variabel.

Hayu urang nulis naskah pikeun deployment ngaliwatan gitlab. Gambar docker-in-docker (dind) bakal dianggo.

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

Eusi naskah panyebaran sareng koméntar:

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

Masalah utama nyaéta "tarik kaluar" eusi sertipikat dina bentuk normal tina variabel gitlab CI / CD. Abdi henteu tiasa terang naha sambungan ka host jauh henteu jalan. Kuring nempo sudo journalctl -u docker log on host, aya kasalahan jeung sasalaman. Kuring mutuskeun katingal dina naon umumna disimpen dina variabel, pikeun ieu anjeun tiasa ningali ucing -A $ DOCKER_CERT_PATH / key.pem. Overcame kasalahan ku nambahkeun ngaleupaskeun karakter caret tr -d 'r'.

Salajengna, anjeun tiasa nambihan tugas pas-release kana naskah dina kawijaksanaan anjeun. Anjeun tiasa pariksa versi anu tiasa dianggo dina gudang kuring https://gitlab.com/isqad/gitlab-ci-cd

sumber: www.habr.com

Tambahkeun komentar