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

[Docker](https://www.docker.com/) — программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации\. Позволяет "упаковать" приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую систему, где установлен Docker\.

Ниже будут рассмотрены:

* способы получения Docker\-образов с последней версией PVS\-Studio для разных ОС и языков программирования;
* примеры запуска анализа в контейнере;
* способы настройки анализатора\.

## Docker\-образы с Linux для C и C\+\+ проектов

### Подготовка образа

Для сборки готового образа с последней версией анализатора PVS\-Studio можно использовать _Dockerfile_\.

**Для debian\-based систем:**

```cpp
FROM gcc:7

# INSTALL DEPENDENCIES
RUN apt update -yq \
 && apt install -yq --no-install-recommends wget \
 && apt clean -yq

# INSTALL PVS-Studio
RUN wget -q -O - https://files.pvs-studio.com/etc/pubkey.txt | apt-key add - \
 && wget -O /etc/apt/sources.list.d/viva64.list \
    https://files.pvs-studio.com/etc/viva64.list \
 && apt update -yq \
 && apt install -yq pvs-studio strace \
 && pvs-studio --version \
 && apt clean -yq
```

**Для zypper\-based систем:**

```cpp
FROM opensuse:42.3

# INSTALL DEPENDENCIES
RUN zypper update -y \
 && zypper install -y --no-recommends wget \
 && zypper clean --all

# INSTALL PVS-Studio
RUN wget -q -O /tmp/viva64.key https://files.pvs-studio.com/etc/pubkey.txt \
 && rpm --import /tmp/viva64.key \
 && zypper ar -f https://files.pvs-studio.com/rpm viva64 \
 && zypper update -y \
 && zypper install -y --no-recommends pvs-studio strace \
 && pvs-studio --version \
 && zypper clean -all
```

**Для yum\-based систем:**

```cpp
FROM centos:7

# INSTALL DEPENDENCIES
RUN yum update -y -q \
 && yum install -y -q wget \
 && yum clean all -y -q

# INSTALL PVS-Studio
RUN wget -q -O /etc/yum.repos.d/viva64.repo \
 https://files.pvs-studio.com/etc/viva64.repo \
 && yum install -y -q pvs-studio strace \
 && pvs-studio --version \
 && yum clean all -y -q
```

**Примечание**\. PVS\-Studio для Linux также может быть скачан по следующим постоянным ссылкам:

* [https://files\.pvs\-studio\.com/pvs\-studio\-latest\.deb](https://files.pvs-studio.com/pvs-studio-latest.deb)
* [https://files\.pvs\-studio\.com/pvs\-studio\-latest\.tgz](https://files.pvs-studio.com/pvs-studio-latest.tgz)
* [https://files\.pvs\-studio\.com/pvs\-studio\-latest\.rpm](https://files.pvs-studio.com/pvs-studio-latest.rpm)

**Команда для сборки образа:**

```cpp
docker build -t viva64/pvs-studio:{{SHORT_VERSION_PVS}} -f Dockerfile
```

**Примечание**\. Базовый образ и зависимости необходимо изменить для целевого проекта\.

### Запуск контейнера

Запустить анализ, например, CMake\-проекта можно с помощью следующей команды:

```cpp
docker run --rm -v "~/Project":"/mnt/Project" \
           -w "/mnt/Project" viva64/pvs-studio:{{SHORT_VERSION_PVS}} \
           sh -c 'mkdir build && cd build &&
                  cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=On .. && make -j8 &&
                  pvs-studio-analyzer analyze ... -o report.log -j8 ...'
```

При этом конвертер отчётов анализатора \(plog\-converter\) рекомендуется запускать вне контейнера, чтобы отчёты содержали корректные пути до исходных файлов\. Единственный тип отчёта, который имеет смысл сгенерировать в контейнере, это _fullhtml_, \(HTML отчёт с сортировкой предупреждений и навигацией по коду\)\. Для получения других типов отчёта требуется дополнительная настройка анализатора\.

При проверке не CMake\-проектов в контейнере в режиме трассировки вызовов компилятора может возникнуть такая ошибка:

```cpp
strace: ptrace(PTRACE_TRACEME, ...): Operation not permitted
Error: Command strace returned 1 code.
```

Для исправления ошибки необходимо запустить докер с дополнительными правами:

```cpp
docker run ... --security-opt seccomp:unconfined ...
```

или так:

```cpp
docker run ... --cap-add SYS_PTRACE ...
```

### Настройка анализатора

**Указание лицензии анализатора**

Т\.к\. время жизни контейнера ограничено, файл лицензии анализатора необходимо закоммитить в образ, либо указывать анализатору через смонтированный каталог:

```cpp
pvs-studio-analyzer analyze ... -l /path/to/PVS-Studio.lic ...
```

**Восстановление путей к исходникам в отчёте**

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

```cpp
pvs-studio-analyzer analyze ... -r /path/to/project/in/container ...
```

После чего запустить конвертер отчёта вне контейнера\.

На Linux или macOS:

```cpp
plog-converter ... -r /path/to/project/on/host ...
```

на Windows:

```cpp
PlogConverter.exe ... -r /path/to/project/on/host
```

Также в Windows можно открыть отчёт без конвертации в утилите [Compiler Monitoring UI](https://pvs-studio.ru/ru/docs/manual/0033/)\.

**Исключение директорий из анализа**

Исключить из анализа директории со сторонними библиотеками, тестами и директорию компилятора можно с помощью параметра \-e:

```cpp
pvs-studio-analyzer analyze ... -e /path/to/tests ... -e /path/to/contrib ...
```

**Настройка кросс\-компилятора**

Если контейнер содержит кросс\-компилятор или компилятор без алиасов \(например, g\+\+\-7\), то имя компилятора надо указать дополнительно:

```cpp
pvs-studio-analyzer analyze ... -C g++-7 -C compilerName ...
```

## Docker\-образы с Linux для Java проектов

### Подготовка образа

**Вариант установки из архива**

```cpp
FROM openkbs/ubuntu-bionic-jdk-mvn-py3

ARG PVS_CORE="{{FULL_VERSION_PVS_JAVA}}"

RUN wget "https://files.pvs-studio.com/java/pvsstudio-cores/${PVS_CORE}.zip"\
-O ${PVS_CORE}.zip \
 && mkdir -p ~/.config/PVS-Studio-Java \
 && unzip ${PVS_CORE}.zip -d ~/.config/PVS-Studio-Java \
 && rm -rf ${PVS_CORE}.zip
```

**Команда для сборки образа:**

```cpp
docker build -t viva64/pvs-studio:{{SHORT_VERSION_PVS}} -f Dockerfile
```

**Вариант коммита слоя с анализатором**

Анализатор выкачивается автоматически при первом анализе проекта\. Можно предварительно задать имя контейнера и выполнить анализ проекта:

```cpp
docker run --name analyzer
  -v "D:\Project":"/mnt/Project"
  openkbs/ubuntu-bionic-jdk-mvn-py3
  sh -c "cd /mnt/Project && mvn package
    && mvn pvsstudio:pvsAnalyze -Dpvsstudio.licensePath=/path/to/PVS-Studio.lic"
```

после чего выполнить коммит в новый образ:

```cpp
docker commit analyzer viva64/pvs-studio:{{SHORT_VERSION_PVS}}
```

**Примечание**\. Базовый образ и зависимости необходимо изменить для целевого проекта\. Установку и запуск анализатора следует выполнять от имени одного и того же пользователя\.

### Запуск контейнера

Регулярно запускать анализ проекта следует аналогичным образом, добавив параметр _\-\-rm_:

```cpp
docker run --rm -v "D:\Project":"/mnt/Project"
  openkbs/ubuntu-bionic-jdk-mvn-py3
  sh -c "cd /mnt/Project
    && mvn package
    && mvn pvsstudio:pvsAnalyze -Dpvsstudio.licensePath=/path/to/PVS-Studio.lic"
```

### Настройка анализатора

Настройку анализатора при интегрировании в сборочную систему Maven или Gradle можно производить согласно инструкциям из документации:

* [Интеграция PVS\-Studio Java в сборочную систему Gradle](https://pvs-studio.ru/ru/docs/manual/6706/)
* [Интеграция PVS\-Studio Java в сборочную систему Maven](https://pvs-studio.ru/ru/docs/manual/6705/)

## Docker\-образы с Windows для C, C\+\+ и C\# проектов

### Подготовка образа

Для сборки готового образа с последней версией анализатора PVS\-Studio можно использовать следующий _Dockerfile_:

```cpp
# escape=`
FROM mcr.microsoft.com/dotnet/framework/runtime:4.8

SHELL ["cmd", "/S", "/C"]

# INSTALL chocolatey
RUN `
  @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile`
  -InputFormat None -ExecutionPolicy Bypass `
  -Command " [System.Net.ServicePointManager]::SecurityProtocol = 3072; `
  iex ((New-Object System.Net.WebClient).DownloadString `
  ('https://chocolatey.org/install.ps1'))" `
  && `
  SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

# INSTALL Visual Studio Build Tools components (minimal)
RUN `
  choco install -y visualstudio2019buildtools `
  --package-parameters "--quiet --wait --norestart --nocache `
  --add Microsoft.VisualStudio.Workload.VCTools;includeRecommended `
  --add Microsoft.VisualStudio.Workload.ManagedDesktopBuildTools`
  ;includeRecommended"

# INSTALL PVS-Studio
RUN `
  choco install -y pvs-studio
```

Выполнив в директории Dockerfile следующую команду, можно получить готовый образ:

```cpp
docker build -t viva64/pvs-studio:{{SHORT_VERSION_PVS}} .
```

Полученный Docker образ будет иметь минимальные зависимости, чтобы проанализировать С\+\+/С\# "Hello Word" проекты\. Если ваш проект требует дополнительные компоненты Visual Studio Build Tools, то нужно их установить, скорректировав скрипт\. С перечнем доступных компонентов можно ознакомиться [здесь](https://docs.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-build-tools?view=vs-2019)\.

В данном образе устанавливаются последние из доступных версий [Build Tools](https://community.chocolatey.org/packages/visualstudio2019buildtools) для Visual Studio 2019 и [PVS\-Studio](https://community.chocolatey.org/packages/pvs-studio) при помощи [Chocolatey](https://community.chocolatey.org/)\. Чтобы установить конкретную версию Build Tools 2019, нужно явно указать ее при установке\. Например,

```cpp
choco install visualstudio2019buildtools --version=16.10.0.0 ...
```

О доступных версиях  можно узнать [здесь](https://community.chocolatey.org/packages/visualstudio2019buildtools/16.10.0.0)\.

Если вам нужно установить [Build Tools](https://community.chocolatey.org/packages/visualstudio2017buildtools) для Visual Studio 2017, то инструкция для установки идентична\.

Если установка через Chocolatey по каким\-либо соображениям не подходит, то можно всё установить самостоятельно, подготовив все необходимые инсталляторы\. Рядом с Dockerfile вам необходимо будет создать директорию с инсталляторами нужных версий \(PVS\-Studio, VS Build Tools и т\.д\.\)\. Dockerfile:

```cpp
# escape=`
FROM mcr.microsoft.com/dotnet/framework/runtime:4.8

SHELL ["cmd", "/S", "/C"]

ADD .\installers C:\Installers

# INSTALL Visual Studio Build Tools components (minimal)
RUN `
  C:\Installers\vs_BuildTools.exe --quiet --wait --norestart --nocache `
  --add Microsoft.VisualStudio.Workload.VCTools;includeRecommended `
  --add Microsoft.VisualStudio.Workload.ManagedDesktopBuildTools`
;includeRecommended `
  || IF "%ERRORLEVEL%"=="3010" EXIT 0

# INSTALL PVS-Studio
RUN `
  C:\Installers\PVS-Studio_setup.exe `
  /verysilent /suppressmsgboxes /norestart /nocloseapplications

# Cleanup
RUN `
  RMDIR /S /Q C:\Installers
```

**Примечание\.** Если ваш проект потребует дополнительной настройки окружения и зависимостей, то необходимо будет самостоятельно модифицировать Dockerfile соответствующим образом\.

### Запуск контейнера

Чтобы запустить анализ, при запуске контейнера нужно смонтировать все необходимые внешние зависимости: директорию с проектом, файл с настройками анализатора \(Settings\.xml\) и т\.д\.

Команда запуска анализа может выглядеть следующим образом:

```cpp
docker run --rm -v "path\to\files":"C:\mnt" -w "C:\mnt" \
   viva64/pvs-studio:{{SHORT_VERSION_PVS}} \
   "C:\Program Files (x86)\PVS-Studio\PVS-Studio_Cmd.exe" \
   --target ".\Project\Project.sln" --output ".\Report.plog" \ 
   --settings ".\Settings.xml" --sourceTreeRoot "C:\mnt"
```

После чего у вас появится отчет "path\\to\\files\\Report\.plog", который вы можете открыть в Visual Studio плагине или в утилите [Compiler Monitoring UI](https://pvs-studio.ru/ru/docs/manual/0033/)\.

**Примечание\.** Опция 'sourceTreeRoot' \- корневая часть пути, которую PVS\-Studio будет использовать при генерации относительных путей в диагностических сообщениях\. Это позволит избежать недействительных путей в отчете\. 

### Настройка анализатора

Настраивать анализатор можно через:

* [командную строку](https://pvs-studio.ru/ru/docs/manual/0035/) при запуске анализа;
* специальный файл настроек 'Settings\.xml'\. Его можно заранее подготовить, например, при помощи графического интерфейса Visual Studio [плагина](https://pvs-studio.ru/ru/docs/manual/6522/)\. По умолчанию этот файл располагается в директории"%AppData%\\PVS\-Studio\\"\.

## Docker\-образы с Windows для Java проектов

### Подготовка образа

Чтобы ядро анализатора работало, необходимо иметь лишь Java 11\+\. Если вы используете сборочную систему \(Maven, Gradle\), то вам также необходимо иметь настроенное для неё окружение\.

Чтобы получить Docker образ с Maven и последней версией ядра анализатора PVS\-Studio, можно воспользоваться одним из следующих вариантов\.

**Вариант установки из архива**

```cpp
# escape=`
FROM csanchez/maven:3.8.3-azulzulu-11-windowsservercore-ltsc2019

SHELL ["cmd", "/S", "/C"]

ARG PVS_CORE="{{FULL_VERSION_PVS_JAVA}}"

RUN `
  powershell -Command `
   Invoke-WebRequest `
       "https://files.pvs-studio.com/java/pvsstudio-cores/%PVS_CORE%.zip" `
       -OutFile .\pvs-studio.zip`
&& `
  powershell -Command `
   Expand-Archive `
     -LiteralPath '.\pvs-studio.zip' `
     -DestinationPath \"%APPDATA%\PVS-Studio-Java\" `
&& `
  DEL /f .\pvs-studio.zip
```

Выполнив в директории Dockerfile следующую команду, можно получить готовый образ:

```cpp
docker build -t viva64/pvs-studio:{{SHORT_VERSION_PVS}} .
```

**Вариант коммита слоя с анализатором**

Анализатор выкачивается автоматически при первом анализе проекта\. Можно предварительно задать имя контейнера и выполнить анализ проекта:

```cpp
docker run --name analyzer ^
  -v "path\to\project":"C:/mnt/Project" ^
  -w C:\mnt\Project ^
  csanchez/maven:3.8.3-azulzulu-11-windowsservercore-ltsc2019 ^
  mvn package pvsstudio:pvsAnalyze
```

После чего выполнить коммит в новый образ:

```cpp
docker commit analyzer viva64/pvs-studio:{{SHORT_VERSION_PVS}}
```

**Примечание\.** В случае с Gradle иметь предустановленную сборочную систему необязательно, так как gradlew сделает все за вас\. Поэтому за основу Dockerfile достаточно взять образ только с Java 11\+\.

### Запуск контейнера

Регулярно запускать анализ проекта следует аналогичным образом: 

```cpp
docker run --name analyzer ^
  --rm ^
  -v "path\to\project":"C:/mnt/Project"^
  -w C:\mnt\Project^
  viva64/pvs-studio:{{SHORT_VERSION_PVS}} ^
  mvn package pvsstudio:pvsAnalyze '-Dpvsstudio.licensePath=./PVS-Studio.lic'
```

Отличие запуска в том, что указывается опция '\-\-rm', чтобы после запуска контейнер не оставался в памяти\. А также нужно указать путь до лицензии\. В данном примере лицензия была помещена в корень проекта\. 

Стоит учесть, что при каждом запуске анализа Maven будет скачивать все необходимые зависимости в свой локальный репозиторий\. Чтобы этого избежать, при запуске можно смонтировать локальный репозиторий Maven хостовой машины\. Например:

```cpp
docker run ... -v "%M2_REPO%":"C:\Users\ContainerUser\.m2" ...
```

### Настройка анализатора

Настройку анализатора при интегрировании в сборочную систему Maven или Gradle можно производить согласно инструкциям из документации:

* [Интеграция PVS\-Studio Java в сборочную систему Gradle](https://pvs-studio.ru/ru/docs/manual/6706/)
* [Интеграция PVS\-Studio Java в сборочную систему Maven](https://pvs-studio.ru/ru/docs/manual/6705/)

## Дополнительные ссылки

1. [Установка и обновление PVS\-Studio в Linux](https://pvs-studio.ru/ru/docs/manual/0039/)\.
1. [Установка и обновление PVS\-Studio в macOS](https://pvs-studio.ru/ru/docs/manual/0042/)\.
1. [Как запустить PVS\-Studio в Linux и macOS](https://pvs-studio.ru/ru/docs/manual/0036/)\.
1. [Работа с ядром Java анализатора из командной строки](https://pvs-studio.ru/ru/docs/manual/6703/)\.