مقدمة: لماذا CI/CD مهم لمشاريع Go
تطوير البرامج الحديثة بلغة Go (Golang) لا يتطلب فقط كتابة كود نظيف وفعال، بل أيضاً إعداد عمليات تعمل على أتمتة الفحص والبناء والتوصيل للتطبيقات. CI/CD (التكامل المستمر / التوصيل المستمر) هو مجموعة من الممارسات التي تتيح توصيل التغييرات إلى بيئة الإنتاج بسرعة وأمان. لمطوري Go، أصبح GitHub Actions أحد أكثر الأدوات شيوعاً بفضل تكامله الوثيق مع المستودعات وسهولة إعداده.
في هذه المقالة، سنشرح كيفية إنشاء خط أنابيب CI/CD كامل لمشروع Go باستخدام GitHub Actions. ستتعلم كيفية أتمتة الاختبار، وبناء الملفات الثنائية، والنشر على الخادم. جميع الأمثلة ستكون بلغة Go (Golang) مع خطوات عملية.
1. أساسيات GitHub Actions للغة Go
GitHub Actions هو نظام أتمتة مدمج لسير العمل (workflows). كل سير عمل هو ملف YAML يصف خطوات البناء والاختبار والنشر. بالنسبة لمشاريع Go، يتضمن خط الأنابيب الأدنى:
- تثبيت Go
- تخزين التبعيات مؤقتاً (Caching)
- تشغيل الاختبارات
- بناء التطبيق
هيكل ملف سير العمل
قم بإنشاء مجلد .github/workflows/ في جذر المستودع وملف ci.yml. إليك الإعداد الأساسي للغة Go:
name: CI لمشروع Go
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
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: تخزين الوحدات مؤقتاً uses: actions/cache@v3 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go-
- name: تحميل التبعيات run: go mod download
- name: فحص الكود (Linting) run: go vet ./...
- name: تشغيل الاختبارات run: go test -v -race -coverprofile=coverage.out ./...
- name: بناء الملف الثنائي run: go build -o myapp ./cmd/main.goيتم تشغيل سير العمل هذا عند الدفع (push) إلى main أو develop، وكذلك عند إنشاء طلب سحب (pull request). يتحقق من الكود بحثاً عن الأخطاء، ويشغل الاختبارات مع علامة race (كاشف سباق البيانات)، ويبني الملف الثنائي.
2. خط أنابيب متقدم: الاختبار وجودة الكود
الفحص الأساسي جيد، ولكن لمشروع Go جاد، هناك حاجة إلى المزيد. دعنا نضيف التحليل الثابت والتحقق من تغطية الكود.
إضافة golangci-lint
golangci-lint هو مجمع لأدوات الفحص (linters)، والذي يتضمن go vet و errcheck و staticcheck وغيرها. دعنا نضيفه إلى سير العمل:
- name: تثبيت golangci-lint uses: golangci/golangci-lint-action@v4 with: version: latest
- name: تشغيل أداة الفحص run: golangci-lint run ./...تقرير تغطية الكود
تغطية الاختبارات هي مقياس جودة مهم. يمكن لـ GitHub Actions إنشاء تقارير وحتى حظر طلبات السحب (PR) عند انخفاض التغطية:
- name: إنشاء تقرير التغطية run: go test -coverprofile=coverage.out -covermode=atomic ./...
- name: التحقق من الحد الأدنى للتغطية run: | go tool cover -func=coverage.out | grep total | awk '{print $3}' | sed 's/%//' > coverage.txt if [ $(cat coverage.txt) -lt 70 ]; then echo "تغطية الكود أقل من 70%" exit 1 fiالآن سيفشل سير العمل إذا انخفضت تغطية الاختبارات عن 70%. هذه ممارسة ممتازة للحفاظ على جودة مشروع Go.
3. بناء ونشر صورة Docker
غالباً ما يتم نشر تطبيقات Go كحاويات Docker. يتيح GitHub Actions الأتمتة