CI/CD لمشاريع Go: GitHub Actions مستوى متقدم

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

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

ابدأ الدورة

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



أتمتة البناء والاختبار والنشر هي أساس تطوير Go الحديث. خطوط الأنابيب الأساسية جيدة للبدء، ولكن عندما ينمو المشروع، هناك حاجة إلى تقنيات متقدمة: التخزين المؤقت للتبعيات، الوظائف المتوازية، البناء المصفوفي لأنظمة تشغيل ومعماريات مختلفة، نشر القطع الأثرية في Docker Hub والنشر الذكي. في هذه المقالة، سنشرح كيفية إعداد GitHub Actions لمشروع Go على المستوى الاحترافي.



1. التخزين المؤقت لوحدات Go والملفات الثنائية



كل تشغيل لخط الأنابيب قد يقوم بتنزيل عشرات الميغابايت من التبعيات. لتسريع العملية، نستخدم التخزين المؤقت المدمج في GitHub Actions لـ go mod وذاكرة التخزين المؤقت للبناء.



name: Go CI (متقدم)on: [push, pull_request]

jobs: build-and-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4

- name: تثبيت Go uses: actions/setup-go@v5 with: go-version: '1.22'

- name: تخزين مؤقت لوحدات Go uses: actions/cache@v4 with: path: | ~/go/pkg/mod ~/.cache/go-build key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go-

- name: تحميل التبعيات run: go mod download

- name: المدقق (golangci-lint) uses: golangci/golangci-lint-action@v6 with: version: latest

- name: اختبارات مع التغطية run: go test -v -race -coverprofile=coverage.out ./...

- name: بناء الملف الثنائي run: go build -o myapp ./cmd/app


المفتاح hashFiles('**/go.sum') يبطل التخزين المؤقت فقط عند تغيير التبعيات. ذاكرة التخزين المؤقت للبناء (~/.cache/go-build) تحفظ الكائنات المترجمة، مما يسرع إعادة البناء.



2. البناء المصفوفي: اختبار إصدارات Go وأنظمة تشغيل مختلفة



غالبًا ما تحتاج مشاريع Go إلى العمل على Linux وmacOS وWindows، بالإضافة إلى دعم إصدارات متعددة من اللغة. المصفوفة (matrix strategy) تسمح بتشغيل وظائف متوازية لكل مجموعة.



jobs:  matrix-test:    strategy:      matrix:        go-version: ['1.21', '1.22', '1.23']        os: [ubuntu-latest, macos-latest, windows-latest]    runs-on: ${{ matrix.os }}    steps:      - uses: actions/checkout@v4      - name: تثبيت Go ${{ matrix.go-version }}        uses: actions/setup-go@v5        with:          go-version: ${{ matrix.go-version }}      - name: اختبارات        run: go test ./...


يكشف هذا النهج مشاكل التوافق على منصات مختلفة. بالنسبة لنظام Windows، قد يكون من الضروري إعداد إضافي للمسارات وفواصل الأسطر. أضف fail-fast: false لضمان استمرار الوظائف الأخرى في العمل حتى لو فشلت إحداها.



3. نشر صورة Docker وإصدار GitHub



بعد الاختبار الناجح، من المنطقي نشر القطع الأثرية: صورة Docker في Docker Hub (أو GitHub Container Registry) والملف الثنائي في GitHub Release. سننظر في كلا السيناريوهين.



نشر صورة Docker



سننشئ وظيفة تعمل فقط بعد الاختبارات وفقط عند الدفع إلى main أو عند إنشاء علامة.



jobs:  docker:    needs: [build-and-test]    if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4

- name: تسجيل الدخول إلى Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }}

- name: بناء ودفع الصورة uses: docker/build-push-action@v5 with: context: . push: true tags: | ${{ secrets.DOCKER_USERNAME }}/myapp:latest ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }}


لا تنس

المدونات

توصيات الكتب