دليل النشر

Jenkins على VPS: خادم CI/CD مفتوح المصدر مع Docker

انشر على VPS Cloud ←

دليل عملي

Jenkins على VPS: خادم CI/CD مفتوح المصدر مع Docker

الاستضافة الذاتية7 دقائق للقراءةعدد الخطوات: 4

تتراكم دقائق البناء التي تفوترها خدمات CI المستضافة مع الوقت، وتبقى أسرار النشر لدى طرف ثالث. يقوم Jenkins، خادم الأتمتة مفتوح المصدر برخصة MIT، بالعمل نفسه على خادمك: يجلب الشيفرة عند كل push، ويشغّل البناء والاختبارات، ثم ينشر. يثبّت هذا الدليل Jenkins LTS باستخدام Docker Compose على VPS، وينشره عبر HTTPS خلف nginx، ويكتب أول مسار، ويضع قواعد الأمان المهمة.

المحتويات· لماذا تستضيف CI/CD الخاص بك مع Jenkins1/11
  1. 01لماذا تستضيف CI/CD الخاص بك مع Jenkins
  2. 02ما يقدّمه Jenkins
  3. 03Jenkins مقارنةً بأدوات CI أخرى مستضافة ذاتيًا
  4. 04المتطلبات
  5. 05تثبيت Jenkins باستخدام Docker Compose
  6. 06لا تشغّل عمليات البناء على وحدة التحكم
  7. 07كتابة أول مسار
  8. 08بيانات الاعتماد ووكلاء البناء
  9. 09النسخ الاحتياطي لـ Jenkins وتحديثه
  10. 10استكشاف الأخطاء
  11. 11التثبيت بنقرة واحدة من متجر ServOrbit

لماذا تستضيف CI/CD الخاص بك مع Jenkins

خدمة CI المستضافة عملية إلى أن تتكاثر عمليات البناء: كل دقيقة بعد الحصة تُفوتر، والمشاريع الكبيرة تنتظر دورها، ومفاتيح نشر خوادمك مخزّنة لدى المزوّد. يقلب Jenkins هذا النموذج: يعمل على VPS الخاص بك، وينفّذ من عمليات البناء بقدر ما تسمح به أجهزتك، ويحفظ بيانات اعتمادك مشفّرة لديك.

وهو أيضًا الأداة التي تعرفها معظم الفرق: يُقرأ ملف Jenkinsfile دون تدريب، والتوثيق وفير، ولكل أداة تقريبًا في السوق إضافة لـ Jenkins.

ما يقدّمه Jenkins

  • المسارات كشيفرة — ملف Jenkinsfile محفوظ مع المشروع يصف كل مرحلة، ويُراجع في مراجعة الشيفرة كبقية الملفات.
  • webhooks من Git — تطلق GitHub وGitLab وGitea وForgejo عملية البناء عند كل push أو pull request.
  • Multibranch — يحصل كل فرع وكل pull request على مسار خاص يُنشأ تلقائيًا.
  • وكلاء البناء — تُنفَّذ عمليات البناء على أجهزة مخصّصة متصلة عبر SSH.
  • أكثر من 2000 إضافة — Docker وKubernetes وSonarQube وSlack وتقارير اختبارات JUnit.
  • بيانات اعتماد مشفّرة — مفاتيح SSH والرموز تُحقن في المسار وتُخفى في السجلات.

Jenkins مقارنةً بأدوات CI أخرى مستضافة ذاتيًا

مرّر الجدول أفقيًا

JenkinsWoodpecker CIOneDev
الرخصةMITApache-2.0MIT
تعريف المسارJenkinsfile (Groovy)YAMLYAML أو محرر مرئي
منصة Git مدمجةلا، يرتبط بمنصتكلا، يرتبط بمنصتكنعم
منظومة الإضافاتأكثر من 2000 إضافةإضافات على شكل صور Dockerوظائف مدمجة
الأنسب لـمسارات معقدة وفرق قائمةمسارات بسيطة داخل الحاوياتفريق صغير يريد حلًا متكاملًا

المتطلبات

