مقدمة: لماذا CI/CD أمر لا غنى عنه لمطور Java
تطوير Java الحديث لا يمكن تصوره بدون أتمتة. التشغيل اليدوي للاختبارات، بناء ملفات .jar، والنشر على الخادم يستهلك ساعات ويؤدي إلى أخطاء بشرية. CI/CD (Continuous Integration / Continuous Deployment) يحل هذه المشكلة: كل commit في المستودع يتم فحصه وبناؤه تلقائيًا، وعند الضرورة، يتم إرساله إلى الإنتاج.
GitHub Actions هي أداة مدمجة في GitHub تتيح إنشاء pipelines مباشرة في المستودع. وهي مجانية للمشاريع العامة، وتتكامل بسهولة مع Maven/Gradle، وتدعم Java 8–21. في هذه المقالة، سنشرح الدورة الكاملة: من trigger عند push إلى نشر artifact.
1. أساسيات GitHub Actions: هيكل workflow
Workflow (سير العمل) هو ملف YAML موجود في .github/workflows/. يتكون من:
- Triggers (push, pull_request, schedule);
- Jobs (مهام) يتم تنفيذها على أجهزة افتراضية (runners);
- Steps (خطوات) داخل كل مهمة.
بالنسبة لمشروع Java، يتضمن workflow النموذجي تثبيت JDK، تشغيل اختبارات Maven/Gradle، وبناء artifact.
1.1. أول workflow: اختبار مشروع Java
أنشئ ملفًا باسم .github/workflows/ci.yml بالمحتوى التالي:
name: Java CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: maven
- name: Build with Maven
run: mvn -B package --file pom.xml
- name: Run tests
run: mvn test
ماذا يحدث هنا:
actions/checkout— يستنسخ المستودع;setup-java— يثبت JDK 17 (Temurin) ويخبئ تبعيات Maven;mvn package— يبني المشروع ويشغل الاختبارات;mvn test— تشغيل صريح للاختبارات (يمكن دمجه مع package).
بعد push إلى main، سترى علامة اختيار خضراء بجانب commit — وهذا يعني أن pipeline قد نجح.
2. إعداد متقدم لـ Java: مصفوفة الإصدارات والتخزين المؤقت
غالبًا ما تتطلب المشاريع الحقيقية التحقق على إصدارات متعددة من Java. يدعم GitHub Actions matrix strategy (استراتيجية المصفوفة).
2.1. مصفوفة JDK
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
java: [11, 17, 21]
steps:
- uses: actions/checkout@v4
- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v4
with:
java-version: ${{ matrix.java }}
distribution: 'temurin'
cache: maven
- run: mvn test
يضمن هذا النهج توافق كودك مع إصدارات Java LTS. يتم تنفيذ المهام بالتوازي، مما يوفر الوقت.
2.2. التخزين المؤقت للتبعيات
لقد حددنا بالفعل cache: maven — وهذا يخبئ تلقائيًا ~/.m2/repository. بالنسبة لـ Gradle، استخدم cache: gradle. التخزين المؤقت يسرع البناء بمقدار 2–3 مرات.
3. بناء ونشر artifacts (JAR/Docker)
بعد الاختبار الناجح، تحتاج إلى الحصول على artifact جاهز. دعنا ننظر في سيناريوهين شائعين.
3.1. تحميل ملف JAR إلى GitHub Artifacts
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- run: mvn clean package
- name: Upload JAR
uses: actions/upload-artifact@v4
with:
```