تمرين - تنفيذ نمط التوزيع الأزرق والأخضر

مكتمل

في Create a multistage pipeline by using Azure Pipelines، قمت بإنشاء مسار توزيع أساسي ينشر تطبيق ويب إلى Azure App Service في هذه المراحل: Dev و Test و Staging.

هنا يمكنك إضافة إلى سير العمل هذا عن طريق تطبيق نمط النشر الأزرق والأخضر أثناء التقسيم المرحلي.

للقيام بذلك عليك ما يلي:

  • أضف فتحة توزيع إلى مثيل App Service الذي يتوافق مع التقسيم المرحلي.
  • أضف مهمة إلى البنية الأساسية لبرنامج ربط العمليات التجارية لتبديل فتحات التوزيع.

إضافة فتحة توزيع

هنا يمكنك إضافة فتحة نشر إلى مثيل App Service الذي يتوافق مع التقسيم المرحلي.

بشكل افتراضي، يوفر كل مثيل App Service فتحة افتراضية، تسمى الإنتاج. قمت بالنشر إلى فتحة الإنتاج عند إعداد البنية الأساسية لبرنامج ربط العمليات التجارية في القسم السابق.

يمكن أن يحتوي مثيل App Service على فتحات متعددة. هنا يمكنك إضافة فتحة توزيع ثانية إلى مثيل App Service الذي يتوافق مع التقسيم المرحلي. تسمى فتحة التوزيع المبادلة.

لإضافة الفتحة:

  1. انتقل إلى مدخل Azure وسجِّل الدخول.

  2. في القائمة، حدد Cloud Shell. عند مطالبتك، حدد تجربة Bash .

  3. قم بتشغيل الأمر التالي للحصول على اسم مثيل خدمة التطبيق الذي يتوافق مع التشغيل المرحلي وتخزين النتيجة في متغير Bash الذي تم تسميته staging.

    staging=$(az webapp list \
      --resource-group tailspin-space-game-rg \
      --query "[?contains(@.name, 'tailspin-space-game-web-staging')].{name: name}" \
      --output tsv)
    

    --queryتستخدم الوسيطة JMESPath، وهي لغة استعلام لـ JSON. تحدد الوسيطة مثيل App Service الذي يحتوي حقله name على "tailspin-space-game-web-staging".

  4. staging اطبع المتغير للتحقق من حصولك على الاسم الصحيح.

    echo $staging
    

    فيما يلي مثال على الإخراج:

    tailspin-space-game-web-staging-1234
    
  5. قم بتشغيل الأمر التالي لإضافة فتحة تسمى swap إلى بيئة التقسيم المرحلي.

    az webapp deployment slot create \
      --name $staging \
      --resource-group tailspin-space-game-rg \
      --slot swap
    
  6. قم بتشغيل الأمر التالي لسرد اسم مضيف فتحة التوزيع.

    az webapp deployment slot list \
        --name $staging \
        --resource-group tailspin-space-game-rg \
        --query [].hostNames \
        --output tsv
    

    تشبه النتيجة هذا الإخراج:

    tailspin-space-game-web-staging-25391-swap.azurewebsites.net
    

    دون اسم المضيف هذا لاحقا.

  7. كخطوة اختيارية، انتقل إلى موقعك في مستعرض. ترى الصفحة الرئيسية الافتراضية لأنك لم تقم بعد بنشر التعليمات البرمجية الخاصة بك إلى هذه الفتحة.

    Screenshot of the default home page in Azure App Service.

بشكل افتراضي، يمكن الوصول إلى فتحة التوزيع من الإنترنت. في الممارسة العملية، يمكنك تكوين شبكة Azure ظاهرية تضع فتحة التبديل في شبكة غير قابلة للتوجيه من الإنترنت ولكن يمكن لفريقك فقط الوصول إليها. ستبقى فتحة الإنتاج الخاصة بك قابلة للوصول من الإنترنت.

تبديل فتحات التوزيع في التقسيم المرحلي

هنا يمكنك استخدام المهمة AzureAppServiceManage@0 لمبادلة فتحات النشر في البيئة التدريج الخاص بك.

