میں نے ایک بار اپنے پروجیکٹ کی تعیناتی کو خودکار کرنے کے بارے میں سوچا۔ gitlab.com برائے مہربانی اس کے لیے تمام ٹولز فراہم کرتا ہے، اور یقیناً میں نے اس سے فائدہ اٹھانے کا فیصلہ کیا، اس کا پتہ لگا کر اور ایک چھوٹی تعیناتی اسکرپٹ لکھی۔ اس مضمون میں میں کمیونٹی کے ساتھ اپنے تجربے کا اشتراک کرتا ہوں۔
TL؛ ڈاکٹر
VPS سیٹ اپ کریں: روٹ کو غیر فعال کریں، پاس ورڈ کے ساتھ لاگ ان کریں، dockerd انسٹال کریں، ufw کنفیگر کریں
سرٹیفکیٹس کے مواد کے ساتھ CI/CD سیٹنگز میں gitlab متغیرات میں رجسٹر ہوں۔ تعیناتی کے لیے ایک اسکرپٹ .gitlab-ci.yml لکھیں۔
میں Debian کی تقسیم پر تمام مثالیں دکھاؤں گا۔
ابتدائی VPS سیٹ اپ
تو آپ نے مثال کے طور پر ایک مثال خریدی۔ DOسب سے پہلے آپ کو اپنے سرور کو جارحانہ بیرونی دنیا سے بچانا ہے۔ میں کچھ ثابت یا دعویٰ نہیں کروں گا، میں صرف اپنے ورچوئل سرور کے log/var/log/messages دکھاؤں گا۔
اسکرین شاٹ
سب سے پہلے، ufw فائر وال انسٹال کریں:
apt-get update && apt-get install ufw
آئیے پہلے سے طے شدہ پالیسی کو فعال کریں: تمام آنے والے کنکشن کو بلاک کریں، تمام باہر جانے والے کنکشن کی اجازت دیں:
سرور آئی پی آپ کا ہونا ضروری ہے۔ اب اس صارف کو استعمال کرکے لاگ ان کرنے کی کوشش کریں جسے آپ نے پہلے بنایا تھا؛ اب آپ کو پاس ورڈ درج کرنے کی ضرورت نہیں ہے۔ اگلا، ترتیب کی ترتیبات میں، درج ذیل کو تبدیل کریں:
sudo nano /etc/ssh/sshd_config
پاس ورڈ لاگ ان کو غیر فعال کریں:
PasswordAuthentication no
sshd ڈیمون کو دوبارہ شروع کریں:
sudo systemctl reload sshd
اب اگر آپ یا کوئی اور روٹ صارف کے طور پر لاگ ان کرنے کی کوشش کرتا ہے تو یہ کام نہیں کرے گا۔
اس کے بعد، dockerd انسٹال کریں، میں یہاں اس عمل کی وضاحت نہیں کروں گا، کیونکہ سب کچھ پہلے ہی تبدیل کیا جا سکتا ہے، سرکاری ویب سائٹ کے لنک پر عمل کریں اور اپنی ورچوئل مشین پر ڈوکر انسٹال کرنے کے مراحل سے گزریں: https://docs.docker.com/install/linux/docker-ce/debian/
سرٹیفکیٹ تیار کرنا
ڈوکر ڈیمون کو دور سے کنٹرول کرنے کے لیے، ایک خفیہ کردہ 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 ڈائرکٹری میں رکھا جانا چاہیے۔
dockerd ترتیب دینا
ڈوکر ڈیمون لانچ اسکرپٹ میں، ہم -H df:// آپشن کو ہٹاتے ہیں، یہ آپشن اس بات کا تعین کرتا ہے کہ کس میزبان پر ڈوکر ڈیمون کو کنٹرول کیا جا سکتا ہے۔
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
اگلا، آپ کو ترتیبات کی فائل بنانا چاہئے، اگر یہ پہلے سے موجود نہیں ہے، اور اختیارات کی وضاحت کریں:
اگر سب کچھ "سبز" ہے، تو ہم سمجھتے ہیں کہ ہم نے سرور پر ڈوکر کو کامیابی سے کنفیگر کر لیا ہے۔
gitlab پر مسلسل ڈیلیوری ترتیب دینا
گیٹلابا ورکر کے لیے ریموٹ ڈوکر ہوسٹ پر کمانڈز پر عمل درآمد کرنے کے قابل ہونے کے لیے، یہ فیصلہ کرنا ضروری ہے کہ سرٹیفکیٹس کو کیسے اور کہاں اسٹور کیا جائے اور Dockerd کے ساتھ انکرپٹڈ کنکشن کی کلید۔ میں نے gitlbab کی ترتیبات میں متغیرات میں درج ذیل کو شامل کرکے اس مسئلے کو حل کیا:
سپوئلر ٹائٹل
صرف سرٹیفکیٹ کے مواد اور کلید کو بلی کے ذریعے آؤٹ پٹ کریں: cat ca.pem. متغیر اقدار میں کاپی اور پیسٹ کریں۔
آئیے GitLab کے ذریعے تعیناتی کے لیے اسکرپٹ لکھیں۔ docker-in-docker (dind) تصویر استعمال کی جائے گی۔
#!/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
اصل مسئلہ سرٹیفکیٹس کے مواد کو گٹلیب CI/CD متغیرات سے عام شکل میں "کھینچنا" تھا۔ میں یہ نہیں سمجھ سکا کہ ریموٹ ہوسٹ سے کنکشن کیوں کام نہیں کر رہا ہے۔ میزبان پر میں نے log sudo journalctl -u docker کو دیکھا، مصافحہ کے دوران ایک خرابی تھی۔ میں نے یہ دیکھنے کا فیصلہ کیا کہ عام طور پر متغیرات میں کیا ذخیرہ کیا جاتا ہے؛ ایسا کرنے کے لیے، آپ اس طرح دیکھ سکتے ہیں: cat -A $DOCKER_CERT_PATH/key.pem۔ میں نے کیریج کریکٹر tr -d 'r' کو ہٹا کر غلطی پر قابو پا لیا۔
اس کے بعد، آپ اپنی صوابدید پر اسکرپٹ میں ریلیز کے بعد کے کام شامل کر سکتے ہیں۔ آپ میرے ذخیرے میں ورکنگ ورژن دیکھ سکتے ہیں۔ https://gitlab.com/isqad/gitlab-ci-cd