مقدمه
امروزه استفاده از 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.irghcr.cr.parmincloud.irquay.cr.parmincloud.irgcr.cr.parmincloud.irgitlab.cr.parmincloud.irk8s.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 استفاده کنید.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران