Menyiapkan CD melalui gitlab

Saya pernah berpikir untuk mengotomatiskan penerapan proyek saya. gitlab.com dengan baik hati menyediakan semua alat untuk ini, dan tentu saja saya memutuskan untuk memanfaatkannya, mencari tahu dan menulis skrip penerapan kecil. Pada artikel ini saya berbagi pengalaman saya dengan komunitas.

TL; DR

  1. Siapkan VPS: nonaktifkan root, masuk dengan kata sandi, instal dockerd, konfigurasikan ufw
  2. Hasilkan sertifikat untuk server dan klien docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktifkan kontrol dockerd melalui soket tcp: hapus opsi -H fd:// dari konfigurasi buruh pelabuhan.
  3. Daftarkan jalur ke sertifikat di docker.json
  4. Daftarkan variabel gitlab di pengaturan CI/CD dengan konten sertifikat. Tulis skrip .gitlab-ci.yml untuk penerapan.

Saya akan menunjukkan semua contoh pada distribusi Debian.

Pengaturan VPS awal

Jadi Anda membeli sebuah instance misalnya di DO, hal pertama yang perlu Anda lakukan adalah melindungi server Anda dari dunia luar yang agresif. Saya tidak akan membuktikan atau menegaskan apa pun, saya hanya akan menampilkan log /var/log/messages dari server virtual saya:

Tangkapan layarMenyiapkan CD melalui gitlab

Pertama, instal firewall ufw:

apt-get update && apt-get install ufw

Mari aktifkan kebijakan default: blokir semua koneksi masuk, izinkan semua koneksi keluar:

ufw default deny incoming
ufw default allow outgoing

Penting: jangan lupa izinkan koneksi melalui ssh:

ufw allow OpenSSH

Sintaks umumnya adalah sebagai berikut: Izinkan koneksi melalui port: ufw izinkan 12345, dengan 12345 adalah nomor port atau nama layanan. Tolak: ufw tolak 12345

Aktifkan firewallnya:

ufw enable

Kami keluar dari sesi dan masuk lagi melalui ssh.

Tambahkan pengguna, berikan dia kata sandi, dan tambahkan dia ke grup sudo.

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

Selanjutnya, menurut rencana, Anda harus menonaktifkan login kata sandi. untuk melakukan ini, salin kunci ssh Anda ke server:

ssh-copy-id [email protected]

Ip server harus menjadi milik Anda. Sekarang cobalah login menggunakan user yang Anda buat tadi, Anda tidak perlu lagi memasukkan password. Selanjutnya, pada pengaturan konfigurasi, ubah hal berikut:

sudo nano /etc/ssh/sshd_config

nonaktifkan login kata sandi:

PasswordAuthentication no

Mulai ulang daemon sshd:

sudo systemctl reload sshd

Sekarang jika Anda atau orang lain mencoba masuk sebagai pengguna root, itu tidak akan berhasil.

Selanjutnya instal dockerd, saya tidak akan menjelaskan prosesnya di sini, karena semuanya sudah dapat diubah, ikuti tautan ke situs web resmi dan ikuti langkah-langkah menginstal docker di mesin virtual Anda: https://docs.docker.com/install/linux/docker-ce/debian/

Menghasilkan sertifikat

Untuk mengontrol daemon buruh pelabuhan dari jarak jauh, diperlukan koneksi TLS terenkripsi. Untuk melakukan ini, Anda harus memiliki sertifikat dan kunci, yang harus dibuat dan ditransfer ke mesin jarak jauh Anda. Ikuti langkah-langkah yang diberikan dalam instruksi di situs resmi buruh pelabuhan: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Semua file *.pem yang dihasilkan untuk server, yaitu ca.pem, server.pem, key.pem, harus ditempatkan di direktori /etc/docker di server.

Menyiapkan buruh pelabuhan

Dalam skrip peluncuran daemon buruh pelabuhan, kami menghapus opsi -H df://, opsi ini menentukan host mana daemon buruh pelabuhan dapat dikontrol.

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

Selanjutnya, Anda harus membuat file pengaturan, jika belum ada, dan tentukan opsi:

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

Mari izinkan koneksi pada port 2376:

sudo ufw allow 2376

Mari kita mulai ulang dockerd dengan pengaturan baru:

sudo systemctl daemon-reload && sudo systemctl restart docker

Mari kita periksa:

sudo systemctl status docker

Jika semuanya β€œhijau”, maka kita anggap kita telah berhasil mengkonfigurasi buruh pelabuhan di server.

Menyiapkan pengiriman berkelanjutan di gitlab

Agar pekerja Gitalaba dapat menjalankan perintah pada host Docker jarak jauh, perlu untuk memutuskan bagaimana dan di mana menyimpan sertifikat dan kunci untuk koneksi terenkripsi dengan Dockerd. Saya memecahkan masalah ini hanya dengan menambahkan yang berikut ini ke variabel di pengaturan gitlbab:

judul spoilerMenyiapkan CD melalui gitlab

Keluarkan saja isi sertifikat dan kunci melalui cat: cat ca.pem. Salin dan tempel ke nilai variabel.

Mari kita menulis skrip untuk penerapan melalui GitLab. Gambar docker-in-docker (dind) akan digunakan.

.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 penerapan dengan 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 utamanya adalah "menarik" konten sertifikat dalam bentuk normal dari variabel gitlab CI/CD. Saya tidak tahu mengapa koneksi ke host jarak jauh tidak berfungsi. Di host saya melihat log sudo journalctl -u docker, ada kesalahan saat jabat tangan. Saya memutuskan untuk melihat apa yang umumnya disimpan dalam variabel; untuk melakukan ini, Anda dapat terlihat seperti ini: cat -A $DOCKER_CERT_PATH/key.pem. Saya mengatasi kesalahan tersebut dengan menambahkan penghapusan karakter kereta tr -d 'r'.

Selanjutnya, Anda dapat menambahkan tugas pasca-rilis ke skrip sesuai kebijaksanaan Anda. Anda dapat melihat versi yang berfungsi di repositori saya https://gitlab.com/isqad/gitlab-ci-cd

Sumber: www.habr.com

Tambah komentar