نصب و پیکربندی Drone CI/CD روی Ubuntu 24.04 LTS

مقدمه

امروزه استفاده از CI/CD به یکی از مهم‌ترین بخش‌های توسعه نرم‌افزار تبدیل شده است. هرچه فرآیند Build، Test و Deploy خودکارتر باشد، سرعت توسعه افزایش پیدا می‌کند و احتمال بروز خطاهای انسانی نیز کاهش می‌یابد.

Drone CI یک پلتفرم متن‌باز برای پیاده‌سازی CI/CD است که با زبان Go توسعه داده شده و به‌صورت Container-Native طراحی شده است. برخلاف بسیاری از ابزارهای مشابه، Drone به‌صورت کامل روی Docker و Kubernetes تمرکز دارد و تمامی Pipelineها را از طریق فایل‌های متنی قابل نسخه‌بندی اجرا می‌کند.

پیکربندی Drone در قالب فایل‌های زیر انجام می‌شود:

  • YAML (رایج‌ترین روش)
  • JSON
  • JSONNet
  • Starlark

هر Pipeline شامل چندین مرحله (Step) است که به‌ترتیب یا به‌صورت موازی اجرا می‌شوند.


Drone از چه سرویس‌هایی پشتیبانی می‌کند؟

Drone با اکثر سرویس‌های محبوب مدیریت سورس‌کد سازگار است. از جمله:

  • GitHub
  • GitHub Enterprise
  • Bitbucket Cloud
  • Bitbucket Server
  • Gitea

پس از اتصال به یکی از این سرویس‌ها، Drone به‌صورت خودکار Commitها و Pull Requestها را بررسی کرده و Pipelineهای تعریف‌شده را اجرا می‌کند.


Runner در Drone چیست؟

خود Drone تنها نقش مدیریت Pipelineها را برعهده دارد و اجرای واقعی Jobها توسط Runner انجام می‌شود.

Runnerهای مختلفی برای Drone وجود دارد که هرکدام کاربرد خاص خود را دارند.

Docker Runner

رایج‌ترین و پایدارترین Runner محسوب می‌شود.

در این حالت هر Step از Pipeline داخل یک Container مستقل اجرا می‌شود که باعث ایزوله شدن محیط اجرا خواهد شد.

این Runner برای اکثر پروژه‌ها بهترین انتخاب است.


Kubernetes Runner

اگر زیرساخت شما مبتنی بر Kubernetes باشد، می‌توانید از Kubernetes Runner استفاده کنید.

این Runner هر Pipeline را به‌صورت یک Pod اجرا می‌کند و برای پروژه‌هایی که روی کلاستر Kubernetes قرار دارند گزینه مناسبی است.


Exec Runner

در این حالت دستورات مستقیماً روی سیستم‌عامل اجرا می‌شوند و هیچ ایزوله‌سازی وجود ندارد.

به همین دلیل تنها برای Repositoryهایی که کاملاً مورد اعتماد هستند توصیه می‌شود.


SSH Runner

مشابه Exec Runner است؛ با این تفاوت که دستورات از طریق SSH روی یک سرور دیگر اجرا می‌شوند.


Runner مبتنی بر ماشین مجازی

Drone امکان اجرای Pipeline روی ماشین‌های مجازی ابری را نیز فراهم می‌کند.

در نسخه اصلی Drone این قابلیت برای برخی ارائه‌دهندگان Cloud وجود دارد؛ اما اگر از Parmin Cloud استفاده می‌کنید، می‌توانید همین معماری را با ماشین‌های مجازی پارمین کلود نیز پیاده‌سازی کنید و در صورت نیاز فرآیند مقیاس‌پذیری (Auto Scaling) را با ابزارهای مدیریت زیرساخت مانند Terraform یا Ansible خودکار کنید.


در این آموزش چه مواردی را یاد می‌گیرید؟

در این راهنما یک سرور کامل Drone CI روی Ubuntu 24.04 LTS راه‌اندازی خواهیم کرد.

در ادامه نیز موارد زیر را پیاده‌سازی می‌کنیم:

  • نصب Docker با استفاده از Mirrorهای پارمین کلود
  • راه‌اندازی Drone Server
  • اتصال Drone به GitHub
  • راه‌اندازی Docker Runner
  • فعال‌سازی HTTPS با Let’s Encrypt
  • ساخت اولین Pipeline با فایل .drone.yml
  • آشنایی با قابلیت Auto Scaling
  • ذخیره لاگ‌های Build روی فضای ذخیره‌سازی سازگار با S3

