การตั้งค่าซีดีผ่าน gitlab

ฉันเคยคิดเกี่ยวกับการปรับใช้โครงการของฉันโดยอัตโนมัติ gitlab.com ขอความกรุณาจัดเตรียมเครื่องมือทั้งหมดสำหรับสิ่งนี้ และแน่นอนว่าฉันตัดสินใจใช้มันโดยค้นหาและเขียนสคริปต์การปรับใช้ขนาดเล็ก ในบทความนี้ ฉันแบ่งปันประสบการณ์ของฉันกับชุมชน

TL; DR

  1. ตั้งค่า VPS: ปิดใช้งานรูท, ล็อกอินด้วยรหัสผ่าน, ติดตั้ง Dockerd, กำหนดค่า ufw
  2. สร้างใบรับรองสำหรับเซิร์ฟเวอร์และไคลเอ็นต์ docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl เปิดใช้งานการควบคุมนักเทียบท่าผ่านซ็อกเก็ต tcp: ลบตัวเลือก -H fd:// จากการกำหนดค่านักเทียบท่า
  3. กำหนดเส้นทางไปยังใบรับรองใน docker.json
  4. ลงทะเบียนในตัวแปร gitlab ในการตั้งค่า CI / CD พร้อมเนื้อหาของใบรับรอง เขียนสคริปต์ .gitlab-ci.yml เพื่อปรับใช้

ฉันจะแสดงตัวอย่างทั้งหมดเกี่ยวกับการแจกแจงแบบเดเบียน

การตั้งค่า VPS เริ่มต้น

ที่นี่คุณซื้ออินสแตนซ์เช่น DOสิ่งแรกที่ต้องทำคือปกป้องเซิร์ฟเวอร์ของคุณจากโลกภายนอกที่ก้าวร้าว ฉันจะไม่พิสูจน์หรือยืนยันสิ่งใด ฉันจะแสดงบันทึก /var/log/messages ของเซิร์ฟเวอร์เสมือนของฉัน:

ภาพหน้าจอการตั้งค่าซีดีผ่าน gitlab

ก่อนอื่นให้ติดตั้งไฟร์วอลล์ ufw:

apt-get update && apt-get install ufw

เปิดใช้งานนโยบายเริ่มต้น: บล็อกการเชื่อมต่อขาเข้าทั้งหมด อนุญาตการเชื่อมต่อขาออกทั้งหมด:

ufw default deny incoming
ufw default allow outgoing

สำคัญ: อย่าลืมอนุญาตการเชื่อมต่อผ่าน ssh:

ufw allow OpenSSH

ไวยากรณ์ทั่วไปคือ: อนุญาตการเชื่อมต่อบนพอร์ต: ufw อนุญาต 12345 โดยที่ 12345 คือหมายเลขพอร์ตหรือชื่อบริการ ปฏิเสธ: ufw ปฏิเสธ 12345

เปิดไฟร์วอลล์:

ufw enable

เราออกจากเซสชันและลงชื่อเข้าใช้อีกครั้งผ่าน ssh

เพิ่มผู้ใช้ กำหนดรหัสผ่าน และเพิ่มเขาในกลุ่ม sudo

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

ถัดไป ตามแผน คุณควรปิดใช้งานการเข้าสู่ระบบด้วยรหัสผ่าน ในการทำเช่นนี้ ให้คัดลอกคีย์ ssh ของคุณไปยังเซิร์ฟเวอร์:

ssh-copy-id [email protected]

ip ของเซิร์ฟเวอร์ต้องเป็นของคุณ ตอนนี้ลองเข้าสู่ระบบภายใต้ผู้ใช้ที่สร้างไว้ก่อนหน้านี้ คุณไม่จำเป็นต้องป้อนรหัสผ่านอีกต่อไป ถัดไป ในการตั้งค่าคอนฟิกูเรชัน ให้เปลี่ยนสิ่งต่อไปนี้:

sudo nano /etc/ssh/sshd_config

ปิดใช้งานการเข้าสู่ระบบรหัสผ่าน:

PasswordAuthentication no

รีสตาร์ท sshd daemon:

sudo systemctl reload sshd

ตอนนี้หากคุณหรือคนอื่นพยายามเข้าสู่ระบบในฐานะรูท มันจะล้มเหลว

