إنشاء مسار CI باستخدام Azure Pipelines
حدّد مسار YAML يُشغَّل عند طلبات السحب، ويجري اختبارات الوحدة، وينتج عنصر بناء، ثم راجع نتائج الاختبارات وتغطية التعليمات البرمجية في المدخل.
إنشاء مسار CI باستخدام Azure Pipelines درس مجاني في Cloud & IT Cert Prep على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Cloud & IT Cert Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Cloud & IT Cert Prep 4 دروس في المجموع.
ما هو التكامل المستمر؟
التكامل المستمر (CI) هو ممارسة دمج تغييرات التعليمات البرمجية بشكل متكرر في فرع مشترك، بحيث يؤدي كل دمج إلى تشغيل عملية بناء واختبار تلقائياً. والهدف هو اكتشاف حالات فشل التكامل مبكراً — قبل أن تتراكم وتتحول إلى مشكلات كبيرة يصعب إصلاحها. يبني خط أنابيب CI الجيد التعليمات البرمجية، ويشغّل اختبارات الوحدة، ويقيس تغطية التعليمات البرمجية، وينفذ التحليل الساكن، وينتج artifact قابلاً للنشر خلال بضع دقائق. ويوفر Azure Pipelines محرك التشغيل الآلي لهذه الممارسة.
بنية خط أنابيب YAML
تُعرَّف خطوط أنابيب CI في Azure Pipelines داخل ملف azure-pipelines.yml الموجود في جذر مستودعك. ويحدد ملف YAML المشغلات (متى يتم التشغيل)، والتجمع (نوع العامل الذي يجب استخدامه)، وتسلسلاً هرمياً من المراحل والمهام والخطوات. تُشغّل المراحل بالتتابع افتراضياً. وتُشغّل المهام داخل المرحلة بالتوازي افتراضياً. أما الخطوات داخل المهمة فتُشغّل بالتتابع. وتمنحك هذه البنية تحكماً دقيقاً في تدفق تنفيذ خط الأنابيب.
# azure-pipelines.yml skeleton
trigger:
branches:
include:
- main
- 'feature/*'
paths:
exclude:
- docs/**
- '*.md'
pool:
vmImage: ubuntu-latest
variables:
buildConfiguration: Release
nodeVersion: '18.x'
stages:
- stage: CI
displayName: 'Build and Test'
jobs:
- job: Build
displayName: 'Build Application'
steps: []تهيئة المشغلات
يدعم Azure Pipelines عدة أنواع من المشغلات. تشغّل مشغلات الفروع خط الأنابيب عند دفع التعليمات البرمجية إلى فروع محددة. وتشغّل مشغلات طلبات السحب (مشغلات PR) عند فتح طلب سحب أو تحديثه مقابل الفروع المستهدفة — وهي ضرورية للتحقق من التعليمات البرمجية قبل دمجها. وتشغّل المشغلات المجدولة الخط في وقت ثابت (مثل عمليات البناء الليلية). وتربط مشغلات خطوط الأنابيب خطوط الأنابيب بعضها ببعض. حدّد trigger: none لتعطيل عمليات التشغيل التلقائية والسماح بالتنفيذ اليدوي فقط.
# Branch trigger
trigger:
branches:
include: [main, develop]
# Pull request trigger
pr:
branches:
include: [main]
autoCancel: true # Cancel previous runs when PR is updated
# Scheduled trigger (nightly build at 02:00 UTC)
schedules:
- cron: '0 2 * * *'
displayName: 'Nightly Build'
branches:
include: [main]
always: true # Run even if no new commitsالخطوات: البرامج النصية والمهام
تكون خطوات خط الأنابيب إما برامج نصية (أوامر bash أو PowerShell) أو مهام (وحدات مُنشأة مسبقاً ومُعلمة من سوق Azure DevOps). وتغلف مهام مثل NodeTool@0 وDotNetCoreCLI@2 وMaven@3 عمليات البناء الشائعة. استخدم displayName في كل خطوة للحصول على سجلات واضحة لخط الأنابيب. تُشغّل كل خطوة بالتسلسل، ويفشل خط الأنابيب إذا انتهت أي خطوة برمز غير صفري، ما لم تضبط continueOnError: true.
steps:
- task: NodeTool@0
displayName: 'Install Node.js 18'
inputs:
versionSpec: '18.x'
- script: npm ci
displayName: 'Install dependencies (clean install)'
- script: npm run lint
displayName: 'Run ESLint'
- script: npm run build
displayName: 'Build production bundle'
- script: npm test -- --ci --coverage
displayName: 'Run unit tests with coverage'نشر نتائج الاختبارات
بعد تشغيل الاختبارات، انشر النتائج إلى Azure DevOps باستخدام مهمة PublishTestResults. يحلل Azure Pipelines ملفات نتائج JUnit أو NUnit أو XUnit أو VSTest، ويعرض أعداد الاختبارات الناجحة والفاشلة، ومدة تشغيل الاختبار، وتفاصيل الاختبارات الفردية في واجهة تشغيل خط الأنابيب. ويُتتبَّع سجل الاختبارات بمرور الوقت، بحيث يمكنك اكتشاف الاختبارات غير المستقرة وحالات التراجع. وهذا أمر ضروري لتحقيق وضوح جودة التعليمات البرمجية على مستوى الفريق.
# Example: Node.js project with Jest tests
steps:
- script: npm test -- --ci --reporters=jest-junit
displayName: 'Run tests with JUnit reporter'
env:
JEST_JUNIT_OUTPUT_DIR: '$(Agent.TempDirectory)/test-results'
- task: PublishTestResults@2
displayName: 'Publish test results'
inputs:
testResultsFormat: JUnit
testResultsFiles: '$(Agent.TempDirectory)/test-results/**/*.xml'
condition: succeededOrFailed() # Publish even if tests failنشر تغطية التعليمات البرمجية
انشر تقارير تغطية التعليمات البرمجية لكي يعرض Azure Pipelines نسب التغطية واتجاهاتها في واجهة خط الأنابيب. وتقبل مهمة PublishCodeCoverageResults تقارير بتنسيق Cobertura أو JaCoCo. واربط ذلك ببوابات تغطية الفروع — اضبط حداً أدنى للتغطية، واجعل البناء يفشل إذا انخفضت التغطية عنه. وتساعد اتجاهات التغطية على تحديد الحالات التي تُضاف فيها تعليمات برمجية جديدة من دون اختبارات مقابلة.
# Jest + coverage
- script: npm test -- --ci --coverage --coverageReporters=cobertura
displayName: 'Run tests with coverage'
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(System.DefaultWorkingDirectory)/coverage/cobertura-coverage.xml'
reportDirectory: '$(System.DefaultWorkingDirectory)/coverage'متغيرات خط الأنابيب ومجموعات المتغيرات
خزّن إعدادات خط الأنابيب في متغيرات تُعرّف على مستوى خط الأنابيب أو المرحلة أو المهمة في YAML. وبالنسبة إلى القيم الحساسة (مفاتيح API وكلمات المرور)، استخدم متغيرات سرية — واضبطها في مكتبة خط الأنابيب (واجهة المستخدم) أو في مجموعات المتغيرات، ثم أشر إليها في YAML. ومجموعات المتغيرات هي مجموعات قابلة لإعادة الاستخدام من المتغيرات المشتركة بين عدة خطوط أنابيب. اربط مجموعة متغيرات بـ Azure Key Vault لمزامنة الأسرار تلقائياً من Key Vault إلى متغيرات خط الأنابيب.
# Reference a variable group in a pipeline
variables:
- group: 'Production-Secrets' # Linked to Azure Key Vault
- name: buildConfiguration
value: Release
# Use a variable
steps:
- script: echo 'Building $(buildConfiguration) configuration'
- script: az webapp deploy --src-path drop.zip
env:
AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID) # From Key Vault
APP_API_KEY: $(APP_API_KEY) # Secret, not printed in logsArtifacts: حزم ناتج البناء
بعد نجاح عملية البناء، احزم الناتج في artifact لخط الأنابيب لكي تتمكن المراحل اللاحقة (مثل النشر) من الوصول إليه. استخدم PublishPipelineArtifact لتحميل الملفات من عامل البناء إلى وحدة تخزين artifacts في Azure DevOps. وفي مرحلة أو مهمة لاحقة، استخدم DownloadPipelineArtifact لاسترداد artifact. ويفصل ذلك مهمة البناء عن مهام النشر، التي يمكن تشغيلها على عوامل مختلفة أو في مراحل مختلفة.
# Publish build artifact
- task: PublishPipelineArtifact@1
displayName: 'Publish build artifact'
inputs:
targetPath: '$(System.DefaultWorkingDirectory)/dist'
artifactName: webapp-drop
publishLocation: pipeline
# In a later deployment job, download the artifact
- task: DownloadPipelineArtifact@2
inputs:
artifactName: webapp-drop
targetPath: '$(Pipeline.Workspace)/drop'
- script: ls -la $(Pipeline.Workspace)/dropالمهام المتوازية لتسريع عمليات البناء
شغّل المهام المستقلة بالتوازي من خلال تعريف عدة مهام داخل مرحلة. فعلى سبيل المثال، يمكنك تشغيل اختبارات الوحدة وفحص الأمان في الوقت نفسه بدلاً من تشغيلهما بالتتابع. وتتطلب المهام المتوازية دقائق بناء منفصلة، لكنها قد تقلل مدة خط الأنابيب الإجمالية بشكل كبير. استخدم الخاصية dependsOn لجعل مهمة تنتظر اكتمال مهمة أخرى أو عدة مهام قبل بدء تشغيلها، وبذلك تنشئ رسم تبعيات داخل المرحلة.
stages:
- stage: CI
jobs:
- job: UnitTests
displayName: 'Run unit tests'
steps:
- script: npm test
- job: LintAndSecurity
displayName: 'Lint and security scan'
steps:
- script: npm run lint
- script: npm audit --audit-level=high
- job: BuildArtifact
displayName: 'Build and publish artifact'
dependsOn: [UnitTests, LintAndSecurity]
condition: succeeded('UnitTests') and succeeded('LintAndSecurity')
steps:
- script: npm run buildالتحقق من البناء باستخدام سياسات الفروع
اربط خط أنابيب CI الخاص بك بـ سياسة فرع في Azure Repos لكي يُشغّل تلقائياً باعتباره فحص تحقق من البناء في طلبات السحب التي تستهدف main. ويُحظر الدمج حتى ينجح خط الأنابيب. ادمج عدة عمليات تحقق: يجب أن ينجح خط أنابيب CI، وأن يوافق مراجعان اثنان على الأقل، وأن تُحل جميع التعليقات، وأن يوجد عنصر عمل مرتبط. وينشئ ذلك بوابة جودة تجعل دمج التعليمات البرمجية المعطوبة في الفرع الرئيسي مستحيلاً.
# Add build validation via CLI
az repos policy build create \
--blocking true \
--branch main \
--branch-match-type exact \
--build-definition-id <pipeline-id> \
--display-name 'CI Build Validation' \
--enabled true \
--project MyProject \
--repository-id <repo-id> \
--queue-on-source-update-only true \
--manual-queue-only false \
--valid-duration 720 # Pipeline result expires after 12 hoursقراءة نتائج تشغيل خط الأنابيب
بعد اكتمال تشغيل خط الأنابيب، راجع النتائج في بوابة Azure DevOps. تعرض علامة التبويب Summary حالة النجاح أو الفشل الإجمالية والتوقيت. وتسرد علامة التبويب Tests جميع نتائج الاختبارات مع إمكانية التصفية حسب النتيجة. وتعرض علامة التبويب Code Coverage نسبة التغطية وتبرز الأسطر غير المغطاة. انقر فوق أي مهمة للاطلاع على مخرجات السجل خطوة بخطوة. وتعرض خطوط الأنابيب الفاشلة الخطوة التي تسببت في الفشل مميزة باللون الأحمر، مع مخرجات الخطأ الكاملة لتشخيص المشكلة بسرعة.
# View pipeline run results via CLI
az pipelines runs list \
--pipeline-ids <pipeline-id> \
--project MyProject \
--query '[].{id:id, status:status, result:result, startTime:startTime}' \
-o table
# View logs from a specific run
az pipelines runs logs list \
--run-id <run-id> \
--project MyProjectتحقق سريع
اختبر مدى فهمك لمفاهيم Microsoft Azure Fundamentals (AZ-900) التي تناولها هذا الدرس.
مراجعة الدرس
تعلّمت في هذا الدرس أن Azure Pipelines YAML يعرّف خطوط أنابيب CI باستخدام مراحل ومهام وخطوات للبناء والاختبار وإنشاء artifacts، وأن مشغلات PR وسياسات الفروع تفرض بوابات جودة تمنع دمج التعليمات البرمجية المعطوبة، وأن مهام PublishTestResults وPublishCodeCoverageResults تجعل جودة الاختبارات واضحة على مستوى الفريق. بعد ذلك، سنستكشف النشر المستمر إلى Azure.
الأسئلة الشائعة
هل درس «إنشاء مسار CI باستخدام Azure Pipelines» مجاني؟
نعم — نص درس «إنشاء مسار CI باستخدام Azure Pipelines» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Cloud & IT Cert Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Cloud & IT Cert Prep 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء مسار CI باستخدام Azure Pipelines»؟
حدّد مسار YAML يُشغَّل عند طلبات السحب، ويجري اختبارات الوحدة، وينتج عنصر بناء، ثم راجع نتائج الاختبارات وتغطية التعليمات البرمجية في المدخل. تتمرن على Cloud & IT Cert Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Cloud & IT Cert Prep؟
لا تُشترط خبرة سابقة. Cloud & IT Cert Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «إنشاء مسار CI باستخدام Azure Pipelines»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Cloud & IT Cert Prep هذا؟
نعم. كل درس في Cloud & IT Cert Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نظرة عامة على Azure DevOps Services
- إنشاء مسار CI باستخدام Azure Pipelines
- النشر المستمر إلى Azure
- GitHub Actions على Azure