در پایان نیز یک زیرساخت CI/CD کاملاً عملیاتی خواهید داشت که می‌توانید از آن برای پروژه‌های شخصی یا سازمانی خود استفاده کنید.


پیش‌نیازها

برای انجام این آموزش به موارد زیر نیاز دارید:

  • یک سرور Ubuntu 24.04 LTS
  • حداقل:
    • ۱ گیگابایت RAM
    • ۲ گیگابایت فضای خالی دیسک (برای نصب اولیه)
  • یک کاربر دارای دسترسی sudo
  • یک دامنه یا زیردامنه (مانند drone.example.com) که رکورد A آن به IP سرور اشاره کند.
  • نصب Docker روی سرور (در بخش بعدی با استفاده از Mirrorهای پارمین کلود انجام خواهیم داد.)
  • یک حساب GitHub
  • (اختیاری) فضای ذخیره‌سازی سازگار با S3 برای نگهداری لاگ‌های Build
  • (اختیاری) ماشین‌های مجازی پارمین کلود برای راه‌اندازی Runnerهای مقیاس‌پذیر

مرحله اول — نصب Docker روی Ubuntu 24.04 با استفاده از Mirror پارمین کلود

از آنجایی که Drone به‌صورت کامل بر پایه Docker اجرا می‌شود، ابتدا باید Docker را روی سرور نصب کنیم.

در این آموزش به‌جای استفاده از مخازن رسمی Docker، از Mirrorهای پارمین کلود استفاده می‌کنیم تا دانلود بسته‌ها با سرعت و پایداری بیشتری انجام شود.


بروزرسانی سیستم

ابتدا فهرست بسته‌ها را بروزرسانی کرده و آخرین نسخه بسته‌های نصب‌شده را دریافت کنید.

sudo apt update
sudo apt upgrade -y

نصب پیش‌نیازها

سپس ابزارهای موردنیاز برای اضافه کردن Repository جدید را نصب کنید.

sudo apt install \
ca-certificates \
curl \
gnupg \
lsb-release -y

اضافه کردن GPG Key پارمین کلود

دایرکتوری مربوط به کلیدهای امنیتی APT را ایجاد کنید.

sudo install -m 0755 -d /etc/apt/keyrings

سپس کلید GPG پارمین کلود را دریافت کنید.

curl -fsSL https://docker-ce.parmincloud.ir/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

سطح دسترسی فایل را نیز تنظیم کنید.

sudo chmod a+r /etc/apt/keyrings/docker.gpg

اضافه کردن Repository پارمین کلود

اکنون مخزن Docker پارمین کلود را به سیستم اضافه کنید.

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://docker-ce.parmincloud.ir $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

سپس لیست بسته‌ها را مجدداً بروزرسانی کنید.

sudo apt update

نصب Docker Engine

اکنون Docker و ابزارهای موردنیاز آن را نصب کنید.

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

فعال‌سازی Docker

پس از نصب، سرویس Docker را فعال و اجرا کنید.

sudo systemctl enable --now docker

بررسی وضعیت سرویس:

sudo systemctl status docker

در صورت نصب صحیح، خروجی مشابه زیر مشاهده خواهید کرد.

Active: active (running)

اضافه کردن کاربر به گروه Docker

برای اینکه بدون استفاده از sudo بتوانید دستورات Docker را اجرا کنید، کاربر فعلی را به گروه Docker اضافه نمایید.

sudo usermod -aG docker $USER

سپس یک‌بار از سیستم خارج شده و مجدداً وارد شوید یا دستور زیر را اجرا کنید.

newgrp docker

بررسی نصب Docker

برای اطمینان از نصب صحیح Docker دستور زیر را اجرا کنید.

docker version

همچنین می‌توانید با اجرای کانتینر آزمایشی صحت عملکرد Docker را بررسی کنید.

docker run hello-world

استفاده از Mirror رجیستری پارمین کلود

برای افزایش سرعت دانلود Imageها، پیشنهاد می‌شود از Mirrorهای رجیستری پارمین کلود استفاده کنید.

نمونه:

docker pull hub.cr.parmincloud.ir/library/alpine:latest

یا

docker pull ghcr.cr.parmincloud.ir/actions/runner:latest

در صورت نیاز می‌توانید از سایر Mirrorها نیز استفاده کنید:

  • hub.cr.parmincloud.ir
  • ghcr.cr.parmincloud.ir
  • quay.cr.parmincloud.ir
  • gcr.cr.parmincloud.ir
  • gitlab.cr.parmincloud.ir
  • k8s.cr.parmincloud.ir

اکنون Docker روی سرور نصب شده و آماده راه‌اندازی Drone است.