يمكنك أيضا استخدام هذه المهمة لبدء فتحة أو إيقافها أو حذفها. أو يمكنك استخدامه لتثبيت ملحقات الموقع أو لتمكين المراقبة المستمرة على App Service.

  1. في Visual Studio Code، قم بتعديل azure-pipelines.yml باستخدام هذه التعليمة البرمجية:

    تلميح

    يمكنك استبدال الملف بأكمله أو تحديث الجزء المميز فقط.

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
    
    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs: 
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-20.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '6.x'
    
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET SDK $(dotnetSdkVersion)'
          inputs:
            version: '$(dotnetSdkVersion)'
    
        - task: Npm@1
          displayName: 'Run npm install'
          inputs:
            verbose: false
    
        - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
          displayName: 'Compile Sass assets'
    
        - task: gulp@1
          displayName: 'Run gulp tasks'
    
        - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
          displayName: 'Write build info'
          workingDirectory: $(wwwrootDir)
    
        - task: DotNetCoreCLI@2
          displayName: 'Restore project dependencies'
          inputs:
            command: 'restore'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Build the project - $(buildConfiguration)'
          inputs:
            command: 'build'
            arguments: '--no-restore --configuration $(buildConfiguration)'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Publish the project - $(buildConfiguration)'
          inputs:
            command: 'publish'
            projects: '**/*.csproj'
            publishWebProjects: false
            arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)'
            zipAfterPublish: true
    
        - publish: '$(Build.ArtifactStagingDirectory)'
          artifact: drop
    
    - stage: 'Dev'
      displayName: 'Deploy to the dev environment'
      dependsOn: Build
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: dev
        variables:
        - group: Release
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  appName: '$(WebAppNameDev)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
    - stage: 'Test'
      displayName: 'Deploy to the test environment'
      dependsOn: Dev
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: test
        variables:
        - group: 'Release'
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  appName: '$(WebAppNameTest)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
    - stage: 'Staging'
      displayName: 'Deploy to the staging environment'
      dependsOn: Test
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: staging
        variables:
        - group: 'Release'
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  deployToSlotOrASE: 'true'
                  resourceGroupName: 'tailspin-space-game-rg'
                  slotName: 'swap'
                  appName: '$(WebAppNameStaging)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
              - task: AzureAppServiceManage@0
                displayName: 'Swap deployment slots'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  resourceGroupName: 'tailspin-space-game-rg'
                  webAppName: '$(WebAppNameStaging)'
                  sourceSlot: 'swap'
                  targetSlot: 'production'
                  action: 'Swap Slots'
    

    لاحظ هذه التغييرات:

    • AzureWebApp@1 تحدد المهمة الآن هذه القيم:
      • deployToSlotOrASE، عند التعيين إلى true، يتم النشر إلى فتحة نشر موجودة.
      • resourceGroupName يحدد اسم مجموعة الموارد. هذه القيمة مطلوبة عندما deployToSlotOrASE تكون true.
      • slotName يحدد اسم فتحة النشر. هنا يمكنك النشر إلى الفتحة المسماة swap.
    • المهمة الجديدة، ، AzureAppServiceManage@0تبدل فتحات التوزيع.
      • sourceSlot وحدد targetSlot الفتحات المراد تبديلها.
      • action يحدد الإجراء الذي يجب اتخاذه. تذكر أنه يمكنك استخدام هذه المهمة لبدء فتحة أو إيقافها أو حذفها. هنا، تحدد "Swap Slots" تبديل فتحات المصدر والهدف.

    يتم نشر هذا التكوين دائما في فتحة التبديل . ثم يقوم بتبديل فتحات الإنتاج والمبادلة. تضمن عملية التبديل أن الإنتاج يشير إلى النشر الأحدث.

  2. في الوحدة الطرفية المتكاملة، أضف azure-pipelines.yml إلى الفهرس. قم بتنفيذ التغييرات، ثم ادفع الفرع إلى GitHub.

    تلميح

    احفظ azure-pipelines.yml قبل تشغيل أوامر Git هذه.

    git add azure-pipelines.yml
    git commit -m "Swap deployment slots"
    git push origin blue-green
    
  3. في Azure Pipelines، تتبع البنية من خلال كل خطوة من الخطوات.

إشعار

إذا واجهت الخطأ ...'staging' slot did not respond to http ping. (CODE: 417) التالي، فحاول إعادة تشغيل خدمة التطبيق لديك. إذا استمرت المشكلة، قم بإعادة تعيين التبديل التلقائي للفتحة الخاصة بك.

  1. كخطوة اختيارية، في المستعرض، انتقل إلى عنوان URL الذي يتوافق مع كل مرحلة.

    على الرغم من أنك لم تقم بعد بإجراء تغييرات على موقع الويب، إلا أنك ترى أن موقع Space Game تم نشره بنجاح في كل بيئة App Service.

    Screenshot of a browser that shows the Space Game website in the Dev environment.