Розгортання ASP.NET Core застосунку за допомогою Azure DevOps Pipelines

pipelinesAzure DevOps — це потужний набір інструментів, розроблений, щоб допомогти командам розробників оптимізувати життєвий цикл розробки програмного забезпечення. Одним із ключових аспектів Azure DevOps є його підтримка безперервної інтеграції та безперервного розгортання (CI/CD) за допомогою Azure Pipelines. CI/CD є критично важливою практикою в сучасній розробці програмного забезпечення, що дозволяє командам автоматизувати процес збірки, тестування та розгортання застосунків, щоб гарантувати швидке та надійне доставку змін до кінцевих користувачів.

У цій статті ми ознайомимось із процесом налаштування процесу CI/CD за допомогою Azure DevOps для ASP.NET Core застосунку. Для налаштування процесу CI/CD в Azure DevOps існують Azure Pipelines або просто Pipelines. Ми будемо створювати Pipeline за допомогою YAML. Pipelines складатиметься з кількох етапів: збірки застосунку, його розгортання в тестовому середовищі в Azure, очікування затвердження QA та, нарешті, розгортання застосунку у робочому середовищі, також розміщеному в Azure. Ми також розглянемо використання заміни слотів, це функція в Azure, яка дозволяє легко перемикатися між різними версіями веб застосунку (App Service/Web App), з мінімальним простоєм.

Для початку створення Pipeline нам необхідно щоб в нашому Azure DepOps вже був Git репозиторій, та ми мали підпуску в Microsoft Azure. Якщо це все є, ми можемо починати.

Спочатку нам необхідно екземпляр Azure App Service та створити слот для тестового середовищ.