مرحله دوم — ایجاد OAuth Application در GitHub

برای اینکه Drone بتواند به مخازن GitHub دسترسی داشته باشد، کاربران را احراز هویت کند و هنگام Push یا Pull Request به‌صورت خودکار Pipelineها را اجرا کند، باید یک OAuth Application در GitHub ایجاد کنید.

در این مرحله یک برنامه OAuth ساخته و اطلاعات آن را برای پیکربندی Drone دریافت می‌کنیم.


وارد تنظیمات GitHub شوید

ابتدا وارد حساب GitHub خود شوید.

سپس از منوی بالا سمت راست روی تصویر پروفایل خود کلیک کرده و مسیر زیر را باز کنید:

Settings
    └── Developer settings
            └── OAuth Apps

یا مستقیماً وارد صفحه زیر شوید:

https://github.com/settings/developers

ایجاد OAuth App جدید

روی گزینه New OAuth App کلیک کنید.

فرم ایجاد برنامه را مطابق اطلاعات زیر تکمیل نمایید.

فیلد مقدار
Application name Drone CI
Homepage URL https://drone.example.com
Application description Drone CI/CD Server
Authorization callback URL https://drone.example.com/login

به‌جای drone.example.com دامنه یا زیردامنه واقعی خود را وارد کنید.

نمونه:

Homepage URL

https://drone.parmincloud.ir

Authorization callback URL

https://drone.parmincloud.ir/login

پس از تکمیل فرم روی Register Application کلیک کنید.


دریافت Client ID و Client Secret

بعد از ایجاد برنامه، صفحه اطلاعات آن نمایش داده می‌شود.

در این صفحه دو مقدار بسیار مهم وجود دارد:

  • Client ID
  • Client Secret

روی گزینه Generate a new client secret کلیک کنید.

سپس هر دو مقدار را در محل امنی ذخیره نمایید.

در ادامه آموزش از این دو مقدار استفاده خواهیم کرد.

به عنوان مثال:

Client ID

Ov23liwxxxxxxxxxxxx

Client Secret

c5d18bxxxxxxxxxxxxxxxxxxxxxxxx

نکته امنیتی

Client Secret تنها یک بار نمایش داده می‌شود.

در صورتی که آن را ذخیره نکنید، باید Secret جدیدی ایجاد کنید.

همچنین این اطلاعات را در مخازن Git یا فایل‌های عمومی قرار ندهید.


این مرحله چه کاری انجام داد؟

با انجام این مرحله، GitHub به Drone اجازه خواهد داد که:

  • کاربران را از طریق GitHub احراز هویت کند.
  • Repositoryها را مشاهده کند.
  • Webhookهای موردنیاز را ایجاد کند.
  • پس از هر Push یا Pull Request، Pipelineها را اجرا کند.

مرحله سوم — پیکربندی اولیه Drone Server

در این مرحله فایل تنظیمات اصلی Drone را ایجاد می‌کنیم و اطلاعات موردنیاز برای ارتباط با GitHub و Runnerها را در آن قرار می‌دهیم.

این فایل هنگام اجرای کانتینر Drone به‌عنوان فایل Environment استفاده خواهد شد.


تولید RPC Secret

Drone برای برقراری ارتباط امن بین Server و Runner از یک Secret مشترک استفاده می‌کند.

ابتدا یک مقدار تصادفی تولید کنید.

openssl rand -hex 32

خروجی مشابه زیر خواهد بود.

3b81c8f1e1a4d4c8d7e87d8d3cfaf57d0d2f33d1b9e1d7d92bdfab8a3d87d61f

این مقدار را در جایی ذخیره کنید؛ در ادامه آموزش چندین بار از آن استفاده خواهیم کرد.


ایجاد فایل تنظیمات Drone

اکنون فایل تنظیمات Drone را ایجاد می‌کنیم.

sudo nano /etc/drone

محتوای زیر را داخل فایل قرار دهید.

DRONE_SERVER_HOST=drone.example.com
DRONE_SERVER_PROTO=https

DRONE_GITHUB_CLIENT_ID=YOUR_GITHUB_CLIENT_ID
DRONE_GITHUB_CLIENT_SECRET=YOUR_GITHUB_CLIENT_SECRET

DRONE_RPC_SECRET=YOUR_RPC_SECRET

DRONE_USER_CREATE=username:YOUR_GITHUB_USERNAME,admin:true

مقادیر زیر را متناسب با محیط خود جایگزین کنید.

