تمرين - تنفيذ نمط التوزيع الأزرق والأخضر
في Create a multistage pipeline by using Azure Pipelines، قمت بإنشاء مسار توزيع أساسي ينشر تطبيق ويب إلى Azure App Service في هذه المراحل: Dev و Test و Staging.
هنا يمكنك إضافة إلى سير العمل هذا عن طريق تطبيق نمط النشر الأزرق والأخضر أثناء التقسيم المرحلي.
للقيام بذلك عليك ما يلي:
- أضف فتحة توزيع إلى مثيل App Service الذي يتوافق مع التقسيم المرحلي.
- أضف مهمة إلى البنية الأساسية لبرنامج ربط العمليات التجارية لتبديل فتحات التوزيع.
إضافة فتحة توزيع
هنا يمكنك إضافة فتحة نشر إلى مثيل App Service الذي يتوافق مع التقسيم المرحلي.
بشكل افتراضي، يوفر كل مثيل App Service فتحة افتراضية، تسمى الإنتاج. قمت بالنشر إلى فتحة الإنتاج عند إعداد البنية الأساسية لبرنامج ربط العمليات التجارية في القسم السابق.
يمكن أن يحتوي مثيل App Service على فتحات متعددة. هنا يمكنك إضافة فتحة توزيع ثانية إلى مثيل App Service الذي يتوافق مع التقسيم المرحلي. تسمى فتحة التوزيع المبادلة.
لإضافة الفتحة:
انتقل إلى مدخل Azure وسجِّل الدخول.
في القائمة، حدد Cloud Shell. عند مطالبتك، حدد تجربة Bash .
قم بتشغيل الأمر التالي للحصول على اسم مثيل خدمة التطبيق الذي يتوافق مع التشغيل المرحلي وتخزين النتيجة في متغير 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".staging
اطبع المتغير للتحقق من حصولك على الاسم الصحيح.echo $staging
فيما يلي مثال على الإخراج:
tailspin-space-game-web-staging-1234
قم بتشغيل الأمر التالي لإضافة فتحة تسمى swap إلى بيئة التقسيم المرحلي.
az webapp deployment slot create \ --name $staging \ --resource-group tailspin-space-game-rg \ --slot swap
قم بتشغيل الأمر التالي لسرد اسم مضيف فتحة التوزيع.
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
دون اسم المضيف هذا لاحقا.
كخطوة اختيارية، انتقل إلى موقعك في مستعرض. ترى الصفحة الرئيسية الافتراضية لأنك لم تقم بعد بنشر التعليمات البرمجية الخاصة بك إلى هذه الفتحة.
بشكل افتراضي، يمكن الوصول إلى فتحة التوزيع من الإنترنت. في الممارسة العملية، يمكنك تكوين شبكة Azure ظاهرية تضع فتحة التبديل في شبكة غير قابلة للتوجيه من الإنترنت ولكن يمكن لفريقك فقط الوصول إليها. ستبقى فتحة الإنتاج الخاصة بك قابلة للوصول من الإنترنت.
تبديل فتحات التوزيع في التقسيم المرحلي
هنا يمكنك استخدام المهمة AzureAppServiceManage@0 لمبادلة فتحات النشر في البيئة التدريج الخاص بك.
يمكنك أيضا استخدام هذه المهمة لبدء فتحة أو إيقافها أو حذفها. أو يمكنك استخدامه لتثبيت ملحقات الموقع أو لتمكين المراقبة المستمرة على App Service.
في 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" تبديل فتحات المصدر والهدف.
يتم نشر هذا التكوين دائما في فتحة التبديل . ثم يقوم بتبديل فتحات الإنتاج والمبادلة. تضمن عملية التبديل أن الإنتاج يشير إلى النشر الأحدث.
في الوحدة الطرفية المتكاملة، أضف azure-pipelines.yml إلى الفهرس. قم بتنفيذ التغييرات، ثم ادفع الفرع إلى GitHub.
تلميح
احفظ azure-pipelines.yml قبل تشغيل أوامر Git هذه.
git add azure-pipelines.yml git commit -m "Swap deployment slots" git push origin blue-green
في Azure Pipelines، تتبع البنية من خلال كل خطوة من الخطوات.
إشعار
إذا واجهت الخطأ ...'staging' slot did not respond to http ping. (CODE: 417)
التالي، فحاول إعادة تشغيل خدمة التطبيق لديك. إذا استمرت المشكلة، قم بإعادة تعيين التبديل التلقائي للفتحة الخاصة بك.
كخطوة اختيارية، في المستعرض، انتقل إلى عنوان URL الذي يتوافق مع كل مرحلة.
على الرغم من أنك لم تقم بعد بإجراء تغييرات على موقع الويب، إلا أنك ترى أن موقع Space Game تم نشره بنجاح في كل بيئة App Service.