Поделиться через


Развертывание на виртуальных машинах Linux в среде

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

Виртуальные машины можно добавить в качестве ресурсов в средах Azure Pipelines и нацелить их на развертывания. Для рабочего процесса непрерывной интеграции и непрерывного развертывания (CI/CD) история развертывания среды обеспечивает трассируемость каждой виртуальной машины к инициирующему коммиту.

В этой статье показано, как настроить конвейер Azure DevOps для развертываний в нескольких ресурсах виртуальной машины Linux в среде. Эти инструкции создают и развертывают приложение JavaScript или Java, но их можно адаптировать для любого приложения, публикующего пакет веб-развертывания.

Дополнительные сведения о средах и ресурсах, предназначенных для задания развертывания, см. в определении схемы YAML jobs.deployment.environment . Дополнительные сведения о заданиях развертывания см. в определении jobs.deployment .

Необходимые компоненты

Кроме того, для приложений JavaScript или Node.js:

Внимание

  • Для развертывания приложений целевые ресурсы виртуальной машины среды должны иметь все необходимые программы, зависимости, разрешения и имена входа, установленные и настроенные.
  • Чтобы использовать исходный код GitHub, необходимо подключение службы GitHub. GitHub также может предложить вам войти, установить приложение GitHub Azure Pipelines или авторизовать Azure Pipelines. Чтобы завершить каждый процесс, следуйте инструкциям на экране. Дополнительные сведения см. в разделе Access к репозиториям GitHub.

Создание среды и добавление виртуальных машин Linux

В проекте Azure Pipelines создайте среду и добавьте виртуальные машины Linux в качестве ресурсов среды, выполнив инструкции по созданию среды и добавлению виртуальной машины.

Запустите скрипт регистрации скопированного агента на каждой виртуальной машине, чтобы зарегистрировать его в среде. Вы также можете назначить теги отдельным виртуальным машинам, отвечая на интерактивные запросы.

Создание и запуск конвейера сборки

Создайте конвейер CI, который будет создавать и развертывать ваше приложение при каждом коммите в ветку main вашего репозитория кода.

Создание конвейера YAML

  1. В проекте Azure DevOps выберите конвейер ">Создать конвейер " или "Создать конвейер", а затем выберите GitHub в качестве расположения исходного кода.
  2. На экране "Выбор репозитория" выберите вилку репозитория.
  3. На экране "Настройка конвейера" выберите "Начальный конвейер".
  4. На экране Обзор вашего конвейера YAML замените созданный начальный код следующим кодом в зависимости от используемой среды выполнения.

Добавление задания сборки

Работа Build выполняет задачи по сборке и тестированию проекта и отправляет результаты сборки в drop местоположение. Это задание выполняется на агентах сборки, указанных в конвейере pool, а не на виртуальных машинах среды Linux.

Следующий конвейер собирает и тестирует проект Node.js с помощью npm, затем упаковывает выходные данные и отправляет их в расположение выгрузки.

trigger:
- main

pool:
  vmImage: ubuntu-latest

jobs:  
- job: Build
  displayName: Build
  steps:
  - task: UseNode@1
    inputs:
      version: '16.x'
    displayName: 'Install Node.js'
  - script: |
      npm install
      npm run build --if-present
      npm run test --if-present
    displayName: 'npm install, build and test'
  - task: ArchiveFiles@2
    displayName: 'Archive files'
    inputs:
      rootFolderOrFile: '$(System.DefaultWorkingDirectory)'
      includeRootFolder: false
      archiveType: tar
      tarCompression: gz
      archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).gz
      replaceExistingArchive: true
  - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).gz
    artifact: drop

Дополнительные сведения см. в разделе Сборка приложения Node.js с помощью gulp.

Запуск конвейера

Чтобы сохранить файл azure-pipelines.yml в репозитории и запустить конвейер CI/CD, нажмите кнопку "Сохранить и запустить", а затем нажмите кнопку "Сохранить и снова запустить ".

По завершении конвейера просмотрите страницу сводки заданий, чтобы убедиться, что задание сборки выполнено успешно, и в разделе "Связанные" появится 1 опубликованный артефакт.