متغیر توضیح
DRONE_SERVER_HOST دامنه Drone
DRONE_GITHUB_CLIENT_ID Client ID دریافتی از GitHub
DRONE_GITHUB_CLIENT_SECRET Client Secret دریافتی
DRONE_RPC_SECRET Secret تولیدشده با OpenSSL
DRONE_USER_CREATE نام کاربری GitHub مدیر Drone

نمونه فایل

برای مثال اگر دامنه شما drone.parmincloud.ir باشد فایل به شکل زیر خواهد بود.

DRONE_SERVER_HOST=drone.parmincloud.ir
DRONE_SERVER_PROTO=https

DRONE_GITHUB_CLIENT_ID=Ov23xxxxxxxxxxxxx
DRONE_GITHUB_CLIENT_SECRET=GOCSPX-xxxxxxxxxxxxxxxx

DRONE_RPC_SECRET=3b81c8f1e1a4d4c8d7e87d8d3cfaf57d0d2f33d1b9e1d7d92bdfab8a3d87d61f

DRONE_USER_CREATE=username:parmincloud,admin:true

محدود کردن کاربران مجاز

به‌صورت پیش‌فرض هر کاربری که بتواند از طریق GitHub وارد Drone شود، امکان استفاده از آن را خواهد داشت.

در محیط‌های عملیاتی بهتر است فقط کاربران یا سازمان‌های مشخص اجازه ورود داشته باشند.

برای محدود کردن کاربران، دستور زیر را اجرا کنید.

echo "DRONE_USER_FILTER=username1,username2,parmincloud" | sudo tee -a /etc/drone

یا اگر می‌خواهید فقط اعضای یک Organization بتوانند وارد شوند:

echo "DRONE_USER_FILTER=ParminCloud" | sudo tee -a /etc/drone

فعال کردن دریافت خودکار گواهی SSL

Drone می‌تواند به‌صورت خودکار با استفاده از Let’s Encrypt گواهی SSL دریافت کند.

اگر از Reverse Proxy مانند Nginx یا Traefik استفاده نمی‌کنید، این گزینه را فعال نمایید.

echo "DRONE_TLS_AUTOCERT=true" | sudo tee -a /etc/drone

اگر قصد دارید Drone را پشت Nginx اجرا کنید (که در محیط‌های Production توصیه می‌شود)، این گزینه را فعال نکنید و SSL را توسط Nginx مدیریت کنید.


مشاهده فایل تنظیمات

برای بررسی فایل ایجادشده:

cat /etc/drone

خروجی باید مشابه زیر باشد.

DRONE_SERVER_HOST=drone.parmincloud.ir
DRONE_SERVER_PROTO=https

DRONE_GITHUB_CLIENT_ID=xxxxxxxxxxxx
DRONE_GITHUB_CLIENT_SECRET=xxxxxxxxxxxx

DRONE_RPC_SECRET=xxxxxxxxxxxxxxxxxxxxxxxx

DRONE_USER_CREATE=username:parmincloud,admin:true
DRONE_USER_FILTER=parmincloud
DRONE_TLS_AUTOCERT=true

نکته امنیتی

این فایل شامل اطلاعات حساسی مانند Client Secret و RPC Secret است.

برای جلوگیری از دسترسی سایر کاربران، سطح دسترسی فایل را محدود کنید.

sudo chmod 600 /etc/drone

این مرحله چه کاری انجام داد؟

در این مرحله:

  • فایل تنظیمات Drone ایجاد شد.
  • ارتباط GitHub با Drone پیکربندی شد.
  • کاربر مدیر مشخص شد.
  • کاربران مجاز محدود شدند.
  • قابلیت دریافت خودکار SSL (در صورت نیاز) فعال شد.
  • فایل تنظیمات از نظر امنیتی محافظت شد.

مرحله چهارم — راه‌اندازی Drone Server

در این مرحله، سرویس اصلی Drone را با استفاده از Docker اجرا می‌کنیم.

Drone تمامی اطلاعات خود را در یک Volume نگهداری می‌کند و تنظیماتی که در مرحله قبل ایجاد کردیم را از فایل /etc/drone بارگذاری خواهد کرد.


دریافت Image مربوط به Drone

ابتدا آخرین نسخه پایدار Drone را دریافت کنید.

نکته

به‌جای Docker Hub از Mirror پارمین کلود استفاده می‌کنیم تا سرعت دانلود بیشتر باشد.

docker pull hub.cr.parmincloud.ir/drone/drone:2

برای مشاهده نسخه دریافت‌شده:

docker images

ایجاد Volume

اطلاعات پایگاه داده و تنظیمات Drone داخل یک Docker Volume ذخیره می‌شود.

docker volume create drone-data

بررسی ایجاد Volume:

docker volume ls