يكفي VPS بنظام Ubuntu 24.04 وذاكرة 2 غيغابايت ومعالجين افتراضيين لوحدة التحكم؛ احسب 4 غيغابايت إذا كانت عمليات البناء تعمل على الجهاز نفسه. تحتاج إلى Docker وإضافة Compose، واسم نطاق (أو نطاق فرعي) يشير إلى الخادم، وnginx مع شهادة TLS لنشره عبر HTTPS. يجب أن يستجيب Jenkins على عنوان HTTPS ثابت، فهو العنوان الذي تستدعيه مستودعاتك لإرسال webhooks.

تثبيت Jenkins باستخدام Docker Compose

  1. إنشاء ملف Compose

    يشغّل ملف docker-compose.yml هذا Jenkins LTS على Java 21. لا يُنشر المنفذ إلا على الواجهة المحلية، فلا يصل إليه سوى nginx. كل البيانات (المهام والإضافات وبيانات الاعتماد والسجل) موجودة في وحدة التخزين jenkins-home. لا يُنشر المنفذ 50000 الخاص بالوكلاء الواردين، إذ يتصل الوكلاء عبر SSH.

    services:
      jenkins:
        image: jenkins/jenkins:2.580.1-lts-jdk21
        restart: unless-stopped
        ports:
          - "127.0.0.1:8104:8080"
        environment:
          JAVA_OPTS: -Djava.awt.headless=true
        volumes:
          - jenkins-home:/var/jenkins_home
        healthcheck:
          test: ["CMD-SHELL", "curl -fsS -o /dev/null http://localhost:8080/login || exit 1"]
          interval: 15s
          retries: 10
          start_period: 60s
    volumes:
      jenkins-home: {}
  2. تشغيل الحاوية

    ضع الملف في /opt/jenkins ثم شغّل الحزمة. يستغرق التشغيل الأول نحو ثلاثين ثانية، ويجب أن يعرض الأمر docker compose ps الحالة healthy.

    mkdir -p /opt/jenkins && cd /opt/jenkins
    docker compose up -d
    docker compose ps
  3. نشر Jenkins عبر HTTPS خلف nginx

    في كتلة server الخاصة بنطاقك، مرّر الترويسات X-Forwarded-*: بدونها يولّد Jenkins روابط HTTP ويشير إلى وكيل عكسي غير مضبوط.

    location / {
        proxy_pass http://127.0.0.1:8104;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port 443;
    }
  4. فتح Jenkins

    افتح https://your-domain. يطلب Jenkins كلمة المرور الأولية المكتوبة في وحدة تخزين بياناته:

    docker compose exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

    ثم ثبّت الإضافات المقترحة وأنشئ حساب المدير وأكّد عنوان HTTPS للخادم.

لا تشغّل عمليات البناء على وحدة التحكم

تحتفظ وحدة التحكم في Jenkins بكل بيانات اعتمادك، وأي عملية بناء تعمل عليها يمكنها قراءتها. في «Manage Jenkins» اجعل عدد المنفّذين في العقدة المدمجة 0 واربط وكيلًا واحدًا على الأقل عبر SSH. وللسبب نفسه، لا تربط مقبس Docker الخاص بالخادم داخل حاوية Jenkins: فذلك يمنح أي عملية بناء صلاحيات root على الخادم.

كتابة أول مسار

أنشئ «Multibranch Pipeline» يشير إلى مستودعك، ثم أضف ملف Jenkinsfile في الجذر. يبني هذا المثال كل فرع ويختبره، ولا ينشر إلا الفرع main، على وكيل يحمل الوسم linux:

pipeline {
    agent { label 'linux' }
    stages {
        stage('Build') { steps { sh 'make build' } }
        stage('Test')  { steps { sh 'make test' } }
        stage('Deploy') {
            when { branch 'main' }
            steps { sh './deploy.sh' }
        }
    }
}

أخيرًا، أضف webhook في مستودعك نحو https://your-domain/github-webhook/ بالنسبة إلى GitHub، أو نحو العنوان الذي تعطيه إضافة منصتك. عندها يطلق كل push عملية بناء.

