مقدمة: أتمتة تطوير Java باستخدام GitHub Actions
تطوير Java الحديث لا يمكن تصوره بدون أتمتة. عمليات البناء والاختبار والنشر اليدوية ليست مجرد مضيعة للوقت، بل هي أيضًا مصدر للأخطاء الحرجة. CI/CD (التكامل المستمر / النشر المستمر) يحل هذه المشكلة، محولاً العمليات الروتينية إلى عمليات تلقائية. أحد أشهر الأدوات لتنفيذ CI/CD هو GitHub Actions.
GitHub Actions مدمج مباشرة في GitHub، مما يجعله الخيار الأمثل لمشاريع Java المخزنة على هذه المنصة. يتيح لك إنشاء خطوط أنابيب قوية يتم تشغيلها مع كل push أو pull request أو وفقًا لجدول زمني. في هذه المقالة، سنشرح كيفية إعداد دورة CI/CD كاملة لتطبيق Java: بدءًا من البناء والاختبار وصولاً إلى النشر. ستتعلم كيفية كتابة تكوينات YAML فعالة، واستخدام التخزين المؤقت للتبعيات، ودمج الأدوات الشائعة مثل Maven و Gradle.
1. أساسيات GitHub Actions للغة Java: Workflow و Jobs و Steps
قبل كتابة الكود، من المهم فهم بنية GitHub Actions. يتم تعريف كل خط أنابيب في ملف .github/workflows/*.yml. المكونات الرئيسية هي:
- Workflow — هو خط الأنابيب نفسه. يحتوي على وظيفة واحدة أو أكثر (jobs).
- Jobs — كتل منطقية يتم تنفيذها على مشغل واحد (جهاز افتراضي). يمكن أن تعتمد الوظائف على بعضها البعض.
- Steps — أوامر محددة داخل الوظيفة: تثبيت JDK، تشغيل Maven، نشر القطع الأثرية.
بالنسبة لمشاريع Java، الخطوة الأساسية هي إعداد Java Development Kit (JDK). يوفر GitHub Actions إجراءً جاهزًا actions/setup-java يدعم جميع توزيعات JDK الشائعة (Oracle، OpenJDK، Adoptium).
name: Java CI/CD Pipeline
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'
- name: Build with Maven
run: mvn clean install --file pom.xml
في هذا المثال، أنشأنا workflow أساسي يتم تشغيله عند push أو pull request إلى الفرع main. يستخدم Ubuntu، ويقوم بتثبيت JDK 17 (توزيعة Temurin)، وينفذ بناء Maven. هذه هي المجموعة الدنيا للتكامل المستمر (Continuous Integration).
2. البناء والاختبار: Maven و Gradle والتخزين المؤقت
البناء هو قلب CI/CD. ومع ذلك، مجرد تشغيل mvn install ليس كافيًا. في المشاريع الكبيرة، قد يستغرق تحميل التبعيات دقائق. لتسريع العملية، استخدم التخزين المؤقت. يتيح لك GitHub Actions تخزين الدليل ~/.m2/repository (لـ Maven) أو ~/.gradle/caches (لـ Gradle) مؤقتًا.
إليك مثال مع التخزين المؤقت لـ Maven:
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Cache Maven dependencies
uses: actions/cache@v3
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Build and run tests
run: mvn clean verify --file pom.xml
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: target/surefire-reports/
لاحظ العلامة if: always() في خطوة تحميل نتائج الاختبار. وهي تضمن رفع القطعة الأثرية (artifact) حتى في حالة فشل الخطوات السابقة.