خروجی:

DRIVER    VOLUME NAME
local     drone-data

اجرای Drone Server

اکنون سرویس Drone را اجرا کنید.

docker run -d \
--name drone \
--restart unless-stopped \
--env-file /etc/drone \
-v drone-data:/data \
-p 80:80 \
-p 443:443 \
hub.cr.parmincloud.ir/drone/drone:2

پارامترهای مهم این دستور:

گزینه توضیح
--env-file بارگذاری تنظیمات از فایل /etc/drone
-v drone-data:/data ذخیره اطلاعات Drone
-p 80:80 دسترسی HTTP
-p 443:443 دسترسی HTTPS
--restart unless-stopped اجرای خودکار پس از ریبوت سرور

بررسی وضعیت کانتینر

docker ps

باید خروجی مشابه زیر مشاهده کنید.

CONTAINER ID   IMAGE
xxxxxxxxxx     hub.cr.parmincloud.ir/drone/drone:2

مشاهده لاگ‌ها

اگر سرویس اجرا نشد، لاگ‌ها را بررسی کنید.

docker logs drone

برای مشاهده لاگ‌ها به‌صورت لحظه‌ای:

docker logs -f drone

باز کردن پورت‌ها در Firewall

اگر از UFW استفاده می‌کنید، دسترسی به پورت‌های HTTP و HTTPS را فعال نمایید.

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

سپس وضعیت فایروال را بررسی کنید.

sudo ufw status

نمونه خروجی:

Status: active

To                         Action
80/tcp                     ALLOW
443/tcp                    ALLOW
OpenSSH                    ALLOW

بررسی وضعیت سرویس

پس از چند ثانیه، مرورگر را باز کرده و وارد آدرس زیر شوید.

https://drone.example.com

اگر همه مراحل به‌درستی انجام شده باشد، صفحه ورود Drone نمایش داده می‌شود.


ورود با GitHub

روی گزینه Login with GitHub کلیک کنید.

GitHub از شما می‌خواهد مجوزهای لازم را به Drone بدهید.

پس از تأیید، دوباره به صفحه Drone هدایت خواهید شد.

از آنجایی که در مرحله قبل کاربر مدیر را مشخص کرده بودید، اولین ورود شما با سطح دسترسی Administrator انجام می‌شود.


بررسی سلامت سرویس

برای اطمینان از عملکرد صحیح Drone می‌توانید وضعیت کانتینر را بررسی کنید.

docker inspect drone --format='{{.State.Status}}'

اگر خروجی زیر را مشاهده کردید، سرویس به‌درستی اجرا شده است.

running

همچنین وضعیت مصرف منابع را می‌توانید با دستور زیر مشاهده کنید.

docker stats drone

این مرحله چه کاری انجام داد؟

در این مرحله:

  • آخرین نسخه Drone از Mirror پارمین کلود دریافت شد.
  • Volume اختصاصی برای ذخیره اطلاعات ایجاد شد.
  • کانتینر Drone اجرا شد.
  • پورت‌های موردنیاز در فایروال باز شدند.
  • ورود از طریق GitHub فعال شد.
  • صحت اجرای سرویس بررسی شد.

مرحله پنجم — نصب و راه‌اندازی Docker Runner

تا این مرحله سرور Drone راه‌اندازی شده است، اما هنوز قادر به اجرای Pipelineها نیست. برای اجرای Jobها باید حداقل یک Runner به Drone متصل شود.

در این آموزش از Docker Runner استفاده می‌کنیم؛ زیرا پایدارترین و رایج‌ترین Runner در اکوسیستم Drone است.


دریافت Image مربوط به Runner

ابتدا آخرین نسخه Docker Runner را از Mirror پارمین کلود دریافت کنید.

docker pull hub.cr.parmincloud.ir/drone/drone-runner-docker:1

پس از پایان دانلود، وجود Image را بررسی کنید.

docker images

خروجی مشابه زیر خواهد بود.

REPOSITORY                                          TAG
hub.cr.parmincloud.ir/drone/drone-runner-docker     1
hub.cr.parmincloud.ir/drone/drone                   2

اجرای Docker Runner

اکنون Runner را اجرا کنید.

مقدار DRONE_RPC_SECRET باید دقیقاً همان مقداری باشد که در مرحله سوم تولید کردید.

docker run -d \
--name drone-runner \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=https \
-e DRONE_RPC_HOST=drone.example.com \
-e DRONE_RPC_SECRET=YOUR_RPC_SECRET \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=$(hostname) \
hub.cr.parmincloud.ir/drone/drone-runner-docker:1

توضیح متغیرهای مهم

