|
|
|
[[_TOC_]]
|
|
|
|
|
|
|
|
|
|
|
|
#### Поочередная раздельная сборка проектов и последующий совокупный анализ
|
|
|
|
|
|
|
|
В том случае, когда сборка нескольких проектов одной командой по какой-то причине не может быть выполнена (например, при использовании разных машин, окружений или контейнеров для каждого из пакетов) можно собрать каждый из проектов независимо, объединить результаты перехвата сборки каждого из независимых проектов и провести совокупный анализ таким образом, как будто все пакеты были собраны одной командой.
|
| ... | ... | @@ -35,12 +34,12 @@ |
|
|
|
|
|
|
|
где hash - это явно указываемый хэш объединённого объекта, который выводит команда merge-build. После этого можно импортировать результаты общего анализа всех проектов на сервер истории.
|
|
|
|
|
|
|
|
|
|
|
|
#### Интеграция Svace с Gitlab
|
|
|
|
|
|
|
|
_Инструкция взята из проекта community.ispras.ru_
|
|
|
|
|
|
|
|
<details><summary>Так собираем докер-образ с анализатором Svace и сервером хранения истории Svacer</summary>
|
|
|
|
<details>
|
|
|
|
<summary>Так собираем докер-образ с анализатором Svace и сервером хранения истории Svacer</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
FROM ubuntu:20.04
|
| ... | ... | @@ -58,9 +57,11 @@ RUN apt update && apt install -y unzip zip tzdata curl ca-certificates wget buil |
|
|
|
|
|
|
|
CMD /bin/bash
|
|
|
|
```
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
<details><summary>Кладем его в Gitlab Container Registry</summary>
|
|
|
|
<details>
|
|
|
|
<summary>Кладем его в Gitlab Container Registry</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
build-docker:
|
| ... | ... | @@ -76,9 +77,11 @@ build-docker: |
|
|
|
- docker push registry.community.ispras.ru/support/docker-images/ubuntu-svace-svacer:focal-3.3.1-5.2.1
|
|
|
|
- docker push registry.community.ispras.ru/support/docker-images/ubuntu-svace-svacer:latest
|
|
|
|
```
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
<details><summary>И потом этот образ используем в CI для сборки и анализа проекта</summary>
|
|
|
|
<details>
|
|
|
|
<summary>И потом этот образ используем в CI для сборки и анализа проекта</summary>
|
|
|
|
|
|
|
|
```
|
|
|
|
image: registry.community.ispras.ru/support/docker-images/ubuntu-svace-svacer:focal-3.3.0-5.2.1
|
| ... | ... | @@ -110,20 +113,20 @@ analyze: |
|
|
|
when: on_success
|
|
|
|
expire_in: 14 days
|
|
|
|
```
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
Для получения лицензии дополнительно требуется вставить локальный USB-ключ в хостовую машину, а также установить на ней Sentinel Runtime Environment.
|
|
|
|
|
|
|
|
#### Миграция разметки в другую ветку
|
|
|
|
|
|
|
|
|
|
|
|
**Описание задачи:** Имеется 2 ветки разрабатываемого приложения *MyProj* - master, custom. В основном код веток совпадает, большая часть предупреждений предположительно будет общая. Изначально выполнено несколько итераций анализа и разметки предупреждений в ветке master, есть несколько последовательных сборок. Как правильно выполнить миграцию полученные предупреждения в ветку custom?
|
|
|
|
**Описание задачи:** Имеется 2 ветки разрабатываемого приложения _MyProj_ - master, custom. В основном код веток совпадает, большая часть предупреждений предположительно будет общая. Изначально выполнено несколько итераций анализа и разметки предупреждений в ветке master, есть несколько последовательных сборок. Как правильно выполнить миграцию полученные предупреждения в ветку custom?
|
|
|
|
|
|
|
|
Сборка и анализ проектов выполняются на хосте А, сервер историй настроен и запущен на хосте В. Частным случаем является совпадением хостов А и B - сервер сборки, анализа и хранения истории это один сервер.
|
|
|
|
|
|
|
|
**Алгоритм решения**
|
|
|
|
|
|
|
|
1. сборка и анализ нужной ветки выполняется на хосте А, импорт результатов в нужную ветку выполняется на сервере истории на хосте В. Для проекта *MyProj* на хосте В необходимо создать одну главную папку проекта командой
|
|
|
|
1. сборка и анализ нужной ветки выполняется на хосте А, импорт результатов в нужную ветку выполняется на сервере истории на хосте В. Для проекта _MyProj_ на хосте В необходимо создать одну главную папку проекта командой
|
|
|
|
|
|
|
|
`svace server admin create --project MyProj`
|
|
|
|
|
| ... | ... | @@ -143,8 +146,6 @@ analyze: |
|
|
|
|
|
|
|
`svace history branch sync master custom`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Перенос разметки при клонировании бранчей в svacer
|
|
|
|
|
|
|
|
В случае если с использованием GUI svacer с помощью метода клонирования для проекта создан новый бранч, данный бранч получает все снэпшоты родительского проекта. Данный бранч существует только в пространстве БД svacer (никак не связан с бранчами в .svace-dir проекта).
|
| ... | ... | @@ -153,11 +154,9 @@ analyze: |
|
|
|
|
|
|
|
Рекомендуется **создать конфигурацию бранчей заранее**, и указывать именно их в параметрах `svacer import`.
|
|
|
|
|
|
|
|
|
|
|
|
#### Добавление спецификации на функцию-источник помеченных данных, для которой в svace по умолчанию отсутствует спецификация
|
|
|
|
|
|
|
|
1. по умолчанию в svace отсутствует спецификация для функции-источника помеченных данных *GetWindowTextA*
|
|
|
|
|
|
|
|
1. по умолчанию в svace отсутствует спецификация для функции-источника помеченных данных _GetWindowTextA_
|
|
|
|
2. необходимо определить точный прототип функции:
|
|
|
|
|
|
|
|
```
|
| ... | ... | @@ -173,6 +172,8 @@ int GetWindowTextA( |
|
|
|
```
|
|
|
|
//winuser.c
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef void *HWND;
|
|
|
|
typedef char TCHAR;
|
|
|
|
typedef TCHAR *LPSTR;
|
| ... | ... | @@ -214,18 +215,29 @@ int GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount) { |
|
|
|
|
|
|
|
` svace spec remove winuser.c.bc`
|
|
|
|
|
|
|
|
*В svace/docs есть файл svace_spec_manual.pdf, в котором достаточно подробно описаны доступные спецификации svace*
|
|
|
|
_В svace/docs есть файл svace_spec_manual.pdf, в котором достаточно подробно описаны доступные спецификации svace_
|
|
|
|
|
|
|
|
#### Бэкап баз данных svacer:
|
|
|
|
|
|
|
|
Система хранения сервера svacer состоит из двух баз данных:
|
|
|
|
|
|
|
|
- PostgresSQL - хранение предупреждений, разметки, пользователей и т.п. данных
|
|
|
|
- Key-Value store - хранение исходного кода, информации для навигации по исходному коду, оперативный кэш
|
|
|
|
|
|
|
|
Для бэкапа PostgresSQL использовать средства PostgresSQL (https://www.postgresql.org/docs/12/backup.html)
|
|
|
|
|
|
|
|
Для бэкапа Key-Value store стоит остановить сервер svacer и заархивировать директорию, содержащую key-value store. Путь к ней определяется опцией --store при запуске svacer. Если опция явно не
|
|
|
|
указана, то путь <home>/.cache/svacer.
|
|
|
|
Для бэкапа Key-Value store стоит остановить сервер svacer и заархивировать директорию, содержащую key-value store. Путь к ней определяется опцией --store при запуске svacer. Если опция явно не указана, то путь /.cache/svacer.
|
|
|
|
|
|
|
|
#### Использование Svace в дистрибутивах Alpine Linux
|
|
|
|
|
|
|
|
Основные Linux-дистрибутивы Svace не могут напрямую работать в Alpine Linux из-за того, что рассчитаны на системную библиотеку glibc, а не musl. Но при выполнении определённых действий Svace можно успешно запустить и в Alpine Linux, который из-за своего небольшого размера часто используется для контейнеров сборки:
|
|
|
|
|
|
|
|
1. Выключить проверку запуска в неподдерживаемом окружении: `export SVACE_ALPINE_CHECK_DISABLE=yes`
|
|
|
|
2. Установить пакет совместимости с glibc: `apk add gcompat`
|
|
|
|
3. Для Alpine Linux версий 3.18 и новее потребуется также добавить поддержку функций `posix_fallocate64` и `fcntl64`, исключенных из сборки musl по умолчанию (для пакета `gcompat` есть изменения, добавляющие данные функции [1](https://git.adelielinux.org/adelie/gcompat/-/merge_requests/29) и [2](https://git.adelielinux.org/adelie/gcompat/-/merge_requests/30), однако в последней на текущий момент сборке `gcompat` от 31.07.2023 они отсутствуют). Для этого можно воспользоваться решением [аналогичной проблемы IntelliJ Platform](https://youtrack.jetbrains.com/issue/IJPL-170288/RD-cant-work-on-Alpine-latest#focus=Comments-27-12247972.0-0): подключением своей реализации этих функций glibc с помощью механизма `LD_PRELOAD`. Готовую библиотеку с указанными функциями можно скачать отсюда: [libwrapper64_glibc.so](uploads/44bd8516c1d2fd375ad4511d56224254/libwrapper64_glibc.so). При желании её можно скомпилировать самостоятельно [из исходников](uploads/cff7efd5f35f58e5e8a318a72b913e5b/alpine-libwrapper-fcntl64-posix_fallocate64.zip). Перед запуском анализатора потребуется установить переменную окружения `LD_PRELOAD` в абсолютный путь к указанной библиотеке, например, если она скопирована в папку `/lib`, так: `export LD_PRELOAD=/lib/libwrapper64_glibc.so`
|
|
|
|
4. Если при запуске анализатора возникает ошибка следующего вида: `Error occurred during initialization of VM` `Unable to load jimage library: /svace/external-tools/x64-linux/jre21/lib/libjimage.so`, то добавьте к переменной окружения `LD_LIBRARY_PATH`, задающей пути поиска динамически подключаемых библиотек, абсолютный путь к подпапке `external-tools/x64-linux/jre21/lib/server` дистрибутива анализатора, где находится искомая библиотека `libjimage.so`. Например, если Svace установлен в папку `/svace`, то команда выглядит так: `export LD_LIBRARY_PATH=/svace/external-tools/x64-linux/jre21/lib/server/`
|
|
|
|
5. Из-за несовместимостей динамических библиотек перехвата сборки с некоторыми стандартными приложениями Alpine Linux требуется использовать режим перехвата сборки через отладку ptrace. Для этого при запуске команды `svace build` укажите дополнительную опцию `--enable-ptrace-all`.
|
|
|
|
|
|
|
|
#### Дополнительная настройка перехвата сборки
|
|
|
|
[Основная статья](Дополнительная-настройка-перехвата-сборки) |
|
|
\ No newline at end of file |
|
|
|
|
|
|
|
[Основная статья](%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82%D0%B0-%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8) |
|
|
\ No newline at end of file |