Для того щоб створи екземпляряр Azure App Service:

  • Увійдіть на портал Azure (https://portal.azure.com/).
  • Натисніть кнопку “Create a resource” у верхньому лівому куті.
  • Знайдіть “Web App” і виберіть його серед результатів.
  • Натисніть “Create” , щоб розпочати процес створення служби додатків.

Заповніть відчинившуюся сторінку.

  • Оберіть підписку в якій необхідно розгорнути ресурс.
  • В полі “Resource group” оберіть існуючу групу, або ви можете створити нову ресурсну групи, натиснувши “Create new” і введіть ім’я для< нової групи.
  • В полі “Name” введіть унікальну назву для свого AppService.
  • В полі “Publish” виберіть “Code” як варіант розгортання.
  • Оберіть необхідну версію .net, в полі “Runtime stack”
  • Оберіть регіон а також App Service Plan. Якщо у вас немає існуючого App Service Plan, ви можете створити новий, натиснувши “Create new” і вибравши потрібні параметри.
  • Натисніть “Review + create”, щоб переглянути свої налаштування, і натисніть “Create”, щоб створити екземпляр AppService (Web App).

Після створення App Service необхідно створити слот. Для цього:

  • Відкрийте щойно створений App Service
  • На панелі навігації App Service прокрутіть униз до розділу “Deployment” і натисніть “Deployment slots”.
  • У верхній частині панелі “Deployment slots” натисніть кнопку “+ Add Slot”.
  • На панелі “Add a slot” в полі “Name” введіть “staging”.

За бажанням ви можете клонувати налаштування з наявного слота розгортання, вибравши його зі спадного меню “Clone settings from”.

Щоб pipeline міг взаємодіяти з ресурсами Azure, необхідно створити підключення служби між Azure DevOps і вашою підпискою Azure.

  • Перейдіть до свого проекту Azure DevOps і перейдіть до “Project Settings” в нижньому лівому куті інформаційної панелі.
  • На сторінці “Project Settings” клацніть “Service connections” в розділі “Pipelines”.
  • Натисніть кнопку “New service connection” та виберіть “Azure Resource Manager” зі списку доступних служб. Та натисніть копку “Next”
  • Оберіть тип автентифікацію
  • Дотримуйтеся вказівок, щоб пройти автентифікацію за допомогою облікового запису Azure і надати Azure DevOps доступ до вашої підписки.
  • Після встановлення підключення ви побачите нове підключення до служби Azure Resource Manager у списку “Service connections”

Тепер, коли ви створили в Azure App Service, а також додатковий слот для розгортання, ми можемо почати створення pipeline для розгортання вашого ASP.NET Core застосунку.

Для початку треба додати наші Environment, для цього необхідно виконати наступні кроки

  • Увійдіть в Azure DevOps і перейдіть до свого проекту
  • Натисніть “Pipelines” на лівій бічній панелі
  • Натисніть “Environments” на верхній панелі
  • Натисніть “Create Environment”
  • Введіть “Test” як назву середовища
  • За бажанням ви можете додати опис цього середовища
  • Натисніть “Create”
  • Знову натисніть “Create Environment”
  • Введіть “Production” як назву середовища
  • За бажанням ви можете додати опис цього середовища
  • Натисніть “Create”
  • Клацніть щойно створене середовище “Production”, щоб відкрити його
  • Натисніть меню з трьома крапками (⋮) у верхньому правому куті та виберіть “Approvals and checks”
  • Натисніть “+ New check” і виберіть зі списку “Approval”
  • Додайте користувачів або групи в поле “Approvers”, які відповідатимуть за затвердження розгортань у Production середовищі
  • Додайте пояснення в поле “Instructions to approvers”
  • Натисніть “Create”, щоб зберегти налаштування затвердження

Тепер у вас є тестове та робоче середовища, створені в Azure DevOps. Щоразу, коли запускається розгортання для виробничого середовища, призначені особи, які затверджують, отримають сповіщення про схвалення або відхилення розгортання.

  • Увійдіть в Azure DevOps і перейдіть до свого проекту
  • Натисніть “Pipelines” на лівій бічній панелі
  • Натисніть “Create Pipeline”
  • Виберіть місце, де розміщено ваш код (Azure Repos Git, GitHub, Bitbucket Cloud або інший Git)
  • Виберіть репозиторій, який містить ваш застосунок
  • Azure DevOps запропонує шаблон обрати шаблон, оберіть будь який шаблон
  • На відчинившийся сторінці знаходить редактор YAML, видаліть весь тест, який знаходиться в редакторі

Тепер почнемо створювати наш YAML. С початку опишемо правило, при якому, буде запускатись pipeline. Для цього напишемо

trigger:
- main

Тепер давайте опишемо перший етап. Для цього додайте наступний код

stages:
- stage: Build
  displayName: 'Build and Test'
  jobs:
  - job: BuildJob
    displayName: 'Build Job'
    pool:
      vmImage: 'ubuntu-latest'
    steps:
    - task: DotNetCoreCLI@2
      displayName: 'Restore Packages'
      inputs:
        command: 'restore'
        projects: '**/*.csproj'

    - task: DotNetCoreCLI@2
      displayName: 'Build Solution'
      inputs:
        command: 'build'
        projects: '**/*.csproj'
        arguments: '--configuration Release'

    - task: DotNetCoreCLI@2
      displayName: 'Run Tests'
      inputs:
        command: 'test'
        projects: '**/*Tests/*.csproj'
        arguments: '--configuration Release'

    - task: DotNetCoreCLI@2
      displayName: 'Publish Artifacts'
      inputs:
        command: 'publish'
        publishWebProjects: true
        arguments: '--configuration Release --output $(Build.ArtifactStagingDirectory)'
        zipAfterPublish: true

    - task: PublishBuildArtifacts@1
      displayName: 'Upload Artifacts'
      inputs:
        pathtoPublish: '$(Build.ArtifactStagingDirectory)'
        artifactName: 'drop'

Цей код YAML описує етап Build, ось деталі:

  • stage: Build – початок етапу Build. Цей етап включає в себе всі завдання, які будуть виконуватися в процесі збірки.
  • displayName: ‘Build and Test’ – зрозуміла для людини назва етапу збірки.
  • jobs список завдань для виконання на етапі збірки. Роботи є основною одиницею роботи в конвеєрі, і вони виконуються незалежно одне від одного. У цьому випадку є одне завдання: BuildJob.
  • job: BuildJob – початок BuildJob. Ця робота включає всі завдання, які будуть виконуватися під час цієї роботи.
  • pool вказує пул агентів, який використовуватиметься для виконання завдання.
  • steps список кроків, які потрібно виконати.
  • task: DotNetCoreCLI@2 – використовує завдання .NET Core CLI версії 2 для виконання різних команд .NET Core. Тут використовуються чотири завдання, кожне з яких має окрему команду:
  • task: PublishBuildArtifacts@1 – публікує результати збірки для використання на наступних етапах конвеєра або для зберігання:
    • command: ‘restore’: відновлює пакети NuGet, необхідні для проектів .NET Core. command: ‘build’: збирає проекти .NET Core із конфігурацією Release.
    • command: ‘test’: запускає модульні тести в будь-яких проектах, які закінчуються на “Tests”.
    • command: ‘publish’: публікує веб-проекти .NET Core. Вихідні дані заархівовуються та поміщаються в проміжний каталог Build Artifact.

Наступним корком буде етап публікації застосунку в staging слот

- stage: DeployTest
  displayName: 'Deploy to Test Environment'
  dependsOn: Build
  condition: succeeded('Build')
  jobs:
  - deployment: DeployTestJob
    displayName: 'Deploy Test Job'
    environment: 'Test'
    pool:
      vmImage: 'ubuntu-latest'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadBuildArtifacts@0
            displayName: 'Download Artifacts'
            inputs:
              buildType: 'current'
              artifactName: 'drop'
              downloadPath: '$(System.ArtifactsDirectory)'

          - task: AzureWebApp@1
            displayName: 'Deploy to Test Environment'
            inputs:
              azureSubscription: '$(AzureSubscriptionName)'
              appName: '$(AppServiceName)'
              appType: 'webApp'
              package: '$(System.ArtifactsDirectory)/drop/**/*.zip'
              slotName: 'staging'
  • stage: DeployTest – визначає новий етап під назвою “DeployTest”.
  • displayName: Deploy to Test Environment – зрозуміла для людини назва цього етапу, яка відображається в інтерфейсі користувача.
  • dependentOn: Build – Це означає, що етап “DeployTest” залежить від етапу “Build”. Він буде виконано лише в тому випадку, якщо етап “Build” завершиться успішно.
  • condition: succeeded(‘Build’) – це умова, яка перевіряє, чи успішно завершився етап “Build”. Якщо етап “Build” не завершився успішно, етап “DeployTest” не буде запущено.
  • jobs – Цей розділ містить завдання для етапу “DeployTest”.
  • deployment: DeployTestJob – розгортання під назвою “DeployTestJob”. Завдання розгортання мають додаткові можливості порівняно зі звичайними завданнями, як-от доступ до історії розгортання та змінних середовища.
  • environment: “Test” – це вказує, що буде розгорнуто в середовищі під назвою “Test”.
  • pool – Це вказує пул агентів, який використовуватиметься для виконання завдання. У цьому випадку він використовуватиме найновіший образ Ubuntu.
  • strategy – Цей розділ визначає стратегію розгортання. У цьому випадку стратегією є runOnce, що означає, що розгортання буде виконано один раз.
  • task: DownloadBuildArtifacts@0 – завантажує артефакти збірки з попереднього етапу “Build”. Він завантажує артефакт “drop”, який було створено на етапі “Build”.
  • task: AzureWebApp@1 – розгортає завантажені артефакти у веб-програмі Azure. Він використовує змінні AzureSubscriptionName і AppServiceName для підписки Azure та назви служби додатків. (як додати змінні читайте нижще)

І останній етап, це перенесення застосунку з тестового(staging) слоту, в основний. Нижче приведено код для цього етапу.

- stage: DeployProduction
  displayName: 'Deploy to Production Environment'
  dependsOn: DeployTest
  condition: succeeded('DeployTest')
  jobs:
  - deployment: DeployProductionJob
    displayName: 'Deploy Production Job'
    environment: 'Production'
    pool:
      vmImage: 'ubuntu-latest'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: AzureAppServiceManage@0
            displayName: 'Swap Slots'
            inputs:
              azureSubscription: '$(AzureSubscriptionName)'
              action: 'Swap Slots'
              webAppName: '$(AppServiceName)'
              ResourceGroupName: '$(RgName)'
              sourceSlot: 'staging'
  • stage : DeployProduction – це визначає новий етап під назвою “DeployProduction”.
  • displayName: ‘Deploy to Production Environment’ – це зрозуміла для людини назва цього етапу, яка відображається в інтерфейсі користувача.
  • dependsOn: DeployTest – це означає, що етап “DeployProduction” залежить від етапу “DeployTest”. Він буде виконано, лише якщо етап “DeployTest” завершиться успішно.
  • condition: succeeded(‘DeployTest’) – це умова, яка перевіряє, чи етап “DeployTest” завершився успішно.
  • jobs: – цей розділ містить завдання для етапу “DeployProduction”
  • deployment: DeployProductionJob – розгортання під назвою “DeployProductionJob”.
  • environment: ‘ Production’ – це вказує, що буде розгорнуто в середовищі під назвою “Виробництво”.
  • pool – це визначає пул агентів, який використовуватиметься для виконання завдання.
  • strategy – цей розділ визначає стратегію розгортання. У цьому випадку стратегією є runOnce, що означає, що розгортання буде виконано один раз.
  • Steps цей розділ містить кроки, які будуть виконані як частина цього завдання.
  • task: AzureAppServiceManage@0 – керує службою додатків Azure. У цьому випадку він використовується для того, щоб поміняти місцями проміжні та робочі слоти. Заміна слотів – це спосіб розгортання програм без простою.

Так як в нашому YAML ми використовуємо змінні, їх значення необхідно додати для цього pipeline. Щоб це зробити необхідно виконати наступні кроки:

  • Згори, з правого боку натисніть на кнопку “Variables”.
  • Натисніть кнопку “New variable”, щоб створити нову змінну конвеєра.
    • У поле Name введіть AzureSubscriptionName
    • У поле Value введіть назву вашого підключення до Azure
    • Ви можете зробити змінну секретною, перемкнувши перемикач “Keep this value secret”. Секретні змінні зашифровані та не відоюражуються в журналах.
    • Натисніть “Ok”, щоб зберегти змінну.
  • Також же створити 2 змінні, а саме AppServiceName в якій буде зберігатись назва вашого App Service таRgName, яка зберігає назву ресурсної групи, в якій разгорнут App Serivce.
  • Натисніть “ОК”, щоб зберегти змінні.

Після всіх змін треба натиснути Save and Run

Повну версію YAML файла ви можете знвайти тут

Залишити коментар