متغیر توضیح
DRONE_RPC_HOST آدرس سرور Drone
DRONE_RPC_SECRET کلید مشترک بین Runner و Server
DRONE_RUNNER_CAPACITY تعداد Pipelineهایی که هم‌زمان اجرا می‌شوند
DRONE_RUNNER_NAME نام Runner در پنل Drone

افزایش ظرفیت اجرای Pipeline

اگر منابع سخت‌افزاری مناسبی دارید، می‌توانید ظرفیت Runner را افزایش دهید.

مثلاً:

DRONE_RUNNER_CAPACITY=4

یا

DRONE_RUNNER_CAPACITY=8

البته این مقدار باید متناسب با تعداد CPU و حافظه سرور انتخاب شود.


بررسی وضعیت Runner

اکنون بررسی کنید که Runner اجرا شده باشد.

docker ps

باید کانتینری با نام زیر مشاهده کنید.

drone-runner

مشاهده لاگ‌های Runner

برای اطمینان از اتصال Runner به سرور Drone:

docker logs drone-runner

در صورت موفق بودن اتصال، خروجی مشابه زیر نمایش داده می‌شود.

starting the server

successfully pinged the remote server

polling the remote server

وجود پیام

successfully pinged the remote server

به این معنی است که ارتباط Runner با Drone Server برقرار شده است.


بررسی Runner از داخل پنل Drone

وارد پنل Drone شوید.

از منوی بالا وارد بخش:

Admin
    ↓
Runners

شوید.

Runner جدید باید با وضعیت Online نمایش داده شود.

اگر Runner در وضعیت Offline بود، معمولاً یکی از موارد زیر علت آن است:

  • مقدار DRONE_RPC_SECRET اشتباه است.
  • دامنه DRONE_RPC_HOST نادرست وارد شده است.
  • ارتباط HTTPS برقرار نیست.
  • فایروال مانع اتصال شده است.

تغییر تنظیمات Runner

اگر بعداً قصد تغییر تنظیمات Runner را داشتید، کافی است کانتینر را حذف و دوباره ایجاد کنید.

حذف کانتینر:

docker rm -f drone-runner

سپس مجدداً دستور docker run را با تنظیمات جدید اجرا کنید.

از آنجایی که Runner داده مهمی ذخیره نمی‌کند، حذف و ایجاد مجدد آن مشکلی ایجاد نخواهد کرد.


بررسی سلامت Runner

برای مشاهده وضعیت مصرف منابع:

docker stats drone-runner

برای بررسی جزئیات بیشتر:

docker inspect drone-runner

این مرحله چه کاری انجام داد؟

در این مرحله:

  • Docker Runner نصب شد.
  • Runner به Drone Server متصل شد.
  • ارتباط امن با استفاده از RPC Secret برقرار شد.
  • امکان اجرای Pipelineها فراهم شد.
  • وضعیت Runner از طریق لاگ‌ها و پنل مدیریت بررسی شد.

مرحله ششم — ایجاد اولین Pipeline در Drone

اکنون که Drone Server و Docker Runner با موفقیت راه‌اندازی شده‌اند، زمان آن رسیده است که اولین Pipeline خود را ایجاد و اجرا کنیم.

در این مرحله یک مخزن GitHub به Drone متصل کرده و اولین فایل Pipeline را می‌سازیم.


ایجاد Repository در GitHub

اگر هنوز Repository ندارید، ابتدا یک Repository جدید در GitHub ایجاد کنید.

برای مثال:

drone-demo

یا هر نام دیگری که مدنظر دارید.


همگام‌سازی Repositoryها در Drone

وارد پنل Drone شوید.

https://drone.example.com

از منوی بالا روی گزینه SYNC کلیک کنید.

Drone لیست Repositoryهای GitHub شما را دریافت خواهد کرد.

پس از چند ثانیه Repository جدید نمایش داده می‌شود.


فعال کردن Repository

کنار Repository موردنظر روی دکمه ACTIVATE کلیک کنید.

با این کار Drone به‌صورت خودکار Webhook مربوط به Repository را در GitHub ایجاد می‌کند.

از این پس با هر Push یا Pull Request، Pipeline اجرا خواهد شد.


ایجاد فایل Pipeline

در ریشه Repository فایل زیر را ایجاد کنید.

.drone.yml

محتوای فایل:

kind: pipeline
type: docker
name: default

steps:
  - name: test
    image: hub.cr.parmincloud.ir/library/alpine:latest
    commands:
      - echo "Hello from Drone CI!"
      - uname -a
      - date

چرا از Mirror پارمین کلود استفاده کردیم؟

