﻿# Запуск PVS\-Studio в Azure DevOps

[Azure DevOps](https://azure.microsoft.com/en-in/services/devops/) – облачная платформа, предоставляющая возможность разработки, выполнения приложений и хранения данных на удаленных серверах\. В состав платформы входят инструменты Azure Pipeline, Azure Board, Azure Artifacts и другие, позволяющие ускорить процесс создания программного обеспечения и повысить его качество\.


> В данной документации рассматривается пример по интеграции PVS\\\-Studio для анализа C\\\# кода\\\. Команды запуска PVS\\\-Studio для анализа C, C\\\+\\\+ или Java кода будут отличаться\\\. Смотрите соответствующие разделы документации: "\[Кроссплатформенная проверка C и C\\\+\\\+ проектов в PVS\\\-Studio\]\(https://pvs\-studio\.ru/ru/docs/manual/6615/\)" и "\[Работа с ядром Java анализатора из командной строки\]\(https://pvs\-studio\.ru/ru/docs/manual/6703/\)"\\\.

Рассмотрим пример для интеграции анализа в сборку проекта\.

Перейдите в раздел 'Pipelines \-\> Builds' и создайте новый Build pipeline\.

![Azure_DevOps_ru/image1.png](https://import.viva64.com/docx/blog/Azure_DevOps_ru/image1.png)

Укажите источник проекта\. Например, GitHub\.

![Azure_DevOps_ru/image2.png](https://import.viva64.com/docx/blog/Azure_DevOps_ru/image2.png)

Авторизуйте приложение Azure Pipelines и укажите репозиторий с проектом\.

![Azure_DevOps_ru/image3.png](https://import.viva64.com/docx/blog/Azure_DevOps_ru/image3.png)

В окне выбора шаблона укажите 'Starter pipeline'\.

![Azure_DevOps_ru/image4.png](https://import.viva64.com/docx/blog/Azure_DevOps_ru/image4.png)

Запустить статический анализ кода проекта можно, используя Microsoft\-hosted либо self\-hosted агенты\.

## Использование Microsoft\-hosted агента

Microsoft\-hosted агенты представляют собой обычные виртуальные машины, которые запускаются при запуске Pipeline и удаляются после завершения задачи\. Использование таких агентов позволяет не тратить время на их поддержку и обновление\.

Заменим сценарий сборки по умолчанию следующим образом:

```cpp
# Настройка триггеров запуска. Запуск для изменений только в master-ветке
trigger:
- master

# Так как установка произвольного ПО в виртуальные машины
# запрещена, воспользуемся Docker-контейнером,
# запущенном в виртуальной машине с Windows Server 1803
pool:
  vmImage: 'win1803'
container: microsoft/dotnet-framework:4.7.2-sdk-windowsservercore-1803

steps:
# Загрузка дистрибутива анализатора
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: 'Invoke-WebRequest 
               -Uri https://files.pvs-studio.com/PVS-Studio_setup.exe 
               -OutFile PVS-Studio_setup.exe'
- task: CmdLine@2
  inputs:
    workingDirectory: $(System.DefaultWorkingDirectory)
    script: |
# Восстанавливаем проект и скачиваем зависимости
      nuget restore .\ShareX.sln
# Создаем директорию, куда будут сохранены файлы с отчетами анализатора
      md .\PVSTestResults
# Устанавка анализатора
      PVS-Studio_setup.exe /VERYSILENT /SUPPRESSMSGBOXES 
                           /NORESTART /COMPONENTS=Core
# Регистрация лицензионной информации
      "C:\Program Files (x86)\PVS-Studio\PVS-Studio_Cmd.exe" 
          credentials 
          -u $(PVS_USERNAME) 
          -n $(PVS_KEY)
# Запуск анализа PVS-Studio
      "C:\Program Files (x86)\PVS-Studio\PVS-Studio_Cmd.exe" 
         -t .\ShareX.sln  
         -o .\PVSTestResults\ShareX.plog
# Преобразование отчета в html формат.
      "C:\Program Files (x86)\PVS-Studio\PlogConverter.exe" 
         -t html 
         -o .\PVSTestResults\ 
         .\PVSTestResults\ShareX.plog
# Публикация отчетов анализатора
- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
```

Далее нужно добавить переменные, которые используются для создания файла лицензии\. Для этого откройте окно редактирования Pipeline, и в правом верхнем углу нажмем кнопку 'Variables'\.

![Azure_DevOps_ru/image5.png](https://import.viva64.com/docx/blog/Azure_DevOps_ru/image5.png)

Добавьте переменные – 'PVS\_USERNAME' и 'PVS\_KEY', содержащие имя пользователя анализатора, привязанное к ключу, и лицензионный ключ соответственно\. При создании переменной 'PVS\_KEY'_ _не забудьте отметить пункт 'Keep this value secret' для шифрования значения переменной, а также подавления вывода значения переменной в лог выполнения задачи\.

![Azure_DevOps_ru/image6.png](https://import.viva64.com/docx/blog/Azure_DevOps_ru/image6.png)

Для проверки запустите Pipeline кнопкой 'Run'\.

## Использование self\-hosted агента

Второй вариант запуска анализа – использовать self\-hosted агент\. Self\-hosted агенты \- это агенты, настраиваемые и управляемые самостоятельно\. Такие агенты дают больше возможностей для установки программного обеспечения, которое необходимо для сборки и тестирования программного продукта\. 

Перед использованием таких агентов их необходимо настроить согласно [инструкции](https://docs.microsoft.com/ru-ru/azure/devops/pipelines/agents/v2-windows?view=azure-devops), а также установить и [настроить](https://pvs-studio.ru/ru/docs/manual/0046/) статический анализатор\.

Для запуска задачи на self\-hosted агенте заменим предлагаемую конфигурацию по умолчанию на следующую:

```cpp
# Настройка триггеров запуска. Анализ для master-ветки
trigger:
- master

# Задача запускается на self-hosted агенте из пула 'MyPool' 
pool: 'MyPool'

steps:
- task: CmdLine@2
  inputs:
    workingDirectory: $(System.DefaultWorkingDirectory)
    script: |
# Восстанавливаем проект и скачиваем зависимости
      nuget restore .\ShareX.sln
# Создаем директорию, куда будут сохранены файлы с отчетами анализатора
      md .\PVSTestResults
# Запуск анализа PVS-Studio.
      "C:\Program Files (x86)\PVS-Studio\PVS-Studio_Cmd.exe" 
         -t .\ShareX.sln
         -o .\PVSTestResults\ShareX.plog
# Преобразование отчета в html формат.
      "C:\Program Files (x86)\PVS-Studio\PlogConverter.exe"
         -t html
         -o .\PVSTestResults\
         .\PVSTestResults\ShareX.plog
# Публикация отчетов анализатора
- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
```

После выполнения задачи, архив с отчетами анализатора можно скачать во вкладке 'Summary', либо можно воспользоваться расширением [Send Mail](https://marketplace.visualstudio.com/items?itemName=rvo.SendEmailTask&ssr=false), позволяющим настроить отправку электронной почты\.

![Azure_DevOps_ru/image7.png](https://import.viva64.com/docx/blog/Azure_DevOps_ru/image7.png)

## Дополнительные возможности

### Завершение задачи с ошибкой

Если вы хотите, чтобы при наличии предупреждений анализатора сборочный шаг завершился и выдал сообщение об ошибке, вы можете использовать утилиту PlogConverter\. С помощью PlogConverter можно задать порог, при котором будет происходить остановка работы\. Далее приведен пример кода по добавлению в конец конфигурации шага остановки:

```cpp
- task : PowerShell@2
  inputs:
    targetType: 'inline'
    script:  |
    & "C:\Program Files (x86)\PVS-Studio\PlogConverter.exe" -t json -a GA:1 
-o .\PVSTestResults\  .\PVSTestResults\TestTask.plog 
--indicateWarnings  --noHelpMessages 
    IF ($LASTEXITCODE -eq 0)  {exit 0} ELSE {Write-Host
"##vso[task.logissue type=error]Analysis log contains High level warnings.";
 Write-Host "##vso[task.complete result=Failed;]"; exit 0 }
```

Что бы изменить тип предупреждений, на которые будет реагировать задача, воспользуйтесь флагом \-\-analyzer \(\-a\) утилиты [PlogConverter](https://pvs-studio.ru/ru/docs/manual/0038/)\.

### Просмотр результатов анализа 

Для просмотра отчета анализатора на странице результатов выполнения можно воспользоваться расширением [SARIF SAST Scans Tab](https://marketplace.visualstudio.com/items?itemName=sariftools.scans)\.  

Чтобы конвертировать отчет в формат SARIF и воспользоваться расширением, добавьте следующие шаги:

```cpp
- task: CmdLine@2
  inputs:
    workingDirectory: $(System.DefaultWorkingDirectory)
    script: "C:\Program Files (x86)\PVS-Studio\PlogConverter.exe" -t sarif 
-o .\PVSTestResults\  .\PVSTestResults\TestTask.plog

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: .\PVSTestResults\TestTask.plog.sarif
    ArtifactName: CodeAnalysisLogs
```

После выполнения задачи на странице с результатами во вкладке Scans будет добавлен отчет анализатора\.

![Azure_DevOps_ru/image8.png](https://import.viva64.com/docx/blog/Azure_DevOps_ru/image8.png)