ต่อไป เราติดตั้ง dockerd ฉันจะไม่อธิบายกระบวนการที่นี่ เนื่องจากทุกอย่างสามารถเปลี่ยนแปลงได้ ให้ไปที่ลิงก์ไปยังเว็บไซต์ทางการ และทำตามขั้นตอนการติดตั้ง docker บนเครื่องเสมือนของคุณ: https://docs.docker.com/install/linux/docker-ce/debian/

การสร้างใบรับรอง

ในการควบคุม docker daemon จากระยะไกล จำเป็นต้องมีการเชื่อมต่อ TLS ที่เข้ารหัส ในการทำเช่นนี้ คุณต้องมีใบรับรองและคีย์ที่คุณต้องการสร้างและถ่ายโอนไปยังเครื่องระยะไกลของคุณ ทำตามขั้นตอนที่ระบุในคำแนะนำบนเว็บไซต์นักเทียบท่าอย่างเป็นทางการ: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl ไฟล์ *.pem ที่สร้างขึ้นทั้งหมดสำหรับเซิร์ฟเวอร์ ได้แก่ ca.pem, server.pem, key.pem ควรอยู่ในไดเร็กทอรี /etc/docker บนเซิร์ฟเวอร์

การตั้งค่านักเทียบท่า

ในสคริปต์เริ่มต้นของ docker daemon ให้ลบอ็อพชัน -H df:// ซึ่งอ็อพชันนี้จะบอกว่าโฮสต์ใดที่ docker daemon สามารถควบคุมได้

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

ถัดไป สร้างไฟล์การตั้งค่าหากยังไม่มีและตั้งค่าตัวเลือก:

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

อนุญาตการเชื่อมต่อบนพอร์ต 2376:

sudo ufw allow 2376

รีสตาร์ทนักเทียบท่าด้วยการตั้งค่าใหม่:

sudo systemctl daemon-reload && sudo systemctl restart docker

ตรวจสอบ:

sudo systemctl status docker

หากทุกอย่างเป็นสีเขียว แสดงว่าเราได้กำหนดค่านักเทียบท่าบนเซิร์ฟเวอร์สำเร็จแล้ว

การตั้งค่าการส่งมอบอย่างต่อเนื่องบน gitlab

เพื่อให้ผู้ปฏิบัติงาน gitalab สามารถดำเนินการคำสั่งบนโฮสต์นักเทียบท่าระยะไกลได้ คุณต้องตัดสินใจว่าจะเก็บใบรับรองและคีย์สำหรับการเชื่อมต่อที่เข้ารหัสไปยังนักเทียบท่าอย่างไรและที่ใด ฉันแก้ไขปัญหานี้โดยเขียนถึงตัวแปรในการตั้งค่า gitlbab:

ชื่อสปอยล์การตั้งค่าซีดีผ่าน gitlab

เพียงส่งออกเนื้อหาของใบรับรองและคีย์ผ่าน cat: cat ca.pem. คัดลอกและวางลงในค่าตัวแปร

มาเขียนสคริปต์เพื่อใช้งานผ่าน gitlab กันเถอะ จะใช้อิมเมจ docker-in-docker (dind)

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

เนื้อหาของสคริปต์การปรับใช้พร้อมความคิดเห็น:

ถัง/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

ปัญหาหลักคือการ "ดึง" เนื้อหาของใบรับรองในรูปแบบปกติออกจากตัวแปร gitlab CI / CD ฉันไม่เข้าใจว่าทำไมการเชื่อมต่อกับรีโมตโฮสต์จึงไม่ทำงาน ฉันดูที่บันทึก sudo journalctl -u docker บนโฮสต์ มีข้อผิดพลาดกับการจับมือกัน ฉันตัดสินใจที่จะดูสิ่งที่ถูกเก็บไว้ในตัวแปรโดยทั่วไป สำหรับสิ่งนี้ คุณสามารถดู cat -A $DOCKER_CERT_PATH/key.pem แก้ไขข้อผิดพลาดโดยเพิ่มการลบอักขระคาเร็ต tr -d 'r'

นอกจากนี้ คุณสามารถเพิ่มงานหลังเผยแพร่ให้กับสคริปต์ได้ตามดุลยพินิจของคุณ คุณสามารถตรวจสอบเวอร์ชันที่ใช้งานได้ในที่เก็บของฉัน https://gitlab.com/isqad/gitlab-ci-cd

ที่มา: will.com

เพิ่มความคิดเห็น