التكامل المستمر/التسليم المستمر على خادم لينكس يُؤتمت هذا النظام بناء واختبار ونشر التعليمات البرمجية مع كل تغيير. لاستخدامه: اختر أداة CI/CD (مثل Jenkins أو GitHub Actions أو GitLab CI)، جهّز خادم Linux آمنًا، اربط مستودعك، اكتب مسارًا (باستخدام YAML أو Jenkinsfile)، وانشر عبر SSH أو Docker مع خاصية التراجع والمراقبة.
إذا كنت تقوم بإعداد التكامل المستمر/التسليم المستمر (CI/CD) على خادم لينكس لأول مرة، فسيرشدك هذا الدليل خلال الأساسيات - اختيار الأدوات، والبنية، والأمان، والإعداد الشامل باستخدام Jenkins أو GitHub Actions. ستتعلم ممارسات مجربة من عمليات نشر حقيقية، بالإضافة إلى استراتيجيات عدم التوقف باستخدام Docker و Nginx.
ما هو التكامل المستمر/التسليم المستمر (CI/CD) على خادم لينكس؟
التكامل المستمر/التسليم المستمر (CI/CD) هو ممارسة بناء البرامج واختبارها ونشرها تلقائيًا بعد إجراء تغييرات على الكود. على خادم لينكس، يتضمن التكامل المستمر/التسليم المستمر عادةً مسارًا يقوم بتجميع تطبيقك، وتشغيل الاختبارات، وبناء عنصر أو صورة حاوية، ثم نشره إلى بيئة الاختبار أو الإنتاج عبر SSH، أو Docker، أو Kubernetes.