بيانات الاعتماد ووكلاء البناء

تُحفظ مفاتيح SSH ورموز API وكلمات مرور النشر في «Manage Jenkins» ثم «Credentials». يخزّنها Jenkins مشفّرة في وحدة التخزين الخاصة به، ولا يحقنها في عملية البناء إلا عندما تطلبها مرحلة ما، عبر withCredentials أو التوجيه environment في ملف Jenkinsfile، وتُخفى قيمتها في السجلات. امنح كل بيان اعتماد أضيق نطاق ممكن: مفتاح نشر لكل خادم هدف، ورمز للقراءة فقط لاستنساخ المستودعات.

بالنسبة إلى الوكلاء، أبسط حل هو VPS ثانٍ مثبّت عليه Java وDocker. في «Manage Jenkins» ثم «Nodes»، أضف عقدة دائمة بطريقة التشغيل «via SSH» وعنوان الخادم ومفتاح SSH محفوظ كبيان اعتماد. امنحها وسمًا، مثل linux، واستهدفها في مساراتك. عندها تكتفي وحدة التحكم بالتنسيق، ولا تصل أي عملية بناء مخترقة إلى أسرارك الأخرى.

النسخ الاحتياطي لـ Jenkins وتحديثه

كل حالة Jenkins موجودة في وحدة التخزين jenkins-home: المهام والإعدادات والإضافات وبيانات الاعتماد المشفّرة وسجل عمليات البناء. يكفي أرشيف لهذه الوحدة لاستعادة كل شيء. أوقف Jenkins أثناء النسخ للحصول على أرشيف متّسق:

cd /opt/jenkins
docker compose stop jenkins
docker run --rm -v jenkins_jenkins-home:/data -v \"$PWD\":/backup alpine tar czf /backup/jenkins-home.tar.gz -C /data .
docker compose start jenkins

للتحديث، اتبع خط LTS الذي يصدر تقريبًا كل اثني عشر أسبوعًا مع تصحيحات بينية: استبدل وسم الصورة في docker-compose.yml ثم شغّل docker compose pull وdocker compose up -d. بعد ذلك حدّث الإضافات من «Manage Jenkins» ثم «Plugins»، واقرأ نشرات الأمان التي يصدرها المشروع: معظم الثغرات المصحّحة تخص الإضافات لا النواة.

استكشاف الأخطاء

«It appears that your reverse proxy set up is broken»: لا يمرّر nginx الترويسة X-Forwarded-Proto أو أن عنوان Jenkins ليس HTTPS. صحّح كتلة location ثم العنوان في «Manage Jenkins» ثم «System».

الحاوية تعيد التشغيل باستمرار: اقرأ السجلات. السبب الأكثر شيوعًا هو نقص الذاكرة؛ امنح الخادم 2 غيغابايت على الأقل.

docker compose logs --tail=100 jenkins

لا تصل إشعارات webhook: تحقق من سجل التسليم في إعدادات المستودع، ثم من أن العنوان المستدعى هو عنوان HTTPS العام لـ Jenkins.

التثبيت بنقرة واحدة من متجر ServOrbit

على VPS من ServOrbit، يُثبَّت Jenkins من المتجر: اختر العنوان وانقر «تثبيت»، فينشر السكربت Jenkins LTS داخل Docker مع وحدة تخزين البيانات والوكيل العكسي nginx عبر HTTPS. تظهر كلمة مرور الإدارة الأولية في مساحة العميل. ليس لديك نطاق؟ يكفي النطاق الفرعي المجاني للخادم مع HTTPS.

خادم Jenkins للتكامل والتسليم المستمرين على VPS الخاص بك

يكفي VPS من ServOrbit بنظام Ubuntu 24.04 وذاكرة 2 غيغابايت لتشغيل Jenkins. تثبيت بنقرة واحدة من المتجر، وHTTPS على نطاقك أو على النطاق الفرعي المجاني للخادم، دون حصة لدقائق البناء.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـالعربية والفرنسية والإنجليزية.

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة