Menyediakan CD melalui gitlab

Saya pernah berfikir tentang mengautomasikan penggunaan projek saya. gitlab.com dengan hormatnya menyediakan semua alat untuk ini, dan sudah tentu saya memutuskan untuk memanfaatkannya, memikirkannya dan menulis skrip penggunaan kecil. Dalam artikel ini saya berkongsi pengalaman saya dengan komuniti.

TL; DR

  1. Sediakan VPS: lumpuhkan root, log masuk dengan kata laluan, pasang dockerd, konfigurasikan ufw
  2. Hasilkan sijil untuk pelayan dan pelanggan docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Dayakan kawalan dockerd melalui soket tcp: alih keluar pilihan -H fd:// daripada konfigurasi docker.
  3. Daftar laluan ke sijil dalam docker.json
  4. Daftar dalam pembolehubah gitlab dalam tetapan CI/CD dengan kandungan sijil. Tulis skrip .gitlab-ci.yml untuk penempatan.

Saya akan menunjukkan semua contoh pada pengedaran Debian.

Persediaan VPS awal

Jadi anda membeli contoh contohnya di DO, perkara pertama yang perlu anda lakukan ialah melindungi pelayan anda daripada dunia luar yang agresif. Saya tidak akan membuktikan atau menegaskan apa-apa, saya hanya akan menunjukkan log /var/log/mesej pelayan maya saya:

БкÑ € инÑоÑ,Menyediakan CD melalui gitlab

Mula-mula, pasang tembok api ufw:

apt-get update && apt-get install ufw

Mari dayakan dasar lalai: sekat semua sambungan masuk, benarkan semua sambungan keluar:

ufw default deny incoming
ufw default allow outgoing

Penting: jangan lupa untuk membenarkan sambungan melalui ssh:

ufw allow OpenSSH

Sintaks umum adalah seperti berikut: Benarkan sambungan melalui port: ufw benarkan 12345, dengan 12345 ialah nombor port atau nama perkhidmatan. Tolak: ufw tolak 12345

Hidupkan tembok api:

ufw enable

Kami keluar dari sesi dan log masuk semula melalui ssh.

Tambahkan pengguna, berikan kata laluan kepadanya dan tambahkan dia pada kumpulan sudo.

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

Seterusnya, mengikut pelan, anda harus melumpuhkan log masuk kata laluan. untuk melakukan ini, salin kunci ssh anda ke pelayan:

ssh-copy-id [email protected]

Ip pelayan mestilah milik anda. Sekarang cuba log masuk menggunakan pengguna yang anda buat sebelum ini; anda tidak perlu lagi memasukkan kata laluan. Seterusnya, dalam tetapan konfigurasi, tukar yang berikut:

sudo nano /etc/ssh/sshd_config

lumpuhkan log masuk kata laluan:

PasswordAuthentication no

Mulakan semula daemon sshd:

sudo systemctl reload sshd

Sekarang jika anda atau orang lain cuba log masuk sebagai pengguna root, ia tidak akan berfungsi.

Seterusnya, pasang dockerd, saya tidak akan menerangkan prosesnya di sini, kerana semuanya sudah boleh diubah, ikuti pautan ke laman web rasmi dan ikuti langkah-langkah memasang docker pada mesin maya anda: https://docs.docker.com/install/linux/docker-ce/debian/

Menjana sijil

Untuk mengawal daemon docker dari jauh, sambungan TLS yang disulitkan diperlukan. Untuk melakukan ini, anda perlu mempunyai sijil dan kunci, yang mesti dijana dan dipindahkan ke mesin jauh anda. Ikuti langkah-langkah yang diberikan dalam arahan di laman web docker rasmi: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Semua fail *.pem yang dihasilkan untuk pelayan, iaitu ca.pem, server.pem, key.pem, mesti diletakkan dalam direktori /etc/docker pada pelayan.

Menyediakan dockerd

Dalam skrip pelancaran daemon docker, kami mengalih keluar pilihan -H df://, pilihan ini menentukan hos mana daemon docker boleh dikawal.

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

Seterusnya, anda harus membuat fail tetapan, jika ia belum wujud, dan tentukan 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
}

Mari benarkan sambungan pada port 2376:

sudo ufw allow 2376

Mari mulakan semula dockerd dengan tetapan baharu:

sudo systemctl daemon-reload && sudo systemctl restart docker

Mari semak:

sudo systemctl status docker

Jika semuanya "hijau", maka kami menganggap bahawa kami telah berjaya mengkonfigurasi docker pada pelayan.

Menyediakan penghantaran berterusan pada gitlab

Untuk membolehkan pekerja Gitalaba dapat melaksanakan arahan pada hos Docker jauh, adalah perlu untuk memutuskan cara dan tempat untuk menyimpan sijil dan kunci untuk sambungan yang disulitkan dengan Dockerd. Saya menyelesaikan masalah ini dengan hanya menambah yang berikut pada pembolehubah dalam tetapan gitlbab:

tajuk spoilerMenyediakan CD melalui gitlab

Hanya keluarkan kandungan sijil dan kunci melalui kucing: cat ca.pem. Salin dan tampal ke dalam nilai pembolehubah.

Mari kita tulis skrip untuk penggunaan melalui GitLab. Imej 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 # скрипт дСплоя Ρ‚ΡƒΡ‚

Kandungan skrip penggunaan dengan ulasan:

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 ialah "menarik" kandungan sijil dalam bentuk biasa daripada pembolehubah CI/CD gitlab. Saya tidak dapat mengetahui mengapa sambungan kepada hos jauh tidak berfungsi. Pada hos saya melihat log sudo journalctl -u docker, terdapat ralat semasa berjabat tangan. Saya memutuskan untuk melihat perkara yang biasanya disimpan dalam pembolehubah; untuk melakukan ini, anda boleh kelihatan seperti ini: cat -A $DOCKER_CERT_PATH/key.pem. Saya mengatasi ralat dengan menambah penyingkiran aksara pengangkutan tr -d 'r'.

Seterusnya, anda boleh menambah tugas selepas keluaran pada skrip mengikut budi bicara anda. Anda boleh melihat versi yang berfungsi dalam repositori saya https://gitlab.com/isqad/gitlab-ci-cd

Sumber: www.habr.com

Tambah komen