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

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

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

ابدأ الدورة

CI/CD لمشاريع Go باستخدام GitHub Actions: دليل شامل



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



ما هو CI/CD ولماذا هو مهم لـ Go؟



CI (التكامل المستمر) هو ممارسة دمج الكود بشكل متكرر في الفرع الرئيسي مع البناء والاختبار التلقائي. CD (التسليم/النشر المستمر) هو النشر التلقائي للتطبيق الجاهز.

بالنسبة لمشاريع Go، فإن CI/CD مفيد بشكل خاص للأسباب التالية:

  • يتم تجميع Go إلى ملف ثنائي ثابت، مما يبسط عملية النشر
  • اختبار سريع بفضل السرعة الأصلية لـ Go
  • التحقق التلقائي باستخدام أدوات الفحص والتنسيق (gofmt, golangci-lint)
  • إمكانية البناء عبر منصات متعددة (Linux, macOS, Windows)


أساسيات GitHub Actions لـ Go



تستخدم GitHub Actions ملفات YAML في الدليل .github/workflows. يصف كل ملف واحدًا أو أكثر من سير العمل (خطوط الأنابيب).



لنلقِ نظرة على سير عمل أساسي لمشروع Go:



name: Go CI

on: push: branches: [ main, develop ] pull_request: branches: [ main ]

jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.22' - name: Cache Go modules uses: actions/cache@v4 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - name: Install dependencies run: go mod download - name: Run tests run: go test -v -race -coverprofile=coverage.out ./... - name: Upload coverage uses: actions/upload-artifact@v4 with: name: coverage path: coverage.out


يتم تشغيل سير العمل هذا عند الدفع إلى main/develop وعند طلب السحب. يقوم بتثبيت Go، وتخزين التبعيات مؤقتًا، وتشغيل الاختبارات مع العلامات -race (كاشف السباق) و -coverprofile (تغطية الكود).



إعدادات متقدمة: أدوات الفحص والبناء عبر المنصات



للحفاظ على جودة الكود، سنضيف فحصًا باستخدام أداة الفحص. golangci-lint هو المعيار الفعلي لـ Go.



  lint:    runs-on: ubuntu-latest    steps:    - uses: actions/checkout@v4    - name: Set up Go      uses: actions/setup-go@v5      with:        go-version: '1.22'    - name: golangci-lint      uses: golangci/golangci-lint-action@v6      with:        version: latest        args: --timeout=5m ./...


البناء عبر المنصات المتعددة مفيد إذا كان تطبيقك يجب أن يعمل على أنظمة تشغيل مختلفة:



  build:    needs: [test, lint]    strategy:      matrix:        os: [ubuntu-latest, macos-latest, windows-latest]        goarch: [amd64, arm64]        runs-on: ${{ matrix.os }}        steps:    - uses: actions/checkout@v4    - name: Set up Go      uses: actions/setup-go@v5      with:        go-version: '1.22'    - name: Build      run: |        GOARCH=${{ matrix.goarch }} go build -v -o myapp-${{ matrix.os }}-${{ matrix.goarch }} ./cmd/app


ملاحظة: بالنسبة لـ Windows، ستحتاج إلى تعديل اسم ملف الإخراج (إضافة .exe). استخدم if runner.os == 'Windows' أو قم بتعيين الاسم عبر المتغيرات.



النشر التلقائي لتطبيق Go



للنشر، سننظر في سيناريوهين شائعين: نشر صورة Docker وتحميل الملف الثنائي إلى الخادم.



المدونات

توصيات الكتب