CI/CD لمشاريع Kotlin: GitHub Actions من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا يعتبر CI/CD أمرًا بالغ الأهمية لمشاريع Kotlin

\n

في التطوير الحديث باستخدام Kotlin، سواء كان خلفية (باك إند) باستخدام Ktor، أو تطبيق Android، أو مشروع متعدد المنصات، فإن تنفيذ العمليات المتكررة يدويًا (البناء، تشغيل الاختبارات، التحقق من نمط الشفرة) ليس مجرد مضيعة للوقت، بل هو أيضًا مصدر للأخطاء. يحل CI/CD (التكامل المستمر / النشر المستمر) هذه المشكلة عن طريق أتمتة خط الأنابيب بأكمله من الالتزام (commit) إلى الإنتاج.

\n

GitHub Actions هي أداة أتمتة مدمجة مثالية لمشاريع Kotlin. تتيح لك إنشاء خطوط أنابيب (pipelines) مباشرة في المستودع دون الحاجة إلى خدمات خارجية. في هذه المقالة، سنشرح كيفية إعداد CI/CD كامل لمشاريع Kotlin باستخدام GitHub Actions، بدءًا من البناء الأساسي وصولاً إلى النشر.

\n\n

1. أساسيات GitHub Actions و Kotlin

\n

يعمل GitHub Actions بناءً على سير العمل (workflow) — ملفات YAML التي تحدد تسلسل الخطوات. يتم تشغيل كل سير عمل بناءً على مشغل (trigger) (push، pull request، جدولة) ويتم تنفيذه في بيئة افتراضية (runner).

\n

بالنسبة لمشاريع Kotlin، تشمل الحزمة القياسية:

\n
    \n
  • Gradle أو Maven — نظام البناء؛
  • \n
  • JUnit / Kotest — أطر الاختبار؛
  • \n
  • Detekt / ktlint — أدوات فحص الشفرة (linters) لـ Kotlin.
  • \n
\n

الخطوة الأولى هي إنشاء ملف .github/workflows/ci.yml في جذر المستودع. دعنا نلقي نظرة على الحد الأدنى من التكوين للبناء والاختبار.

\n\n

1.1 البناء والاختبار الأساسيان

\n

لنبدأ بخط أنابيب بسيط يتم تشغيله عند كل push و pull request إلى الفرع الرئيسي (main):

\n
name: CI for Kotlin\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v3\n      - name: Set up JDK 17\n        uses: actions/setup-java@v3\n        with:\n          java-version: '17'\n          distribution: 'temurin'\n      - name: Grant execute permission for gradlew\n        run: chmod +x gradlew\n      - name: Build with Gradle\n        run: ./gradlew build\n      - name: Run tests\n        run: ./gradlew test
\n

يقوم هذا الكود بما يلي: استنساخ المستودع، تثبيت JDK 17 (الإصدار الموصى به لـ Kotlin 1.9+)، جعل gradlew قابلاً للتنفيذ، تنفيذ البناء وتشغيل الاختبارات. إذا فشلت الاختبارات، يتوقف خط الأنابيب مع ظهور خطأ.

\n\n

2. تكوين متقدم: فحص الشفرة (linting)، التخزين المؤقت (caching) ومصفوفة البناء (Matrix Build)

\n

الإعداد الأساسي جيد، ولكن لمشروع حقيقي نحتاج إلى المزيد. دعنا نضيف التحقق من نمط الشفرة باستخدام Detekt والتخزين المؤقت لتبعيات Gradle لتسريع العمل.

\n\n

2.1 التخزين المؤقت لـ Gradle

\n

بدون التخزين المؤقت، يقوم كل تشغيل بتنزيل التبعيات من جديد، مما قد يستغرق من 2 إلى 5 دقائق. نستخدم التخزين المؤقت المدمج:

\n
- name: Cache Gradle packages\n  uses: actions/cache@v3\n  with:\n    path: |\n      ~/.gradle/caches\n      ~/.gradle/wrapper\n    key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}\n    restore-keys: |\n      ${{ runner.os }}-gradle-
\n\n

2.2 فحص الشفرة باستخدام Detekt

\n

أضف مهمة للتحقق من الشفرة. يمكن تشغيل Detekt عبر إضافة Gradle:

\n
- name: Run Detekt\n  run: ./gradlew detekt
\n

إذا وجد Detekt مخالفات، سينتهي خط الأنابيب بخطأ. هذا يضمن عدم دخول شفرة "غير نظيفة" إلى المستودع.

\n\n

2.3 مصفوفة البناء (Matrix Build)

\n

إذا كان مشروعك يدعم إصدارات متعددة من Kotlin أو JDK، استخدم المصفوفة. هذا يسمح بالتحقق من التوافق دون تكرار الشفرة:

\n
jobs:\n  build:\n    strategy:\n      matrix:\n        java: [11, 17, 21]\n        kotlin: [1.9.0, 2.0.0]\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - name: Set up JD                

المدونات

توصيات الكتب