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 وتحميل الملف الثنائي إلى الخادم.