لماذا نستخدم التكامل المستمر/التسليم المستمر (CI/CD) على نظام لينكس؟
يُعدّ نظام لينكس مستقرًا وآمنًا ومنتشرًا على نطاق واسع في البنية التحتية للإنتاج. كما أنه يتكامل بسلاسة مع أنظمة Git وsystemd وDocker. Nginxوجدران الحماية، مما يجعلها مثالية لعمليات النشر الآلية الموثوقة. مع التكامل المستمر/التسليم المستمر (CI/CD)، تُصدر الفرق التحديثات بشكل أسرع، وتقلل الأخطاء، وتوحّد الإصدارات، وتفرض الاختبارات - دون الحاجة إلى عمليات تحميل يدوية أو برامج نصية مخصصة.
المتطلبات الأساسية وقائمة التحقق من البيئة
- خادم لينكس (يوصى بنظام أوبونتو 22.04+ أو ديبيان 12+) مع إمكانية الوصول إلى sudo
- مستودع Git (GitHub أو GitLab أو Bitbucket)
- المجال و SSL/TLS في حالة خدمة حركة مرور الويب (Let's Encrypt)
- تم تكوين جدار الحماية (UFW/iptables) و SSH مفاتيح
- اختياري: Docker و Docker Compose لعمليات النشر في حاويات
- أداة التكامل المستمر/التسليم المستمر المختارة: Jenkins، أو GitHub Actions (مشغل ذاتي الاستضافة)، أو GitLab CI
كيف تعمل عملية التكامل المستمر/التسليم المستمر (CI/CD) على نظام لينكس (البنية)
- يقوم المطور بدفع الكود إلى الفرع الرئيسي أو فرع الإصدار.
- يقوم خط أنابيب التكامل المستمر بتشغيل اختبارات الوحدة/التكامل.
- يقوم خط الأنابيب بإنشاء عنصر (ثنائي، مضغوط) أو صورة Docker.
- تقوم خطوة النشر المستمر (CD) بنشر النظام على خادم Linux: نسخ الملفات، وتشغيل عمليات الترحيل، وإعادة تحميل الخدمات، وتحديث الخادم الوكيل العكسي.
- مراقبة وتسجيل التحقق من الحالة الصحية، مع إمكانية التراجع في حالة حدوث أي عطل.
اختيار أداة التكامل المستمر/التسليم المستمر (CI/CD)
يعتمد اختيار الأداة المناسبة على مزود خدمة استضافة المستودع، ومهارات فريق العمل، ومتطلبات الامتثال. فيما يلي الخيارات الأكثر شيوعًا لـ التكامل المستمر/التسليم المستمر على خوادم لينكس.
جينكينز (مستضافة ذاتيًا)
- المميزات: قابل للتخصيص بالكامل، غني بالمكونات الإضافية، يعمل في أي مكان، رائع لخطوط الأنابيب المعقدة.
- العيوب: يتطلب صيانة وتحديثات ونسخ احتياطية ومراجعة للملحقات.
- الأهداف: المؤسسات والفرق التي تحتاج إلى تحكم محلي وتنسيق متقدم.
GitHub Actions (برنامج تشغيل مُستضاف ذاتيًا)
- المميزات: أصلي لـ GitHub، قائم على YAML، سوق كبير، أسرار سهلة manageمنة.
- العيوب: يتطلب الأمر وجود برنامج تشغيل مُستضاف ذاتيًا لنشره في الشبكات الخاصة.
- الأهداف: الفرق الموجودة بالفعل على GitHub والتي ترغب في مسار بسيط للنشر.
GitLab CI / CD
- المميزات: مدمج مع GitLab، يوفر تصورًا ممتازًا لخطوط الأنابيب، كما أن تشغيلها سهل manage.
- العيوب: يتطلب GitLab؛ اعتبارات الترخيص على نطاق واسع.
- الأهداف: مستخدمو GitLab يبحثون عن منصة متكاملة واحدة.
خطوة بخطوة: إعداد التكامل المستمر/التسليم المستمر على خادم لينكس
إنشاء مستخدم خدمة، SSH المفاتيح والتصلب
قم بتشغيل هذه الأوامر لإنشاء مستخدم نشر غير الجذر، وإضافة صلاحيات الوصول إلى Docker إذا لزم الأمر، والتحضير. SSH مفاتيحقم بتعطيل تسجيل الدخول بكلمة المرور لتحسين الأمان.
# Create user
sudo adduser ci
sudo usermod -aG sudo ci
# Optional: if using Docker
sudo usermod -aG docker ci
# Generate SSH key for CI (run as ci user)
sudo -u ci ssh-keygen -t ed25519 -C "ci@server"
# Harden SSH (disable password auth)
sudo sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl reload ssh
# Allow only required ports (SSH, HTTP, HTTPS)
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enableقم بتثبيت Docker و Nginx (اختياري لكن موصى به)
تعمل الحاويات على توحيد عمليات النشر وجعل عمليات التراجع أكثر أمانًا. Nginx يوفر إنهاء TLS وتوجيه Blue-Green/Canary.
# Docker (Ubuntu)
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Nginx
sudo apt-get install -y nginx
sudo systemctl enable --now nginxالخيار أ: جينكينز على نظام لينكس (نمط حر أو ملف جينكينز)
قم بتثبيت Jenkins، واتصل بمستودعك، وحدد مسار العمل. اجعل Jenkins محميًا ببروتوكول TLS وقيد وصول المسؤول.
# Install Jenkins (Ubuntu LTS)
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc >/dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list >/dev/null
sudo apt-get update && sudo apt-get install -y openjdk-17-jdk jenkins
sudo systemctl enable --now jenkinsمثال على ملف Jenkinsfile لتطبيق مُحوَّل إلى Docker مع اختبارات ومرحلة نشر:
pipeline {
agent any
environment {
REGISTRY = "registry.example.com/myapp"
IMAGE = "${REGISTRY}:${env.GIT_COMMIT}"
}
stages {
stage('Checkout') { steps { checkout scm } }
stage('Build') { steps { sh 'docker build -t $IMAGE .' } }
stage('Test') { steps { sh 'pytest -q || npm test || true' } }
stage('Push') { steps { sh 'docker login -u $REG_USER -p $REG_PASS registry.example.com; docker push $IMAGE' } }
stage('Deploy') {
steps {
sh 'ssh -o StrictHostKeyChecking=no ci@prod.example.com "APP_IMAGE=$IMAGE bash -s" < deploy.sh'
}
}
}
post { failure { mail to: 'devops@example.com', subject: 'Build Failed', body: "Check Jenkins #${env.BUILD_NUMBER}" } }
}الخيار ب: GitHub Actions مع مُشغِّل مُستضاف ذاتيًا
قم بتثبيت برنامج تشغيل على خادم لينكس أو مضيف البناء. استخدم أسرار المستودع لتخزين بيانات الاعتماد وتقييد صلاحيات برنامج التشغيل.
# On the server as the ci user:
mkdir -p ~/actions-runner && cd ~/actions-runner
curl -o actions.tar.gz -L https://github.com/actions/runner/releases/latest/download/actions-runner-linux-x64-*.tar.gz
tar xzf actions.tar.gz
./config.sh --url https://github.com/ORG/REPO --token YOUR_TOKEN
./run.sh # or install as a serviceمثال على سير العمل لبناء واختبار ونشر تطبيق Node.js باستخدام Docker:
name: CI/CD
on:
push:
branches: [ "main" ]
jobs:
build-test-deploy:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install deps and test
run: npm ci && npm test
- name: Build image
run: docker build -t myapp:${{ github.sha }} .
- name: Deploy
env:
IMAGE_SHA: ${{ github.sha }}
run: |
APP_IMAGE="myapp:${IMAGE_SHA}" bash ./deploy.shعمليات نشر بدون توقف باستخدام Docker، Nginxو systemd
يُبقي نظام الأزرق والأخضر نسختين نشطتين (الأزرق والأخضر). يتم تبديل حركة البيانات عندما تجتاز الحاوية الجديدة فحوصات السلامة. استخدم Nginx الكتل الموجودة في اتجاه المنبع ورابط رمزي أو متغير للإشارة إلى المنفذ النشط.
# /etc/nginx/conf.d/app.conf
upstream app_upstream {
server 127.0.0.1:8081; # blue
# server 127.0.0.1:8082; # green (toggle when ready)
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://app_upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}مثال على نص برمجي للنشر يقوم بتدوير الحاويات وإعادة تحميلها Nginx بعد الفحص الطبي:
#!/usr/bin/env bash
set -euo pipefail
IMAGE="${APP_IMAGE:-myapp:latest}"
# Determine target port
CURRENT=$(grep -q "8081" /etc/nginx/conf.d/app.conf && echo "blue" || echo "green")
if [ "$CURRENT" = "blue" ]; then
NEW_PORT=8082
OLD_PORT=8081
else
NEW_PORT=8081
OLD_PORT=8082
fi
# Run new container
docker rm -f myapp_new || true
docker run -d --name myapp_new -p ${NEW_PORT}:3000 --health-cmd="curl -f http://localhost:3000/health || exit 1" \
--health-interval=10s --restart=always "$IMAGE"
# Wait for healthy
for i in {1..30}; do
STATUS=$(docker inspect --format='{{json .State.Health.Status}}' myapp_new | tr -d '"')
[ "$STATUS" = "healthy" ] && break
sleep 2
done
# Switch Nginx upstream
sudo sed -i "s/${OLD_PORT}/${NEW_PORT}/" /etc/nginx/conf.d/app.conf
sudo nginx -t && sudo systemctl reload nginx
# Replace old container
docker rm -f myapp_old || true
docker rename myapp_new myapp_oldأفضل ممارسات الأمان والامتثال
- استعمل SSH المفاتيح (ed25519) وتعطيل تسجيلات الدخول بكلمة المرور؛ وتقييد مستخدم CI بأقل الامتيازات.
- قم بتخزين الأسرار في خزنة أداة التكامل المستمر الخاصة بك (أسرار GitHub، بيانات اعتماد Jenkins، متغيرات GitLab).
- قم بتثبيت الصور الأساسية والتحقق من المجموع الاختباري؛ امسح الصور ضوئيًا باستخدام Trivy أو Grype.
- قم بتفعيل جدار الحماية، وبرنامج fail2ban، والتحديثات الأمنية التلقائية.
- قم بمراجعة وتحديث أدوات التكامل المستمر بانتظام؛ وقم بإزالة المكونات الإضافية غير المستخدمة.
- قم بتسجيل البيانات ومراقبتها باستخدام systemd-journald و Prometheus/Node Exporter و Nginx سجلات الوصول.
- اتبع معايير CIS وإرشادات OWASP ASVS لتعزيز الأمان.
المراقبة والسجلات وعمليات التراجع
- الفحوصات الصحية: قم بعرض نقاط نهاية /health؛ ينتظر نظام التكامل المستمر حتى تصبح "سليمة" قبل تحويل حركة المرور.
- الملاحظة: استخدم بروميثيوس + جرافانا أو managed APM (على سبيل المثال، New Relic).
- السجلات المنظمة: أرسل إلى Loki/ELK للبحث والتنبيهات.
- التراجع: احتفظ بالصورة/الوسم N-1، وملف .env السابق، ونسخة احتياطية من قاعدة البيانات؛ قم بأتمتة عملية التراجع كعملية خط أنابيب.
نصائح خاصة بكل مجموعة
Node.js
- قم بتخزين npm مؤقتًا باستخدام مفاتيح التخزين المؤقت للتكامل المستمر (CI) لتسريع عمليات البناء.
- استخدم PM2 أو حاوية؛ تجنب عمليات التثبيت العالمية في صور الإنتاج.
- قم بتشغيل npm ci للتحقق من التبعيات القابلة للتكرار و npm audit في التكامل المستمر.
PHP/Laravel أو WordPress
- Composer install –no-dev –optimize-autoloader in CI.
- تشغيل PHP قم بنقل الملفات بأمان باستخدام النسخ الاحتياطية؛ بالنسبة لـ WordPress، استخدم التحكم في إصدار wp-content (القوالب/الإضافات التي تملكها).
- يُقدّم عبر Nginx + PHP-FPM؛ إعادة التحميل PHP-FPM عند النشر لمسح ذاكرة التخزين المؤقت للتعليمات البرمجية.
بيثون / جانغو
- قم بإنشاء ملف requirements.txt مقفل باستخدام pip-compile.
- يجري manageقم بتشغيل الأمر migrate في ملف .py وقم بتجميع البيانات الثابتة في خطوة النشر المستمر (CD).
- استخدم Gunicorn من الخلف Nginx; قم بتحميل التطبيق مسبقًا واضبط مهلة زمنية مناسبة لإعادة التشغيل بدون توقف.
استكشاف الأخطاء وإصلاحها والأخطاء الشائعة
- تمرّ عملية نقل البيانات، ويتعطل التطبيق: أضف اختبارات التكامل/التعاقد وفحوصات السلامة.
- مشاكل في الأذونات: تأكد من أن مستخدم التكامل المستمر يمتلك مجلدات النشر ولديه عضوية في مجموعة Docker.
- بناءات غير مستقرة: قم بتثبيت التبعيات، واستخدم عمليات بناء قابلة للتكرار، وقم بالتخزين المؤقت بشكل صحيح.
- تسريب الأسرار: لا تقم أبدًا بتكرار البيانات السرية في السجلات؛ قم بإخفاء المخرجات؛ قم بتغيير بيانات الاعتماد بانتظام.
- وقت التوقف أثناء النشر: قم بتطبيق أسلوب التحديث التدريجي (الأزرق والأخضر) أو أسلوب الكناري؛ وتجنب عمليات إعادة التشغيل في مكانها دون إجراء اختبارات الجاهزية.
التكاليف والاستضافة ومكانها YouStable يساعد
يتطلب تشغيل نظام التكامل المستمر/التسليم المستمر (CI/CD) على نظام لينكس حوسبة موثوقة، وتخزين سريع، وشبكات مستقرة. YouStableتوفر لك خوادم VPS والخوادم المخصصة التي تعمل بتقنية SSD حماية من هجمات DDoS مجانًا SSL، وإمكانية الوصول الكاملة إلى الجذر مثالية لـ Jenkins، وrunners، وDocker، و Nginxيمكن لفريق الدعم لدينا إرشادك بشأن تعزيز الأمان، والنسخ الاحتياطية، وتحسين الأداء دون أي التزام.
الاسئلة المتكررة
1. ما هي أسهل طريقة لإعداد نظام التكامل المستمر/التسليم المستمر (CI/CD) على خادم لينكس؟
بالنسبة لمعظم مستخدمي GitHub، تُعدّ GitHub Actions مع مُشغّل مُستضاف ذاتيًا هي أسرع طريقة. قم بتثبيت المُشغّل على خادم Linux الخاص بك، وخزّن البيانات السرية في GitHub، واكتب سير عمل YAML للبناء والاختبار والنشر عبر Docker أو SSH.
2. هل يُعدّ Jenkins أم GitHub Actions أفضل لعمليات النشر على نظام Linux؟
يُوفر Jenkins إمكانية تخصيص متقدمة وتحكمًا محليًا، مما يجعله مثاليًا لخطوط المعالجة المعقدة. أما GitHub Actions فهو أبسط، ومتكامل تمامًا مع GitHub، ومناسب لمعظم الفرق. إذا كنت بحاجة إلى عزل صارم ووكلاء مخصصين، فاختر Jenkins؛ أما إذا كنت ترغب في السرعة والبساطة، فاختر Actions.
3. كيف يمكنني تحقيق عمليات نشر بدون توقف على نظام لينكس؟
استخدم استراتيجيات الأزرق والأخضر أو استراتيجيات الكناري مع Docker و Nginxقم بتشغيل الإصدار الجديد على منفذ مختلف، وتحقق من سلامته، ثم قم بالتبديل Nginx قم بتحديث النظام من المصدر، وأوقف تشغيل الحاوية القديمة. احتفظ دائمًا بنسخة احتياطية من صورة الاستعادة وقاعدة البيانات.
4. كيف ينبغي لي تخزين و manage أسرار التكامل المستمر/التسليم المستمر؟
استخدم أسرار أداة التكامل المستمر الخاصة بك manage(أسرار GitHub، بيانات اعتماد Jenkins، متغيرات GitLab). تجنب تضمين الأسرار مباشرةً في التعليمات البرمجية أو الصور. قم بتدوير الرموز المميزة دوريًا، وحدد نطاق الأذونات بأقل قدر ممكن، وقم بإخفاء الأسرار في السجلات.
5. هل يمكنني استخدام نظام التكامل المستمر/التسليم المستمر (CI/CD) لـ WordPress على خادم Linux؟
نعم. استخدم نظام التحكم في إصدارات القالب والإضافات المخصصة، وقم بتشغيل الاختبارات الآلية (PHP(الوحدة، التدقيق اللغوي)، وبناء الأصول، ونشرها عبر SSH أو دوكر. استخدم Nginx + PHP-FPM، إعادة التحميل PHP-FPM عند الإصدار، وقم بعمل نسخة احتياطية من قاعدة البيانات والتحميلات قبل تشغيل التحديثات أو عمليات الترحيل.