Nggawe CD liwat gitlab

Aku tau mikir babagan ngotomatisasi penyebaran proyekku. gitlab.com kanthi apik nyedhiyakake kabeh alat kanggo iki, lan mesthi aku mutusake kanggo njupuk kauntungan, ngerteni lan nulis skrip penyebaran cilik. Ing artikel iki aku nuduhake pengalaman karo masyarakat.

TL; DR

  1. Nggawe VPS: mateni root, mlebu nganggo sandhi, nginstal dockerd, konfigurasi ufw
  2. Nggawe sertifikat kanggo server lan klien docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktifake kontrol dockerd liwat soket tcp: mbusak pilihan -H fd: // saka konfigurasi docker.
  3. Ndhaptar path menyang sertifikat ing docker.json
  4. Ndhaptar ing variabel gitlab ing setelan CI / CD kanthi isi sertifikat. Nulis script .gitlab-ci.yml kanggo panyebaran.

Aku bakal nuduhake kabeh conto babagan distribusi Debian.

Persiyapan VPS wiwitan

Dadi sampeyan tuku conto contone ing DO, bab pisanan sing kudu sampeyan lakoni yaiku nglindhungi server sampeyan saka jagad njaba sing agresif. Aku ora bakal mbuktekaken utawa negesake apa-apa, aku mung bakal nuduhake log / var / log / pesen saka server virtualku:

GambarNggawe CD liwat gitlab

Pisanan, instal firewall ufw:

apt-get update && apt-get install ufw

Ayo aktifake kabijakan standar: mblokir kabeh sambungan mlebu, ngidini kabeh sambungan metu:

ufw default deny incoming
ufw default allow outgoing

Penting: aja lali ngidini sambungan liwat ssh:

ufw allow OpenSSH

Sintaks umum minangka nderek: Allow sambungan dening port: ufw ngidini 12345, ngendi 12345 nomer port utawa jeneng layanan. Nolak: ufw nolak 12345

Nguripake firewall:

ufw enable

Kita metu saka sesi lan mlebu maneh liwat ssh.

Tambah pangguna, wenehake sandhi, lan tambahake menyang grup sudo.

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

Sabanjure, miturut rencana, sampeyan kudu mateni login sandhi. Kanggo nindakake iki, nyalin kunci ssh menyang server:

ssh-copy-id [email protected]

IP server kudu duweke sampeyan. Saiki coba log in nggunakake pangguna sing digawe sadurunge; sampeyan ora perlu ngetik sandhi maneh. Sabanjure, ing setelan konfigurasi, ganti ing ngisor iki:

sudo nano /etc/ssh/sshd_config

mateni login sandi:

PasswordAuthentication no

Wiwiti maneh daemon sshd:

sudo systemctl reload sshd

Saiki yen sampeyan utawa wong liya nyoba mlebu minangka pangguna root, ora bakal bisa.

Sabanjure, instal dockerd, aku ora bakal njlèntrèhaké proses ing kene, amarga kabeh wis bisa diganti, tututi link menyang situs web resmi lan tindakake langkah-langkah nginstal docker ing mesin virtual sampeyan: https://docs.docker.com/install/linux/docker-ce/debian/

Ngasilake sertifikat

Kanggo ngontrol daemon docker saka adoh, sambungan TLS sing dienkripsi dibutuhake. Kanggo nindakake iki, sampeyan kudu duwe sertifikat lan kunci, sing kudu digawe lan ditransfer menyang mesin remot. Tindakake langkah-langkah sing diwenehake ing pandhuan ing situs web docker resmi: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Kabeh file *.pem sing digawe kanggo server, yaiku ca.pem, server.pem, key.pem, kudu diselehake ing direktori /etc/docker ing server.

Nyetel dockerd

Ing skrip peluncuran daemon docker, kita mbusak opsi -H df: //, pilihan iki nemtokake host daemon docker sing bisa dikontrol.

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

Sabanjure, sampeyan kudu nggawe file setelan, yen durung ana, lan nemtokake 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
}

Ayo ngidini sambungan ing port 2376:

sudo ufw allow 2376

Ayo miwiti maneh dockerd kanthi setelan anyar:

sudo systemctl daemon-reload && sudo systemctl restart docker

Ayo priksa:

sudo systemctl status docker

Yen kabeh "ijo", banjur kita nganggep manawa kita wis sukses ngatur docker ing server.

Nyetel pangiriman terus-terusan ing gitlab

Supaya buruh Gitalaba bisa nindakake printah ing host Docker remot, sampeyan kudu mutusake carane lan ing ngendi kanggo nyimpen sertifikat lan kunci sambungan sing dienkripsi karo Dockerd. Aku ngrampungake masalah iki kanthi mung nambahake ing ngisor iki menyang variabel ing setelan gitlbab:

Judul spoilerNggawe CD liwat gitlab

Cukup output isi sertifikat lan kunci liwat cat: cat ca.pem. Salin lan tempel menyang nilai variabel.

Ayo nulis skrip kanggo penyebaran liwat GitLab. Gambar docker-in-docker (dind) bakal digunakake.

.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 # скрипт дСплоя Ρ‚ΡƒΡ‚

Isi skrip penyebaran kanthi komentar:

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 yaiku "narik" isi sertifikat ing wangun normal saka variabel CI / CD gitlab. Aku ora ngerti kenapa sambungan menyang host remot ora bisa digunakake. Ing host aku ndeleng log sudo journalctl -u docker, ana kesalahan nalika salaman. Aku mutusake kanggo ndeleng apa sing umume disimpen ing variabel; kanggo nindakake iki, sampeyan bisa katon kaya iki: cat -A $DOCKER_CERT_PATH/key.pem. Aku ngatasi kesalahan kanthi nambah mbusak karakter carriage tr -d 'r'.

Sabanjure, sampeyan bisa nambah tugas kirim-rilis menyang skrip ing discretion sampeyan. Sampeyan bisa ndeleng versi sing digunakake ing repositoriku https://gitlab.com/isqad/gitlab-ci-cd

Source: www.habr.com

Add a comment