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

[CircleCI](https://circleci.com/) – облачный CI\-сервис для автоматизации сборки, тестирования и публикации программного обеспечения\. Поддерживает сборку проектов как в контейнерах, так и в виртуальных машинах с ОС Windows, Linux и macOS\.


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

## Подготовка CI

При запуске сборки проекта CircleCI читает конфигурацию задачи из файла в репозитории по пути '\.circleci/config\.yml'\.

Перед добавлением файла с конфигурацией необходимо добавить в проект переменные, содержащие лицензионные данные для анализатора\. Для этого в левой панели навигации необходимо нажать 'Settings', потом в группе 'ORGANIZATION' выбрать пункт 'Projects' и нажать на шестерёнку справа от нужного проекта\. 

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

В открытом окне с настройками в разделе 'Environment Variables' создайте переменные 'PVS\_USERNAME' и 'PVS\_KEY', содержащие имя пользователя анализатора, привязанное к ключу, и лицензионный ключ для PVS\-Studio\.

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

Теперь создадим '\.circleci/config\.yml'\.

Вначале необходимо указать образ виртуальной машины, на которой будет происходить сборка и анализ\. Полный список образов доступен по [ссылке](https://circleci.com/developer/images)\.

```cpp
version: 2.1
jobs:
  build:
    machine:
      image: ubuntu-2204:current
```

Далее надо загрузить исходники проекта\. А также, через менеджер пакетов, необходимо добавить репозитории и установить инструменты и зависимости проекта:

```cpp
    steps:
      # Downloading sources from the Github repository
      - checkout
      # Setting up the environment
      - run: sudo apt-get install -y cmake
      - run: sudo apt-get update
      - run: sudo apt-get install -y build-essential
```

Далее добавляется репозиторий PVS\-Studio и устанавливается анализатор:

```cpp
      - run: wget -q -O - https://cdn.pvs-studio.com/etc/pubkey.txt
             | sudo apt-key add – 
      - run: sudo wget -O /etc/apt/sources.list.d/viva64.list
             https://cdn.pvs-studio.com/etc/viva64.list
      - run: sudo apt-get -y update && sudo apt-get -y install pvs-studio
```

## Регистрация и запуск PVS\-Studio

Зарегистрировать лицензию анализатора можно следующей командой:

```cpp
      - run: pvs-studio-analyzer credentials -o PVS.lic ${PVS_USERNAME} 
                                                        ${PVS_KEY}
```

Одним из возможных вариантов анализа \(C\+\+\) является создание файла _[compile\_commands\.json](https://pvs-studio.ru/ru/docs/manual/6557/)_ при сборке проекта:

```cpp
      - run: mkdir build && cd build && cmake .. 
                                        -DCMAKE_EXPORT_COMPILE_COMMANDS=On
```

После получения файла [compile\_commands\.json](https://pvs-studio.ru/ru/docs/manual/6557/) анализ производится следующей командой:

```cpp
      - run: pvs-studio-analyzer analyze -j2 -l PVS.lic -o PVS-Studio.log 
                                         -f ./build/compile_commands.json 
                                         --disableLicenseExpirationCheck
```

Полученный файл с "сырыми" результатами работы анализатора необходимо сконвертировать в html\-отчет:

```cpp
      - run: plog-converter -t html -o PVS-Studio.html PVS-Studio.log
```

После завершения тестов отчеты анализатора сохраняются как артефакт:

```cpp
      - run: mkdir PVS_Result && cp PVS-Studio.* ./PVS_Result/
      - store_artifacts:
          path: ./PVS_Result
```

## Полный текст файла конфигурации проекта для CircleCI

Полный текст '\.circleci/config\.yml':

```cpp
version: 2.1
jobs:
  build:
    machine:
      image: ubuntu-2204:current
    steps:
      # Downloading sources from the Github repository
      - checkout
      # Setting up the environment
      - run: sudo apt-get install -y cmake
      - run: sudo apt-get update
      - run: sudo apt-get install -y build-essential 
      # Installation of PVS-Studio
      - run: wget -q -O - https://cdn.pvs-studio.com/etc/pubkey.txt 
                  | sudo apt-key add -
      - run: sudo wget -O /etc/apt/sources.list.d/viva64.list
                   https://cdn.pvs-studio.com/etc/viva64.list
      - run: sudo apt-get -y update && sudo apt-get -y install pvs-studio
      # PVS-Studio license activation
      - run: pvs-studio-analyzer credentials -o PVS.lic ${PVS_ PVS_USERNAME}
                                                        ${PVS_KEY}
      # Building the project
      - run: mkdir build && cd build && cmake .. 
                                        -DCMAKE_EXPORT_COMPILE_COMMANDS=On
      # Running analysis. The compile_commands.json file obtained 
      # when building the project is used
      - run: pvs-studio-analyzer analyze -j2 -l PVS.lic -o PVS-Studio.log 
                                         -f ./build/compile_commands.json 
                                         --disableLicenseExpirationCheck
      # Converting the analyzer report to HTML format
      - run: plog-converter -t html -o PVS-Studio.html PVS-Studio.log
      # Creating a directory with analysis artifacts 
      # and copying analyzer reports (PVS-Studio.log and PVS-Studio.html) 
      # into it
      - run: mkdir PVS_Result && cp PVS-Studio.* ./PVS_Result/
      # Saving workflow artifacts
      - store_artifacts:
          path: ./PVS_Result
```

После загрузки сценария в репозиторий, CircleCI автоматически начнет сборку проекта\.

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

По окончании работы сценария, файлы с результатами работы анализатора можно скачать через вкладку 'Artifacts'\.

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