در آموزش اصلی از Image زیر استفاده شده بود.

alpine

که از Docker Hub دریافت می‌شود.

در این آموزش از Mirror پارمین کلود استفاده می‌کنیم.

hub.cr.parmincloud.ir/library/alpine:latest

در نتیجه دانلود Imageها با سرعت بسیار بیشتری انجام خواهد شد.


Commit و Push

پس از ایجاد فایل، تغییرات را Commit و Push کنید.

git add .

git commit -m "Add Drone pipeline"

git push origin main

اگر شاخه اصلی پروژه شما master است، به‌جای main از همان استفاده کنید.


اجرای Pipeline

به محض انجام Push، وارد پنل Drone شوید.

Repository را باز کنید.

Pipeline جدید به‌صورت خودکار ایجاد شده است.

مراحل اجرا را مشاهده خواهید کرد.

Pending
↓

Running
↓

Success

مشاهده لاگ‌ها

روی Pipeline اجراشده کلیک کنید.

در مرحله test خروجی مشابه زیر مشاهده خواهید کرد.

Hello from Drone CI!

Linux ...

Tue Jul ...

اگر این خروجی را مشاهده کردید، یعنی ارتباط بین:

  • GitHub
  • Drone Server
  • Docker Runner

به‌درستی برقرار شده است.


اگر Pipeline اجرا نشد

در صورت Pending ماندن Pipeline موارد زیر را بررسی کنید:

وضعیت Runner

docker logs drone-runner

وضعیت Drone

docker logs drone

بررسی Webhook

در GitHub مسیر زیر را بررسی کنید.

Repository

↓

Settings

↓

Webhooks

باید یک Webhook مربوط به Drone وجود داشته باشد.

آخرین درخواست نیز باید وضعیت 200 OK داشته باشد.


بررسی Runner

docker ps

وجود کانتینر

drone-runner

الزامی است.


بررسی RPC Secret

مقدار

DRONE_RPC_SECRET

در فایل

/etc/drone

و Runner باید کاملاً یکسان باشد.


اجرای Pipeline مجدد

برای اجرای دوباره Pipeline نیازی به تغییر فایل نیست.

کافی است یک Commit جدید ارسال کنید.

git commit --allow-empty -m "Run pipeline"

git push

نمونه Pipeline ساده‌تر

kind: pipeline
type: docker
name: default

steps:
  - name: Build
    image: hub.cr.parmincloud.ir/library/alpine:latest
    commands:
      - echo "Build Started"

  - name: Test
    image: hub.cr.parmincloud.ir/library/alpine:latest
    commands:
      - echo "Running Tests"

  - name: Deploy
    image: hub.cr.parmincloud.ir/library/alpine:latest
    commands:
      - echo "Deploy Completed"

این مرحله چه کاری انجام داد؟

در این مرحله:

  • Repository به Drone متصل شد.
  • Webhook به‌صورت خودکار ایجاد شد.
  • اولین فایل .drone.yml ساخته شد.
  • اولین Pipeline اجرا شد.
  • نحوه بررسی لاگ‌ها و عیب‌یابی Pipelineها را یاد گرفتید.

مرحله هفتم — استفاده از Secrets و ساخت Pipelineهای کاربردی در Drone

در پروژه‌های واقعی معمولاً اطلاعات حساسی مانند Tokenها، Passwordها، API Keyها و SSH Keyها وجود دارند. قرار دادن این اطلاعات داخل فایل .drone.yml یا مخزن Git، یک ریسک امنیتی جدی محسوب می‌شود.

در Drone می‌توانید این اطلاعات را به‌صورت Secret ذخیره کنید و هنگام اجرای Pipeline از آن‌ها استفاده نمایید.


ایجاد Secret

از پنل Drone وارد Repository موردنظر شوید.

سپس مسیر زیر را باز کنید:

Repository
    ↓
Settings
        ↓
Secrets

روی Add Secret کلیک کنید.

به‌عنوان مثال:

Name Value
DOCKER_USERNAME your_username
DOCKER_PASSWORD your_password

استفاده از Secret در Pipeline

فرض کنید دو Secret با نام‌های زیر ایجاد کرده‌اید.

DOCKER_USERNAME
DOCKER_PASSWORD

اکنون می‌توانید آن‌ها را داخل Pipeline استفاده کنید.

kind: pipeline
type: docker
name: default

steps:
  - name: Login
    image: hub.cr.parmincloud.ir/library/docker:cli

    environment:
      USERNAME:
        from_secret: DOCKER_USERNAME

      PASSWORD:
        from_secret: DOCKER_PASSWORD

    commands:
      - echo "$PASSWORD" | docker login -u "$USERNAME" --password-stdin hub.cr.parmincloud.ir

