Tôi đã từng nghĩ về việc tự động hóa việc triển khai dự án của mình. gitlab.com vui lòng cung cấp tất cả các công cụ cho việc này và tất nhiên tôi đã quyết định sử dụng nó bằng cách tìm ra nó và viết một tập lệnh triển khai nhỏ. Trong bài viết này, tôi chia sẻ kinh nghiệm của mình với cộng đồng.
TL; DR
Thiết lập VPS: vô hiệu hóa root, mật khẩu đăng nhập, cài đặt dockerd, cấu hình ufw
Đăng ký các biến gitlab trong cài đặt CI / CD với nội dung của chứng chỉ. Viết tập lệnh .gitlab-ci.yml để triển khai.
Tôi sẽ hiển thị tất cả các ví dụ về bản phân phối Debian.
Thiết lập VPS ban đầu
Ở đây bạn đã mua một phiên bản chẳng hạn trên DO, điều đầu tiên cần làm là bảo vệ máy chủ của bạn khỏi thế giới hung hãn bên ngoài. Tôi sẽ không chứng minh hay khẳng định bất cứ điều gì, tôi sẽ chỉ hiển thị nhật ký /var/log/messages của máy chủ ảo của mình:
Ảnh chụp màn hình
Đầu tiên, cài đặt tường lửa ufw:
apt-get update && apt-get install ufw
Kích hoạt chính sách mặc định: chặn tất cả các kết nối đến, cho phép tất cả các kết nối đi:
IP của máy chủ phải là của bạn. Bây giờ bạn hãy thử đăng nhập theo user đã tạo trước đó, bạn không cần nhập mật khẩu nữa. Tiếp theo, trong cài đặt cấu hình, thay đổi như sau:
sudo nano /etc/ssh/sshd_config
vô hiệu hóa mật khẩu đăng nhập:
PasswordAuthentication no
Khởi động lại trình nền sshd:
sudo systemctl reload sshd
Bây giờ nếu bạn hoặc ai đó cố gắng đăng nhập với quyền root, nó sẽ không thành công.
Tiếp theo, chúng tôi cài đặt dockerd, tôi sẽ không mô tả quy trình ở đây, vì mọi thứ đều có thể thay đổi được, hãy nhấp vào liên kết đến trang web chính thức và thực hiện các bước cài đặt docker trên máy ảo của bạn: https://docs.docker.com/install/linux/docker-ce/debian/
Tạo chứng chỉ
Để điều khiển trình nền docker từ xa, cần có kết nối TLS được mã hóa. Để thực hiện việc này, bạn cần có chứng chỉ và khóa mà bạn cần tạo và chuyển sang máy từ xa của mình. Thực hiện theo các bước được đưa ra trong hướng dẫn trên trang web docker chính thức: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Tất cả các tệp *.pem được tạo cho máy chủ, cụ thể là ca.pem, server.pem, key.pem, phải được đặt trong thư mục /etc/docker trên máy chủ.
thiết lập docker
Trong tập lệnh khởi động docker daemon, hãy xóa tùy chọn -H df://, tùy chọn này cho biết máy chủ nào có thể kiểm soát docker daemon.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Tiếp theo, tạo tệp cài đặt nếu nó chưa tồn tại và đặt các tùy chọn:
Nếu mọi thứ đều có màu xanh thì coi như chúng ta đã cấu hình thành công docker trên server.
Thiết lập phân phối liên tục trên gitlab
Để nhân viên gitalab có thể thực thi các lệnh trên máy chủ docker từ xa, bạn cần quyết định cách thức và vị trí lưu trữ chứng chỉ cũng như khóa cho kết nối được mã hóa tới dockerd. Tôi đã giải quyết vấn đề này bằng cách ghi đơn giản vào các biến trong cài đặt gitlbab:
tiêu đề tiết lộ
Chỉ cần xuất nội dung của chứng chỉ và khóa qua cat: cat ca.pem. Sao chép và dán vào các giá trị biến.
Hãy viết một kịch bản để triển khai thông qua gitlab. Hình ảnh docker-in-docker (dind) sẽ được sử dụng.
Nội dung của kịch bản triển khai với các nhận xét:
bin/triển khai.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
Vấn đề chính là "rút" nội dung của các chứng chỉ ở dạng bình thường khỏi các biến CI / CD của gitlab. Tôi không thể hiểu tại sao kết nối với máy chủ từ xa không hoạt động. Tôi đã xem nhật ký docker sudo journalctl -u trên máy chủ, có lỗi khi bắt tay. Tôi quyết định xem xét những gì thường được lưu trữ trong các biến, để biết điều này, bạn có thể xem cat -A $DOCKER_CERT_PATH/key.pem. Đã khắc phục lỗi bằng cách thêm việc xóa ký tự dấu mũ tr -d 'r'.
Ngoài ra, bạn có thể tùy ý thêm các tác vụ sau khi phát hành vào tập lệnh. Bạn có thể kiểm tra phiên bản làm việc trong kho lưu trữ của tôi https://gitlab.com/isqad/gitlab-ci-cd