0Pricing
Cloud & IT Cert Prep · Урок

Создание конвейера непрерывной интеграции с Azure Pipelines

Определите конвейер YAML, запускаемый при запросах на включение изменений, выполняйте модульные тесты и создавайте артефакт сборки, а затем просматривайте результаты тестов и покрытие кода на портале.

«Создание конвейера непрерывной интеграции с Azure Pipelines» — бесплатный урок Cloud & IT Cert Prep на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cloud & IT Cert Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cloud & IT Cert Prep содержит 4 уроков всего.

Что такое непрерывная интеграция

Непрерывная интеграция (CI) — это практика частого объединения изменений кода в общую ветку, при которой каждое объединение автоматически запускает сборку и тестирование. Цель — как можно раньше обнаружить ошибки интеграции, до того как они перерастут в крупные и трудно исправимые проблемы. Хороший конвейер CI собирает код, запускает модульные тесты, измеряет покрытие кода, выполняет статический анализ и создает артефакт, готовый к развертыванию, за несколько минут. 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) срабатывают при создании или обновлении 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), либо задачи (готовые параметризованные компоненты из Marketplace 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 logs

Артефакты: упаковка результатов сборки

После успешной сборки упакуйте результат в артефакт конвейера, чтобы последующие этапы, например развертывание, могли получить к нему доступ. Используйте PublishPipelineArtifact, чтобы загрузить файлы с агента сборки в хранилище артефактов Azure DevOps. На последующем этапе или в другом задании используйте DownloadPipelineArtifact, чтобы получить артефакт. Это отделяет задание сборки от заданий развертывания, которые могут выполняться на других агентах или на других этапах.

# 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 должен завершиться успешно, как минимум 2 рецензента должны одобрить изменения, все комментарии должны быть разрешены, а связанный рабочий элемент должен существовать. Так создается контроль качества, не позволяющий объединить неисправный код с основной веткой.

# 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 с этапами, заданиями и шагами для сборки, тестирования и создания артефактов; триггеры PR и политики веток обеспечивают контроль качества, блокирующий объединение неисправного кода; а задачи PublishTestResults и PublishCodeCoverageResults делают качество тестирования видимым для всей команды. Далее мы рассмотрим непрерывное развертывание в Azure.

Часто задаваемые вопросы

Урок «Создание конвейера непрерывной интеграции с Azure Pipelines» бесплатный?

Да — полный текст урока «Создание конвейера непрерывной интеграции с Azure Pipelines» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cloud & IT Cert Prep, подпишись на CoddyKit PRO. Курс Cloud & IT Cert Prep содержит 4 уроков всего.

Чему я научусь в уроке «Создание конвейера непрерывной интеграции с Azure Pipelines»?

Определите конвейер YAML, запускаемый при запросах на включение изменений, выполняйте модульные тесты и создавайте артефакт сборки, а затем просматривайте результаты тестов и покрытие кода на портале. Ты практикуешь Cloud & IT Cert Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Cloud & IT Cert Prep?

Предыдущий опыт не требуется. Cloud & IT Cert Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Создание конвейера непрерывной интеграции с Azure Pipelines»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Cloud & IT Cert Prep?

Да. Каждый урок Cloud & IT Cert Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Обзор Azure DevOps Services
  2. Создание конвейера непрерывной интеграции с Azure Pipelines
  3. Непрерывное развертывание в Azure
  4. GitHub Actions в Azure
← Назад к Cloud & IT Cert Prep