Добавление и запуск задания развертывания

Задание развертывания выполняет хуки жизненного цикла preDeploy, deploy, routeTraffic, и postRouteTraffic один раз, а затем выполняет либо on: success, либо on: failure. При развертывании на виртуальные машины среды preDeploy фаза выполняется на агенте сборки, а не на виртуальных машинах этой среды. Все остальные шаги выполняются на зарегистрированных виртуальных машинах в среде.

  1. Необязательный preDeploy шаг выполняется перед развертыванием. Этот шаг можно использовать для оркестрации, подготовки виртуальных машин и артефактов, проверок работоспособности.
  2. Шаг deploy развертывает объект развертывания на виртуальных машинах целевой среды.
  3. Необязательный routeTraffic шаг может применять переключение трафика.
  4. Необязательный postRouteTraffic шаг может выполнять проверки состояния и уведомления.
  5. Пользовательские on.failure и on.success шаги могут предоставлять уведомления или восстановление.

Задание развертывания в среду с виртуальными машинами resourceType: VirtualMachine требует, чтобы эти машины могли выполнять все задачи конвейера, такие как Bash или Azure CLI. Вы можете использовать шаг preDeploy для установки необходимого программного обеспечения и разрешений на целевых виртуальных машинах.

Например, если шаг развертывания использует Azure CLI, виртуальные машины агента должны иметь Azure CLI, установленные и доступные в PATH для пользователя агента. Пользователь агента должен иметь разрешение на запуск интерфейса командной строки и должен пройти проверку подлинности в Azure. Возможно, потребуется добавить пользователя агента в sudoers или настроить переменные среды для автоматизации установки.

Вы можете использовать preDeploy скрипт для установки Azure CLI на целевых виртуальных машинах. Чтобы выполнить проверку подлинности в Azure, можно запустить az login, или для автоматизации определить служебный объект и выполнить az login --service-principal на этапе preDeploy.

Добавьте задание развертывания

Задание развертывания в приведенном примере начинается после успешного завершения задания Build. Чтобы добавить задание в конвейер, выполните следующие действия.

  1. Щелкните значок "Дополнительные действия " в правом верхнем углу страницы "Сводка ", выберите "Изменить конвейер" и добавьте следующий код в конец конвейера. Замените <environment-name> именем созданной среды.

    При желании можно выбрать определенные виртуальные машины из среды для развертывания, используя параметр tags и указав <VMtag>, который вы определили для виртуальной машины.

    - deployment: VMDeploy
      displayName: Web deploy
      dependsOn: Build
      condition: succeeded()
      environment:
        name: <environment-name>
        resourceType: VirtualMachine
        tags: <VMtag> # VMs to deploy to
    
  2. Добавьте strategy к заданию deployment. Стратегия развертывания runOnce является самым простым и выполняется по умолчанию, если не указатьstrategy. Эта стратегия выполняет шаги развертывания один раз на каждой виртуальной машине в среде без параллелизма или управления трафиком.

      strategy:
         runOnce:
           deploy:
              steps:
              - script: echo my first deployment
    
  3. После добавления задания развертывания выберите "Проверить и сохранить", а затем нажмите кнопку "Сохранить", " Выполнить" и снова нажмите кнопку "Выполнить ". При каждом выполнении этого задания история развертываний фиксируется относительно среды.

    Примечание.

    При первом запуске конвейера, использующего среду, необходимо предоставить разрешение для всех запусков конвейера для доступа к пулу агентов и среде. Выберите символ ожидания рядом с заданием на экране запуска сводки конвейера, а затем нажмите кнопку "Разрешить предоставить необходимые разрешения".

Стратегия последовательного развертывания

Вместо стратегии развертывания runOnce можно использовать rolling. Стратегия последовательного развертывания может управлять параллелизмом, проверками работоспособности и маршрутизацией трафика. runOnce Хотя стратегия выполняется на одной виртуальной машине одновременно, последовательное развертывание может выполняться параллельно при перекатных наборах до пяти целевых виртуальных машин в зависимости от maxParallel параметра.

Параметр maxParallel задает количество или процент виртуальных машин, которые должны оставаться доступными, гарантируя, что приложение может обрабатывать запросы и уменьшать общее время простоя во время развертывания. Этот параметр также определяет условия успешности и сбоя развертывания.

Дополнительные сведения о стратегии последовательного развертывания см. в определении схемы jobs.deployment.strategy.rolling .

Пример задания развертывания

Для развертывания ресурсов виртуальных машин требуется наличие всех необходимых приложений, зависимостей и разрешений, установленных и настроенных. Необходимо вручную предварительно установить эти требования, или конвейер должен установить или внедрить их.

Развертывание приложения Java на ресурсы виртуальных машин проще реализовать, так как оно самодостаточно. Виртуальная машина Java (JVM) часто предварительно настроена на агентах виртуальных машин, и вам не нужно беспокоиться о зависимости приложений, разрешениях или управлении пакетами. Вы можете просто скачать JAR-файл, а затем запустить его с java -jarпомощью.

Приложению Node.js требуется наличие и настройка Node.js, возможно, npm-зависимостей, а также диспетчер служб, такой как systemd, который должен быть установлен и настроен на каждой виртуальной машине агента. Для автоматизации скрипт развертывания конвейера должен быть неинтерактивным и иметь возможность перезапуска и управления службой приложения.

Следующее задание по развертыванию YAML rolling для приложения JavaScript зависит от успешного завершения этапа Build. Задание развертывания предполагает, что следующие требования уже предварительно установлены или предварительно настроены на каждой виртуальной машине агента. Для полной автоматизации можно установить и настроить эти приложения и службы на виртуальных машинах в рамках конвейера.

  • Node.js 16.x установлен и npm доступен в PATH на агенте сборки.
  • Система Systemd с файлом службы Systemd, настроенным для запуска Node.js приложения, например /etc/systemd/system/pipelines-javascript.service.
  • Настройка безпарольного доступа sudo для пользователя агента для необходимых команд через NOPASSWD: в /etc/sudoers.
  • Разрешения на запись для агентного пользователя в /opt/pipelines-javascript или другой целевой директории развертывания.

Подсказка

Для большинства приложений Node.js рекомендуется развертывать в Службе приложений Azure или использовать обычные задания конвейера с агентами, размещенными корпорацией Майкрософт, вместо использования заданий развертывания. Этот подход проще и позволяет избежать операционных накладных расходов на управление средами виртуальных машин. Развертывание на конкретных ресурсах виртуальных машин лучше всего подходит для сценариев, требующих прямого управления серверами виртуальных машин, расширенной оркестрацией или устаревшей инфраструктурой.

- stage: Deploy
  displayName: Rolling Deploy to VMs
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: RollingDeploy
    displayName: Rolling deploy to Ubuntu VMs
    environment:
      name: <environment-name>
      resourceType: VirtualMachine
    strategy:
      rolling:
        maxParallel: 1   #or 2 for parallel. For percentages, use x%
        preDeploy:
          steps:
          - download: current
            artifact: drop
          - script: echo "Pre-deploy on $(hostname)"
        deploy:
          steps:
          - script: |
              echo "Unpacking Node.js app on $(hostname)"
              sudo mkdir -p /opt/pipelines-javascript
              sudo tar -xzf $(Pipeline.Workspace)/drop/$(Build.BuildId).tar.gz -C /opt/pipelines-javascript --strip-components=1
              cd /opt/pipelines-javascript
              echo "Installing production dependencies"
              sudo npm ci --only=production
              echo "Restarting Node.js service"
              sudo systemctl restart pipelines-javascript
            displayName: 'Extract, install, and restart Node.js service'
        routeTraffic:
          steps:
          - script: echo "Routing traffic on $(hostname)"
        postRouteTraffic:
          steps:
          - script: echo "Post-route health check on $(hostname)"
        on:
          failure:
            steps:
            - script: echo "Deployment failed on $(hostname)"
          success:
            steps:
            - script: echo "Deployment succeeded on $(hostname)"

Доступ к трассировке конвейера в среде

Вкладка "Развертывания" обеспечивает полную трассируемость фиксаций и рабочих элементов, а также историю развертывания для среды с учетом всех конвейеров.

Снимок экрана: представление развертываний.