نمونه Pipeline برای پروژه Node.js

kind: pipeline
type: docker
name: node

steps:

- name: Install Dependencies
  image: hub.cr.parmincloud.ir/library/node:22-alpine

  commands:
    - npm config set registry https://npm.parmincloud.ir
    - npm install

- name: Run Tests
  image: hub.cr.parmincloud.ir/library/node:22-alpine

  commands:
    - npm test

- name: Build
  image: hub.cr.parmincloud.ir/library/node:22-alpine

  commands:
    - npm run build

در این مثال، رجیستری NPM به Mirror پارمین کلود تغییر داده شده است.


نمونه Pipeline برای Python

kind: pipeline
type: docker
name: python

steps:

- name: Install Packages
  image: hub.cr.parmincloud.ir/library/python:3.12

  commands:
    - pip config set global.index-url https://pypi.parmincloud.ir/simple/
    - pip install -r requirements.txt

- name: Test
  image: hub.cr.parmincloud.ir/library/python:3.12

  commands:
    - pytest

در این Pipeline از Mirror پکیج‌های Python پارمین کلود استفاده شده است.


نمونه Pipeline برای PHP و Composer

kind: pipeline
type: docker
name: php

steps:

- name: Install Dependencies
  image: hub.cr.parmincloud.ir/library/composer:2

  commands:
    - composer config repo.packagist composer https://composer.parmincloud.ir
    - composer install

- name: PHPUnit
  image: hub.cr.parmincloud.ir/library/php:8.3-cli

  commands:
    - ./vendor/bin/phpunit

نمونه Pipeline برای ساخت Image

kind: pipeline
type: docker
name: docker-build

steps:

- name: Build Image

  image: hub.cr.parmincloud.ir/plugins/docker

  settings:
    registry: hub.cr.parmincloud.ir
    repo: hub.cr.parmincloud.ir/example/myapp
    tags:
      - latest

    username:
      from_secret: docker_username

    password:
      from_secret: docker_password

در این مثال Image مستقیماً در رجیستری پارمین کلود Push می‌شود.


اجرای Pipeline فقط روی شاخه مشخص

trigger:

  branch:
    - main

یا

trigger:

  branch:
    - production

اجرای Pipeline فقط هنگام Push

trigger:

  event:
    - push

اجرای Pipeline فقط هنگام Pull Request

trigger:

  event:
    - pull_request

اجرای مراحل به‌صورت موازی

steps:

- name: Test 1
  image: hub.cr.parmincloud.ir/library/alpine

  commands:
    - echo Test1

- name: Test 2
  image: hub.cr.parmincloud.ir/library/alpine

  commands:
    - echo Test2

Drone در صورت نبود وابستگی بین مراحل، آن‌ها را به‌صورت موازی اجرا می‌کند و زمان اجرای Pipeline کاهش می‌یابد.


مشاهده تاریخچه Pipelineها

در پنل Drone می‌توانید برای هر Repository موارد زیر را مشاهده کنید:

  • وضعیت اجرا
  • مدت زمان اجرا
  • لاگ کامل هر مرحله
  • Runner اجراکننده
  • Commit مربوطه
  • نویسنده Commit

این اطلاعات به شما کمک می‌کند مشکلات Pipelineها را سریع‌تر شناسایی و رفع کنید.


این مرحله چه کاری انجام داد؟

در این مرحله:

  • نحوه ایجاد و استفاده از Secretها را یاد گرفتید.
  • چند Pipeline آماده برای Node.js، Python، PHP و Docker معرفی شد.
  • استفاده از Mirrorهای پارمین کلود برای NPM، PyPI، Composer و Docker Registry اعمال شد.
  • نحوه محدود کردن اجرای Pipeline بر اساس Branch یا Event را بررسی کردیم.
  • با اجرای موازی مراحل و امکانات مدیریتی Drone آشنا شدید.

نتیجه‌گیری

اکنون یک زیرساخت کامل CI/CD مبتنی بر Drone در اختیار دارید که شامل:

  • راه‌اندازی Drone Server
  • اتصال به GitHub
  • نصب Docker Runner
  • اجرای Pipelineها
  • مدیریت Secretها
  • استفاده از رجیستری‌ها و Mirrorهای پارمین کلود
  • اجرای Build، Test و Deploy به‌صورت خودکار

است و می‌توانید آن را برای انواع پروژه‌های نرم‌افزاری در محیط Production استفاده کنید.

از همراهی شما با پارمین کلود سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *