Help:XSvacer:Webide: Difference between revisions

From Svacer Wiki
(Релиз 11. Удалена настройка шаблона комментария sarif/commenttemplate)
No edit summary
(18 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Note|text=Данная функциональность входит в набор расширений XSvacer}}
= Поддержка среды разработки Theia IDE =
= Поддержка среды разработки Theia IDE =
'''Примечание:''' данная функциональность входит в набор расширений XSvacer.


Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.
Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.


По умолчанию запускается IDE, [[#Информация_о_docker-образе_Theia_IDE|собранная]] на основе [https://theia-ide.org/ Theia IDE].
По умолчанию запускается IDE собранная на основе Theia IDE (https://theia-ide.org/).


== Активация функциональности ==
== Активация функциональности ==
Для активации функциональности необходимо указать флаг <code style="white-space: pre;">--xsvacer.features webide</code> при запуске Svacer.
Для активации функциональности необходимо указать флаг <code>--xsvacer.features webide</code> при запуске svacer'а.
 
При запуске функциональности Webide также будет запущена функциональность [[Help:XSvacer:Docker|docker]].
 
При активации функциональности:
* становится доступным REST API управления IDE для просмотра исходного кода снимков проектов
* в пользовательском интерфейсе на вкладке "Информация о снимке" появляется кнопка "Открыть в IDE"
* устанавливается подключение к хосту docker, на котором будут запускаться контейнеры с экземплярами IDE
 
=== Быстрый запуск функциональности с настройками по умолчанию ===
 
Для того, чтобы начать пользоваться функциональностью запуска IDE без изменения конфигурационных параметров, нужно выполнить следующие действия:
# Настройка доступа к docker-хосту:
## Запустить docker со настройками по умолчанию (dockerd должен слушать unix-сокет <code style="white-space: pre;">unix:///var/run/docker.sock</code> — https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option)
## Проверить, что у пользователя под которым будет запускаться Svacer есть доступ к unix-сокету docker-хоста <code style="white-space: pre;">unix:///var/run/docker.sock</code> — https://docs.docker.com/engine/install/linux-postinstall
# Настроить права доступа у пользователей, которые смогут запускать IDE: требуются разрешения на проект/ветку "Просмотр маркеров" и "Экспорт разметки"
# Перезапустить Svacer с флагом <code style="white-space: pre;">--xsvacer.features webide</code>
# ''Опционально.'' Для ускорения первого запуска IDE:
## Скачать архив с docker-образом для соответствующей версии Svacer: [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz 11+], [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz 10+], [https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar 9+]
## Загрузить docker-образ из архива на docker-хост: <code style="white-space: pre;">docker image load -i /path/to/theia-blueprint...</code>
 
После этого у пользователей с указанными правами должна появиться кнопка "Открыть в IDE" на панели с информацией о снимке.
 
{{Note}} IDE с исходным кодом снимков будут запускаться в новых вкладках браузера. Обычно все браузеры блокируют автоматическое открытие вкладки и показывают соответствующее предупреждение.
 
Например, в Firefox:
 
[[File:Firefox popup notification ru.png]]
 
В таком случае нужно дать разрешение на открытие вкладки с IDE:
 
[[File:Firefox popup notification expanded ru.png|x150px]]
 
 
При необходимости изменения настроек подключения к docker-хосту:
# Скопировать [[Help:XSvacer:Docker#Конфигурация_по_умолчанию|конфигурацию docker по умолчанию]] в раздел <code>xsvacer</code> конфигурационного файла svacer.cfg
# Внести требуемые изменения в конфигурацию раздела <code>xsvacer/docker</code>
 
При необходимости изменения настроек запуска IDE:
# Скопировать [[#Конфигурация_по_умолчанию|конфигурацию webide по умолчанию]] в раздел <code>xsvacer</code> конфигурационного файла svacer.cfg
# Внести требуемые изменения в конфигурацию раздела <code>xsvacer/webide</code>
 
== Принцип работы ==
 
Функциональность запуска IDE для просмотра исходного кода снимков становится доступной пользователю, если соблюдаются условия:
# Функциональность активна: при запуске Svacer указан флаг <code style="white-space: pre;">--xsvacer.features webide</code>;
# В [[Help:XSvacer:Webide#Конфигурация|конфигурации]] функциональности <code style="white-space: pre;">xsvacer/webide/theia</code> есть хотя бы одна активная (<code style="white-space: pre;">disabled: false</code>) конфигурация IDE
# У пользователя Svacer имеются разрешения "Просмотр маркеров" и "Экспорт разметки" на проект, в котором находится снимок, для которого нужно запустить IDE
 
В противном случае в пользовательском интерфейсе будет отсутствовать кнопка "Открыть в IDE".
 
=== Запуск IDE ===
 
Запуск производится путём вызова http-метода <code style="white-space: pre;">POST /api/snapshots/{snapshot_id}/ide</code> с телом запроса <code style="white-space: pre;">{"ideId": "идентификатор IDE"}</code>
 
Последовательность действий, выполняемых при запуске IDE:
 
# Производится проверка: была ли уже запущена указанная IDE для указанного снимка:
#* Если запущена: производится проверка доступности IDE (отвечает на запросы):
#** Если IDE доступна: действие не требуется. Процесс запуска завершается
#** Если IDE недоступна: продолжается процесс запуска. IDE будет перезапущена
# Создаётся "корневая папка снимка", предназначенная для хранения исходного кода снимка и предупреждений анализатора с разметкой в виде sarif-файла. Название папки соответствует id снимка. Папка создаётся по пути заданному в параметре конфигурации IDE <code>xsvacer/webide/theia/{идентификатор конфигурации}/sourcesroot</code>
# Исходный код снимка скачивается в "корневую папку снимка"
# Производится экспорт маркеров и разметки в виде sarif-файла в "корневую папку снимка". Название sarif-файла формируется с помощью шаблона, заданного в параметре конфигурации IDE <code style="white-space: pre;">xsvacer/webide/theia/{идентификатор конфигурации}/sarif/filenametemplate</code>
# Производится настройка и запуск docker-контейнера в соответствии с настройками <code style="white-space: pre;">xsvacer/webide/theia/{идентификатор конфигурации}/docker</code>:
## Проверяется наличие на docker-хосте образа IDE, указанного в <code style="white-space: pre;">xsvacer/webide/theia/{идентификатор конфигурации}/docker/image</code>. Если docker-образ отсутствует, он будет загружен на хост
## Проверяется наличие на docker-хосте контейнера с IDE для снимка:
##* Если docker-контейнер не существует, то он будет создан и запущен
##* Если docker-контейнер существует и находится:
##** в статусе <code>running</code> — процесс запуска IDE продолжается
##** в статусе <code>created</code>, <code>exited</code> или <code>paused</code> — контейнер будет запущен
##** в других статусах — вернётся соответствующая ошибка и процесс запуска IDE прервётся
# После успешного запуска docker-контейнера осуществляется ожидание окончания запуска процесса IDE в контейнере в соответствии с настройками <code style="white-space: pre;">xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck</code>
#* Если за отведённое время ответ от IDE получен — процесс запуска завершается
#* Если ответ не получен — вернётся ошибка <code>ide not ready</code>
 
При возникновении ошибки на одном из этапов запуска IDE артефакты, созданные на предыдущих этапах, останутся в системе. В дальнейшем они могут быть использованы при повторном запуске IDE, если причина возникновения ошибки была устранена.
 
{{Note|type=reminder|text=Причиной возникновения ошибки "ide not ready" может стать высокая загруженность или недостаточная производительность docker-хоста, на котором запускается контейнер с IDE. В связи с этим процесс IDE внутри контейнера может запускаться дольше, чем указано в настойках <code style="white-space: pre;">xsvacer/webide/theia/{идентификатор конфигурации}/healthcheck</code>. В этом случае рекомендуется попробовать повторно запустить IDE через короткий промежуток времени}}
 
Ещё одной причиной возникновения данной ошибки может стать сетевая недоступность docker-контейнера при подключении к удалённому docker-хосту. В таком случае рекомендуется проверить:
# Сетевую доступность docker-хоста
# Настройки фаервола на docker-хосте
# Настройки биндинга docker-контейнера c IDE
::<code style="white-space: pre;">xsvacer/webide/theia/{идентификатор конфигурации}/docker/container/hostconfig/portbindings</code>
::Контейнер должен быть подключён к доступному сетевому интерфейсу
 
=== Использование IDE: проксирование запросов ===
 
После успешного запуска docker-контейнера IDE станут доступны ресурсы с префиксом <code style="white-space: pre;">/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/</code>


Все запросы, направленные к ресурсам <code style="white-space: pre;">/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*</code>, будут проксироваться в соответствующий контейнер IDE.
'''Примечание:''' при запуске функциональности <code>webide</code> также будет запущена функциональность <code>docker</code>.


Например, если docker-контейнер c IDE <code style="white-space: pre;">theia__default</code> для снимка <code style="white-space: pre;">xxx</code> запущен и слушает порт <code style="white-space: pre;">35353</code> на хосте <code style="white-space: pre;">docker-host</code>, то будет происходить проксирование:
После этого становится доступным REST API управления IDE для просмотра снимков проектов, в пользовательском интерфейсе появляется кнопка "Открыть в IDE", устанавливается подключение к хосту docker, на котором будут запускаться контейнеры с экземплярами IDE.
:<code style="white-space: pre;"><nowiki>GET http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/</nowiki></code> &rArr; <code style="white-space: pre;"><nowiki>GET http://docker-host:35353/</nowiki></code>
:<code style="white-space: pre;"><nowiki>POST http://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...</nowiki></code> &rArr; <code style="white-space: pre;"><nowiki>POST http://docker-host:35353/socket.io/?...</nowiki></code>
:<code style="white-space: pre;"><nowiki>GET ws://svacer-host/xsvacer/webide/snapshots/xxx/ide/theia__default/socket.io/?...</nowiki></code> &rArr; <code style="white-space: pre;"><nowiki>GET ws://docker-host:35353/socket.io/?...</nowiki></code>
 
Для запуска IDE в окне браузера нужно указать адрес
 
:<code style="white-space: pre;"><nowiki>http[s]://svacer-host/xvacer/webide/snapshots/{snapshot_id}/{ide_id}/</nowiki></code>
 
{{Note}} Завершающий слеш обязателен!
 
=== Перезапуск IDE ===
 
В процессе работы Svacer следит за состоянием запущенных IDE. При попытке повторного запуска IDE проверяется её доступность: если IDE отвечает на запросы, то повторный запуск не производится и обработка запроса завершается.
 
Также работоспособность IDE контролируется при использовании IDE в момент проксирования запросов в docker-контейнер: если IDE доступна, то запрос проксируется.
 
Если IDE перестанет отвечать на запросы, то будет произведена попытка её перезапуска. В этом случае происходит та же последовательность действий, что и при [[Help:XSvacer:Webide#Запуск IDE|первоначальном запуске IDE]].
 
Зачастую потеря связи обусловлена остановкой docker-контейнера с IDE. В таком случае docker-контейнер будет перезапущен.
 
Если же недоступность IDE обусловлена другими причинами, то запрос на запуск/проксирование продолжит возвращать ошибку до устранения причин неработоспособности.
 
=== Остановка IDE ===
 
Запуск производится путём вызова http-метода
DELETE /api/snapshots/{snapshot_id}/ide
с телом запроса <code style="white-space: pre;">{"ideId": "идентификатор IDE"}</code>. В ходе обработки запроса останавливается docker-контейнер IDE.
 
По умолчанию установлен параметр конфигурации
 
xsvacer/webide/theia/default/docker/container/hostconfig/autoremove: true
 
Это означает, что после остановки docker-контейнер будет автоматически удалён.
 
Чтобы изменить это поведение, настройка
xsvacer/webide/theia/default/{id конфигурации}/container/hostconfig/autoremove
 
должна быть установлена в <code>false</code> на момент запуска docker-контейнера IDE. Это можно сделать, например, установив значение переменной окружения
 
XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_CONTAINER_HOSTCONFIG_AUTOREMOVE=false
 
{{Note|type=error|text=При использовании версии Svacer 9.0.0 установка <code>autoremove: false</code> вызывает ошибку запуска. Исправлено в версии [[Svacer#Релизы|9.0.1]].'''}}
 
При корректной остановке (например SIGTERM) Svacer автоматически остановит все запущенные docker-контейнеры IDE.
 
=== Подключение к IDE после некорректного завершения Svacer ===
 
При запуске Svacer осуществляет поиск запущенных docker-контейнеров IDE на доступных docker-хостах. При восстановлении связи с запущенными docker-контейнерами IDE и последующей корректной остановке Svacer все docker-контейнеры IDE будут остановлены.


== REST API для работы с IDE ==
== REST API для работы с IDE ==


{{Note|text=На этапе внедрения расширений XSvacer REST API может меняться. Следите за анонсами!}}
После активации функциональности становятся доступны http-ресурсы для управления IDE снимков:


После активации функциональности становятся доступны http-ресурсы для управления IDE:
{| class="wikitable"
 
{| class="mw-collapsible mw-collapsed wikitable"
|+ style=white-space:nowrap | REST API управления IDE
|-
!Ресурс
!Ресурс
!Описание
!Описание                                              
|-
|-
|<pre style="white-space: pre;">
|<pre style="white-space: pre;">
GET /xsvacer/webide/api/ide
GET /api/ide
</pre>
</pre>
|Получение списка доступных для запуска IDE.
|Получение списка доступных для запуска IDE.
Line 177: Line 35:
]
]
</pre>
</pre>
:<code style="white-space: pre;">id</code> идентификатор IDE
<code>id</code> - идентификатор IDE
:<code style="white-space: pre;">name</code> название IDE
<code>name</code> - название IDE
:<code style="white-space: pre;">order</code> порядковый номер IDE в списке
<code>order</code> - порядковый номер IDE в списке
|-
|-
|<pre style="white-space: pre;">
|<pre style="white-space: pre;">
GET /xsvacer/webide/api/snapshots/{snapshot_id}/ide/{ide_id}
GET /api/snapshots/{snapshot_id}/ide/{ide_id}
</pre>
</pre>
|Запрос описания экземпляра IDE, запущенного для снимка.
|Запрос описания экземпляра IDE, запущенного для снимка.  
'''Параметры:'''
'''Параметры:'''
:<code style="white-space: pre;">snapshot_id</code> идентификатор снимка
<code>snapshot_id</code> - идентификатор снимка
:<code style="white-space: pre;">ide_id</code> идентификатор IDE
<code>ide_id</code> - идентификатор IDE
'''Ответ:'''
'''Ответ'''
<pre style="white-space: pre;">
<pre style="white-space: pre;">
{
{
Line 210: Line 68:
|-
|-
|<pre style="white-space: pre;">
|<pre style="white-space: pre;">
POST /xsvacer/webide/api/snapshots/{snapshot_id}/ide
POST /api/snapshots/{snapshot_id}/ide
</pre>
</pre>
|Запуск IDE для просмотра исходных кодов снимка
|Запуск IDE для просмотра исходных кодов снимка
'''Параметры:'''
'''Параметры:'''
:<code style="white-space: pre;">snapshot_id</code> идентификатор снимка
<code>snapshot_id</code> - идентификатор снимка
'''Запрос:'''
'''Запрос:'''
<pre style="white-space: pre;">
<pre style="white-space: pre;">
Line 221: Line 79:
}
}
</pre>
</pre>
:<code style="white-space: pre;">ideId</code> идентификатор IDE
<code>ideId</code> - идентификатор IDE
'''Ответ:'''
'''Ответ:'''
<pre style="white-space: pre;">
<code>"string"</code> - идентификатор IDE
{
  "ideId": "string"
}
</pre>
:<code style="white-space: pre;">ideId</code> — идентификатор IDE
|-
|-
|<pre style="white-space: pre;">
|<pre style="white-space: pre;">
Line 234: Line 87:
</pre>
</pre>
|Команда управления экземпляром IDE снимка
|Команда управления экземпляром IDE снимка
Доступные действия:
* <code>update_markup</code> - обновление предупреждений и разметки (sarif-файла)
'''Параметры:'''
'''Параметры:'''
:<code style="white-space: pre;">snapshot_id</code> идентификатор снимка
<code>snapshot_id</code> - идентификатор снимка
'''Запрос:'''
'''Запрос:'''
<pre style="white-space: pre;">
<pre style="white-space: pre;">
Line 243: Line 98:
}
}
</pre>
</pre>
:<code style="white-space: pre;">action</code> действие
<code>action</code> - действие
:<code style="white-space: pre;">ideId</code> идентификатор IDE
<code>ideId</code> - идентификатор IDE
'''Доступные действия:'''
'''Ответ:'''
* <code style="white-space: pre;">update_markup</code> — обновление предупреждений и разметки (sarif-файла)
<code>"string"</code> - идентификатор IDE
'''Ответ:''' пустой
|-
|-
|<pre style="white-space: pre;">
|<pre style="white-space: pre;">
DELETE /xsvacer/webide/api/snapshots/{snapshot_id}/ide
DELETE /api/snapshots/{snapshot_id}/ide
</pre>
</pre>
|Остановка экземпляра IDE снимка
|Остановка экземпляра IDE снимка
'''Параметры:'''
:<code style="white-space: pre;">snapshot_id</code> — идентификатор снимка
'''Запрос:'''
<pre style="white-space: pre;">
{
  "ideId": "string"
}
</pre>
:<code style="white-space: pre;">ideId</code> — идентификатор IDE
'''Ответ:''' пустой
|-
|-
|<pre style="white-space: pre;">
|/snapshots/{snapshot_id}/ide/{ide_id}/*
/xsvacer/webide/snapshots/{snapshot_id}/ide/{ide_id}/*
|Прокси экземпляра IDE снимка
</pre>
|Прокси для запросов экземпляра IDE снимка
|}
|}


=== Формат идентификатора IDE ===
Формат идентификатора IDE <code>{тип ide}__{идентификатор конфигурации}</code>. Например для <code>default</code>-конфигурации Theia IDE: <code>theia__default</code>


<code style="white-space: pre;">{тип ide}__{идентификатор конфигурации}</code>
== Принцип работы ==


Например, для default-конфигурации Theia IDE: <code style="white-space: pre;">theia__default</code>
=== Запуск IDE ===
 
=== Использование IDE ===
 
=== Остановка IDE ===


== Конфигурация ==
== Конфигурация ==


Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла <code>svacer.cfg</code>
Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла <code>svacer.cfg</code>.


Раздел конфигурации для управления функциональностью <code style="white-space: pre;">xsvacer/webide</code>
Раздел конфигурации для управления функциональностью - <code>xsvacer/webide</code>.


Раздел содержит перечисление доступных конфигураций запуска экземпляров Theia IDE <code style="white-space: pre;">xsvacer/webide/theia</code>. При наличии нескольких активных конфигураций Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.
Раздел содержит перечисление настроек доступных конфигураций для запуска экземпляров Theia IDE <code>xsvacer/webide/theia</code>. При наличии нескольких активных конфигураций запуска Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.


  xsvacer:
  xsvacer:
Line 292: Line 138:
         ...
         ...


Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому необходимо также [[Help:XSvacer:Docker|настроить доступ к docker-хосту]] в разделе <code style="white-space: pre;">xsvacer/docker</code>, иначе функциональность WebIDE не сможет работать корректно.
'''Внимание!''' Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому помимо настройки функциональности в разделе <code>xsvacer/webide</code> необходимо также настроить доступ к docker-хосту в разделе <code>xsvacer/docker</code> ([[Help:XSvacer:Docker]]). В противном случае функциональность webide не сможет работать корректно.


В случае отсутствия файла <code>svacer.cfg</code> или отсутствии раздела <code style="white-space: pre;">xsvacer/webide</code> будет использоваться [[Help:XSvacer:Webide#Конфигурация_по_умолчанию_используемая_в_svacer|конфигурация по умолчанию]].
'''Примечание:''' в случае отсутствия файла <code>svacer.cfg</code> или отсутствии раздела <code>xsvacer/webide</code>, будет использоваться конфигурация по умолчанию (см. ниже)


=== Конфигурация запуска Theia IDE ===
=== Конфигурация запуска Theia IDE ===


{{Note|text=На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!}}
'''Внимание!''' На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!
 
Конфигурации запуска Theia IDE добавляются в виде полей в разделе <code style="white-space: pre;">xsvacer/webide</code>. Название поля является идентификатором конфигурации запуска. Например, идентификатор по номеру используемой версии IDE:


Конфигурации запуска Theia IDE добавляются в виде полей в разделе <code>xsvacer/webide</code>. Название поля является идентификатором конфигурации запуска. Например идентификатор по номеру используемой версии IDE:
  xsvacer:
  xsvacer:
   webide:
   webide:
Line 316: Line 161:
!Тип данных
!Тип данных
!Описание
!Описание
!Значение в конфигурации по умолчанию
!Значение в конфигурации по умолчанию                    
|-
|-
|disabled
|disabled
|bool
|bool
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE
|Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE
|true (переопределяется в конфигурации default)
|true (переопределяется в конфигурации <code>default</code>)        
|-
|-
|order
|order
|int
|int
|Порядковый номер в списке выбора конфигурации запуска
|Порядковый номер в списке выбора конфигурации запуска
|0
|0                                                      
|-
|-
|name
|name
|string
|string
|Название конфигурации
|Название конфигурации
|Theia blueprint web IDE (v1.46.0)
|Theia blueprint web IDE (v1.46.0)                      
|-
|-
|sourcesroot
|sourcesroot
|string
|string
|Путь к папке, содержащей исходные коды снимков на машине со Svacer
|Путь к папке содержащей исходные коды снимков на машине со svacer'ом
|${USER_CACHE_DIR}/svacer-snapshot-sources
|${USER_CACHE_DIR}/svacer-snapshot-sources              
|-
|-
|dockerhostsourcesroot
|dockerhostsourcesroot
|string
|string
|Путь к папке, содержащей исходные коды снимков на хосте docker. Нужен при использовании удалённого docker-хоста, т. к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от <code style="white-space: pre;">sourcesroot</code>
|Путь к папке содержащей исходные коды снимков на хосте docker. Нужен при использовании удалённого docker-хоста, т.к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от <code>sourcesroot</code>
|
|                                                        
|-
|-
|dockerhostpathseparator
|dockerhostpathseparator
|string
|string
|Разделитель пути на хосте docker. По умолчанию <code style="white-space: pre;">"/"</code>
|Разделитель пути на хосте docker. По умолчанию <code>"/"</code>.
|
|                                                        
|-
|-
|sariffiletemplate
|sariffiletemplate
|golang template string
|golang template string
|{{Note|text=В версии 10.0.0 заменён на [[Help:XSvacer:Webide#Параметры_экспорта_sarif-файла_с_разметкой_предупреждений|sarif]]}}
|Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура <code>sarifFileContext</code>
Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]
|"<nowiki>{{.Context.ProjectName}}.{{.Context.BranchName}}</nowiki>.sarif"  
|<nowiki>"{{.Context.ProjectName}}.{{.Context.BranchName}}.sarif"</nowiki>
|}
 
==== Параметры экспорта sarif-файла с разметкой предупреждений ====
 
Данные параметры используются для настройки экспорта sarif-файлов с разметкой предупреждений, выполненной в Svacer.
 
{| class="wikitable"
|+
!Название
!Тип данных
!Описание
!Значение в конфигурации по умолчанию
|-
|sarif
|map
|Настройки экспорта sarif-файла
|
|-
|sarif/filenametemplate
|golang template string
|Шаблон для формирования названия sarif-файла. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|sarifFileContext]]
|<nowiki>"warnings.sarif"</nowiki>
|-
|sarif/commenttemplate
|golang template string
|{{Note|text=Удалён в версии 11.0.0}}
Шаблон для формирования элемента списка комментариев предупреждения при экспорте в sarif-файл. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|Comment]]
|<nowiki>"{{if trim .Text}}`[{{.CreateTs.Local.Format \"02.01.2006 15:04\"}}] {{.CreatedBy}}:`\n\n{{trim .Text}}{{end}}"</nowiki>
|}
|}


==== Параметры менеджера запуска IDE ====
==== Параметры менеджера запуска IDE ====


Конфигурация менеджера запуска IDE. На данный момент доступен только стандартный менеджер (<code style="white-space: pre;">type: default</code>)
Конфигурация менеджера запуска IDE. На данный момент доступен только "стандартный" менеджер (<code>type: default</code>)


{| class="wikitable"
{| class="wikitable"
Line 392: Line 208:
!Тип данных
!Тип данных
!Описание
!Описание
!Значение в конфигурации по умолчанию
!Значение в конфигурации по умолчанию  
|-
|-
|manager
|manager
|map
|map
|Конфигурация менеджера запуска IDE
|Конфигурация менеджера запуска IDE
|
|                                    
|-
|-
|manager/type
|manager/type
|enum: default
|enum: default
|Тип менеджера запуска IDE
|Тип менеджера запуска IDE
|default
|default                            
|}
|}


Line 414: Line 230:
!Тип данных
!Тип данных
!Описание
!Описание
!Значение в конфигурации по умолчанию
!Значение в конфигурации по умолчанию              
|-
|-
|docker/
|docker/
|map
|map
|Настройки создания docker-контейнера с IDE
|Настройки создания docker-контейнера с IDE
|
|                                                  
|-
|-
|docker/hostid
|docker/hostid
|string
|string
|Идентификатор хоста docker, описанного в <code style="white-space: pre;">xsvacer/docker/hosts</code>. Запуск docker-контейнера с IDE будет выполнен на этом хосте
|Идентификатор хоста docker, описанного в <code>xsvacer/docker/hosts</code>. Запуск docker-контейнера с IDE будет выполнен на этом хосте
|default
|default                                          
|-
|-
|docker/containernametemplate
|docker/containernametemplate
|golang template string
|golang template string
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура [[Help:XSvacer:Webide#Структуры_передаваемые_в_поля_с_golang-шаблонами_строк|TheiaDockerContainerStartContext]]
|Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура <code>TheiaDockerContainerStartContext</code> (см. ниже)
|<nowiki>"theia-1-46-{{.StartArgs.SnapshotID}}"</nowiki>
|"theia-1-46-<nowiki>{{.StartArgs.SnapshotID}}</nowiki>"           
|-
|-
|docker/containerconfiglabels
|docker/containerconfiglabels
|[]map
|[]map
|Список меток docker-контейнера. Дополняет список меток в <code style="white-space: pre;">docker/container/config/labels</code>
|Список "меток" docker-контейнера. Дополняет список меток в <code>docker/container/config/labels</code>
|
|
- "com.docker.compose.project": svacer
- "com.docker.compose.project": svacer            
|-
|-
|docker/image/
|docker/image/
|map
|map
|Параметры docker-образа из которого будет запущен контейнер
|Параметры docker-образа из которого будет запущен контейнер
|
|                                                  
|-
|-
|docker/image/name
|docker/image/name
|string
|string
|Название образа
|Название образа
|theia-blueprint
|theia-blueprint                                  
|-
|-
|docker/image/tag
|docker/image/tag
|string
|string
|Тег образа
|Тег образа
|Svacer 11+: 1.46.0.sarif.clang.11.0.0.1
|1.46.0.sarif.clang                                
Svacer 10+: 1.46.0.sarif.clang.10.0.0
 
Svacer 9+: 1.46.0.sarif.clang
|-
|-
|docker/image/sourcetype
|docker/image/sourcetype
|enum: repository/file
|enum: repository/file
|Тип источника для загрузки образа в docker-хост
|Тип источника для загрузки образа в docker-хост.
* repository будет вызван docker pull образа <code>{image/name}:{image/tag}</code>
* <code>repository</code> - будет вызван <code>docker pull</code> образа <code>{image/name}:{image/tag}</code>
* file будет вызван docker load с URL <code>image/sourcefileurl</code>
* <code>file</code> - будет вызван <code>docker load</code> с url'ом <code>image/sourcefileurl</code>
|file
|file                                              
|-
|-
|docker/image/sourcefileurl
|docker/image/sourcefileurl
|url
|url
|URL откуда будет загружен docker-образ если <code style="white-space: pre;">image/sourcetype == "file"</code>
|Url откуда будет загружен docker-образ если <code>image/sourcetype == "file"</code>
URL может содержать:
Url может содержать:
* путь к локальному файлу: схема <code>file://</code>
- путь к локальному файлу: схема <code>file://</code>
* http/https-адрес: схема <code>http://</code> или <code>https://</code>
- http/https-адрес: схема <code>http://</code> или <code>https://</code>
|Svacer 11+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz
|https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar  
Svacer 10+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz
 
Svacer 9+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar
|-
|-
|docker/container/
|docker/container/
|map
|map
|Свойства docker-контейнера
|Свойства docker-контейнера
|
|                                                  
|-
|-
|docker/container/config
|docker/container/config
|map
|map
|Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70
|Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70
|
|                                                  
|-
|-
|docker/container/config/env
|docker/container/config/env
Line 487: Line 297:
|Список переменных среды, которые будут установлены в контейнере
|Список переменных среды, которые будут установлены в контейнере
|
|
- THEIA_WEBVIEW_EXTERNAL_ENDPOINT=<nowiki>{{hostname}}</nowiki>
- THEIA_WEBVIEW_EXTERNAL_ENDPOINT=<nowiki>{{hostname}}</nowiki>    
|-
|-
|docker/container/hostconfig/
|docker/container/hostconfig/
|map
|map
|Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379
|Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379
|
|                                                  
|-
|-
|docker/container/hostconfig/autoremove
|docker/container/hostconfig/autoremove
|bool
|bool
|
|
|true
|true                                              
|-
|-
|docker/container/hostconfig/portbindings
|docker/container/hostconfig/portbindings
Line 503: Line 313:
|
|
|
|
"3000/tcp":
"3000/tcp":                                      
:- hostport: 0
  - hostport: 0                                  
|-
|-
|docker/container/networkconfig/
|docker/container/networkconfig/
|map
|map
|Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104
|Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104
|
|                                                  
|}
|}


Line 521: Line 331:
!Тип данных
!Тип данных
!Описание
!Описание
!Значение в конфигурации по умолчанию
!Значение в конфигурации по умолчанию  
|-
|-
|healthcheck
|healthcheck
|map
|map
|Параметры проверки доступности IDE
|Параметры проверки доступности IDE
|
|                                    
|-
|-
|healthcheck/starttoreadyretries
|healthcheck/starttoreadyretries
|int
|int
|Количества попыток проверки до ошибки доступности
|Количества попыток проверки до ошибки доступности
|10
|10                                  
|-
|-
|healthcheck/starttoreadyperiod
|healthcheck/starttoreadyperiod
|golang duration string
|golang duration string
|Интервал проверки
|Интервал проверки
|200ms
|200ms                              
|}
|}


Line 543: Line 353:
  sarifFileContext {
  sarifFileContext {
     Time    time.Time
     Time    time.Time
    Context: {
Context: {
         ProjectID  *string
         ProjectID  *string
         BranchID  *string
         BranchID  *string
         SnapshotID *string
         SnapshotID *string
         MarkerID  *string
         MarkerID  *string
 
         ProjectName  *string
         ProjectName  *string
         BranchName  *string
         BranchName  *string
Line 558: Line 368:
     }
     }
  }
  }
 
  TheiaDockerContainerStartContext {
  TheiaDockerContainerStartContext {
    IdeID: {
IdeID: {
         IdeType  string
         IdeType  string
         ConfigID string
         ConfigID string
     },
     },
    StartArgs: {
StartArgs: {
         SnapshotID string
         SnapshotID string
         UserID    string
         UserID    string
         User      string
         User      string
     },
     },
    Context: {
Context: {
         ProjectID  *string
         ProjectID  *string
         BranchID  *string
         BranchID  *string
         SnapshotID *string
         SnapshotID *string
         MarkerID  *string
         MarkerID  *string
 
         ProjectName  *string
         ProjectName  *string
         BranchName  *string
         BranchName  *string
Line 585: Line 395:
  }
  }


Comment {
=== Конфигурация по умолчанию используемая в svacer ===
    ID              string
    Text            string
    Ref              string
    CreatedBy        string
    CreatedByID      string
    CreateTs        time.Time
    UpdateTs        *time.Time
    UpdatedBy        string
    UpdatedByID      string
}


=== Конфигурация по умолчанию ===
Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел <code>xsvacer/webide</code>:


Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел <code style="white-space: pre;">xsvacer/webide</code>
xsvacer:
  docker:
    hosts:
      default: # конфигурация docker-хоста, действующая по умолчанию
        type: external
      ...
  webide:
    theia:
      1-46-0: &1-46-0
        disabled: true
        order: 0
        name: Theia blueprint web IDE (v1.46.0)
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources
        sariffiletemplate: "<nowiki>{{.Context.ProjectName}}.{{.Context.BranchName}}</nowiki>.sarif"
        manager:
          type: default
        docker:
          hostid: default # идентификатор используемого docker-хоста
          containernametemplate: "theia-1-46-<nowiki>{{.StartArgs.SnapshotID}}</nowiki>"
          image:
            name: theia-blueprint
            tag: 1.46.0.sarif.clang
            sourcetype: file
            sourcefileurl: https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar
          containerconfiglabels:
            - "com.docker.compose.project": svacer
          container:
            config:
              env:
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=<nowiki>{{hostname}}</nowiki>
            hostconfig:
              autoremove: true
              portbindings:
                "3000/tcp":
                  - hostport: 0
            networkconfig:
        healthcheck:
          starttoreadyretries: 10
          starttoreadyperiod: 200ms
      default:
        <<: *1-46-0
        order: 0
        disabled: false


<pre style="white-space: pre;">
'''Внимание!''' По умолчанию используется docker-хост с идентификатором <code>default</code>. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет <code>unix:///var/run/docker.sock</code>. Соответственно пользователь, под которым запускается svacer должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).
xsvacer:
  webide:
    theia:
      1-46-0: &1-46-0
        disabled: true
        order: 0
        name: Theia blueprint web IDE (v1.46.0)
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources
        sarif:
            filenametemplate: "warnings.sarif"
        manager:
          type: default
        docker:
          hostid: default # идентификатор используемого docker-хоста
          containernametemplate: "theia-1-46-<nowiki>{{.StartArgs.SnapshotID}}</nowiki>"
          image:
            name: theia-blueprint
            tag: 1.46.0.sarif.clang.11.0.0.1
            sourcetype: file
            sourcefileurl: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz
          containerconfiglabels:
            - "com.docker.compose.project": svacer
          container:
            config:
              env:
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT=<nowiki>{{hostname}}</nowiki>
            hostconfig:
              autoremove: true
              portbindings:
                "3000/tcp":
                  - hostport: 0
            networkconfig:
        healthcheck:
          starttoreadyretries: 10
          starttoreadyperiod: 200ms
      default:
        <<: *1-46-0
        order: 0
        disabled: false
</pre>


По умолчанию используется docker-хост с идентификатором <code>default</code>. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет <code style="white-space: pre;">unix:///var/run/docker.sock</code>. Соответственно пользователь, под которым запускается Svacer, должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).
'''Внимание!''' При наличии раздела <code>xsvacer/webide</code> в конфигурационном файле <code>svacer.cfg</code>, будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы.
 
{{Note|text=При наличии раздела <code style="white-space: pre;">xsvacer/webide</code> в конфигурационном файле svacer.cfg будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы}}


=== Изменение конфигурационных параметров с помощью переменных окружения ===
=== Изменение конфигурационных параметров с помощью переменных окружения ===


Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения
Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения <code>XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}</code>
 
XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}</code>
 
Например, для активации rootless-хоста <code style="white-space: pre;">xsvacer/hosts/local</code> и переключения запуска IDE с идентификатором <code style="white-space: pre;">default</code> на этот хост можно указать такие значения переменных окружения при запуске Svacer:


Например, для активации rootless-хоста <code>xsvacer/hosts/local</code> и переключения запуска IDE с идентификатором <code>default</code> на этот хост, можно указать такие значения переменных окружения при запуске svacer'а:
  XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false
  XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false
  XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local
  XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local
== Очистка системы: удаление артефактов функциональности ==
В процессе использования функциональности IDE создаются следующие артефакты:
# Исходные файлы снимков скачиваются в корневые папки, заданные в параметре <code style="white-space: pre;">xsvacer/webide/theia/{id конфигурации}/sourcesroot</code>
# Артефакты docker:
#* образы и контейнеры создаются на хостах, указанных в конфигурации docker-хостов в <code style="white-space: pre;">xsvacer/webide/theia/{id конфигурации}/docker/hostid</code>
#* названия docker-образов будут соответствовать параметрам в <code style="white-space: pre;">xsvacer/webide/theia/{id конфигурации}/docker/image</code>
#* названия docker-контейнеров будут соответствовать параметру <code style="white-space: pre;">xsvacer/webide/theia/{id конфигурации}/docker/containernametemplate</code>
#* наборы меток doker-контейнеров будут содержать:
#*: метки, перечисленные в <code style="white-space: pre;">xsvacer/webide/theia/{id конфигурации}/docker/containerconfiglabels</code>
#*: метки, перечисленные в <code style="white-space: pre;">xsvacer/webide/theia/{id конфигурации}/docker/container/config/labels</code>
#*: метки с названиями <code style="white-space: pre;">svacer.service.id</code>, <code style="white-space: pre;">svacer.service.type</code>, <code style="white-space: pre;">svacer.theia.start_args</code>
# При использовании rootless-хоста docker будут созданы папки согласно [[Help:XSvacer:Docker#Специфичные настройки для rootless-хоста|настройкам]]


== Рекомендации ==
== Рекомендации ==
Line 676: Line 460:
=== Предварительная загрузка docker-образа с IDE ===
=== Предварительная загрузка docker-образа с IDE ===


По умолчанию параметр
По умолчанию параметр <code>xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl</code> содержит значение <code>https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar</code>. По этому адресу находится архив с docker-образом для Theia IDE.
 
xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl
 
Содержит значение
Svacer 11+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.11.0.0.1.tar.gz
Svacer 10+: https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.10.0.0.tar.gz
Svacer 9+:  https://svacer.ispras.ru/docker/images/theia-blueprint.1.46.0.sarif.clang.tar
 
По этому адресу находится архив с docker-образом для Theia IDE.
 
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т. к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго.
 
Для ускорения первого запуска IDE докер образ можно загрузить на хост docker вручную. Для этого необходимо:
 
# Скачать файл архива
# Выполнить команду <code style="white-space: pre;">docker image load -i /path/to/theia-blueprint...</code>
 
== Информация о docker-образе Theia IDE ==
 
Docker-образ, используемый по умолчанию, построен на базе [https://theia-ide.org/ Eclipse Theia IDE] версии [https://github.com/eclipse-theia/theia-blueprint/tree/v1.46.0 1.46.0].
 
При этом была изменена компоновка расширений Theia. Результат выполнения <code>git diff</code>:
 
<pre style="white-space: pre;">
diff --git a/browser.Dockerfile b/browser.Dockerfile
index efe591e..a4ebb6a 100644
--- a/browser.Dockerfile
+++ b/browser.Dockerfile
@@ -42,7 +42,7 @@ RUN chmod g+rw /home && \
RUN apt-get update && apt-get install -y wget apt-transport-https && \
    wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /usr/share/keyrings/adoptium.asc && \
    echo "deb [signed-by=/usr/share/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list && \
-    apt-get update && apt-get install -y git openssh-client openssh-server bash libsecret-1-0 temurin-17-jdk maven && \
+    apt-get update && apt-get install -y git openssh-client openssh-server bash libsecret-1-0 clangd && \
    apt-get purge -y wget && \
    apt-get clean
 
diff --git a/package.json b/package.json
index 9044595..9d0dcc8 100644
--- a/package.json
+++ b/package.json
@@ -54,10 +54,8 @@
  "theiaPluginsDir": "plugins",
  "theiaPlugins": {
    "eclipse-theia.builtin-extension-pack": "https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.83.1/file/eclipse-theia.builtin-extension-pack-1.83.1.vsix",
-    "ms-vscode.js-debug": "https://open-vsx.org/api/ms-vscode/js-debug/1.83.1/file/ms-vscode.js-debug-1.83.1.vsix",
-    "ms-vscode.js-debug-companion": "https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix",
-    "vscjava.vscode-java-pack": "https://open-vsx.org/api/vscjava/vscode-java-pack/0.25.11/file/vscjava.vscode-java-pack-0.25.11.vsix",
-    "vscjava.vscode-java-dependency": "https://open-vsx.org/api/vscjava/vscode-java-dependency/0.21.2/file/vscjava.vscode-java-dependency-0.21.2.vsix"
+    "llvm-vs-code-extensions.vscode-clangd": "https://open-vsx.org/api/llvm-vs-code-extensions/vscode-clangd/0.1.26/file/llvm-vs-code-extensions.vscode-clangd-0.1.26.vsix",
+    "ms-sarifvscode.sarif-viewer": "https://open-vsx.org/api/MS-SarifVSCode/sarif-viewer/3.4.4/file/MS-SarifVSCode.sarif-viewer-3.4.4.vsix"
  },
  "theiaPluginsExcludeIds": [
    "ms-vscode.js-debug-companion",
</pre>
 
Команда построения docker-образа:
docker build -t theia-blueprint:1.46.0.sarif.clang... -f browser.Dockerfile .
 
Команда экспорта docker-образа:
docker image save theia-blueprint:1.46.0.sarif.clang... | gzip > /path/to/tar/theia-blueprint.1.46.0.sarif.clang....tar.gz
 
== Известные проблемы ==
 
=== При открытии sarif-файла в IDE открывается пустая панель "SARIF Results" ===


Для просмотра sarif-файла, содержащего предупреждения анализатора и разметку, используется плагин [https://open-vsx.org/extension/MS-SarifVSCode/sarif-viewer SARIF Viewer]. При просмотре sarif-файла открывается webview плагина со списком предупреждений анализатора.
Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т.к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго.


В Theia IDE для открытия webview применяется [https://developer.mozilla.org/en_US/docs/Web/API/Service_Worker_API Service Worker API]. В целях обеспечения безопасности применение Service Worker API [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#setting_up_to_play_with_service_workers требует], чтобы доступ к web-приложению осуществлялся по HTTPS, либо приложение размещалось на localhost.
Для ускорения первого запуска IDE, докер образ можно загрузить в хост docker'а вручную. Для этого необходимо:
# Скачать файл архива;
# Выполнить команду <code>docker image load -i /path/to/tar/theia-blueprint.1.46.0.sarif.clang.tag</code>;


Поэтому для решения данной проблемы Svacer должен открываться по HTTPS или быть доступен по адресу <code style="white-space: pre;"><nowiki>http://localhost:...</nowiki></code>
== docker-образ Theia IDE ==

Revision as of 13:02, 5 June 2024

Поддержка среды разработки Theia IDE

Примечание: данная функциональность входит в набор расширений XSvacer.

Данная функциональность даёт возможность просматривать исходный код снимка с предупреждениями анализатора во внешней IDE.

По умолчанию запускается IDE собранная на основе Theia IDE (https://theia-ide.org/).

Активация функциональности

Для активации функциональности необходимо указать флаг --xsvacer.features webide при запуске svacer'а.

Примечание: при запуске функциональности webide также будет запущена функциональность docker.

После этого становится доступным REST API управления IDE для просмотра снимков проектов, в пользовательском интерфейсе появляется кнопка "Открыть в IDE", устанавливается подключение к хосту docker'а, на котором будут запускаться контейнеры с экземплярами IDE.

REST API для работы с IDE

После активации функциональности становятся доступны http-ресурсы для управления IDE снимков:

Ресурс Описание
GET /api/ide
Получение списка доступных для запуска IDE.

Ответ:

[
  {
    "id": "string",
    "name": "string",
    "order": 0
  }
]

id - идентификатор IDE name - название IDE order - порядковый номер IDE в списке

GET /api/snapshots/{snapshot_id}/ide/{ide_id}
Запрос описания экземпляра IDE, запущенного для снимка.

Параметры: snapshot_id - идентификатор снимка ide_id - идентификатор IDE Ответ

{
  "id": {
    "ide_id": {
      "ide_type": "string"
      "config_id": "string",
    },
    "snapshot_id": "string"
  },
  "properties": {
    "url": "string"
  },
  "start_args": {
    "snapshot_id": "string",
    "user": "string",
    "user_id": "string"
  }
}
POST /api/snapshots/{snapshot_id}/ide
Запуск IDE для просмотра исходных кодов снимка

Параметры: snapshot_id - идентификатор снимка Запрос:

{
  "ideId": "string"
}

ideId - идентификатор IDE Ответ: "string" - идентификатор IDE

PUT /api/snapshots/{snapshot_id}/ide
Команда управления экземпляром IDE снимка

Доступные действия:

  • update_markup - обновление предупреждений и разметки (sarif-файла)

Параметры: snapshot_id - идентификатор снимка Запрос:

{
  "action": "string",
  "ideId": "string"
}

action - действие ideId - идентификатор IDE Ответ: "string" - идентификатор IDE

DELETE /api/snapshots/{snapshot_id}/ide
Остановка экземпляра IDE снимка
/snapshots/{snapshot_id}/ide/{ide_id}/* Прокси экземпляра IDE снимка

Формат идентификатора IDE {тип ide}__{идентификатор конфигурации}. Например для default-конфигурации Theia IDE: theia__default

Принцип работы

Запуск IDE

Использование IDE

Остановка IDE

Конфигурация

Управление настройками функциональности осуществляется с помощью конфигурационного yaml-файла svacer.cfg.

Раздел конфигурации для управления функциональностью - xsvacer/webide.

Раздел содержит перечисление настроек доступных конфигураций для запуска экземпляров Theia IDE xsvacer/webide/theia. При наличии нескольких активных конфигураций запуска Theia IDE пользователь сможет выбрать какую из них использовать при запуске IDE с исходными файлами снимка.

xsvacer:
  webide:
    theia:
      config1:
        ...
      config2:
        ...
Внимание! Запуск IDE основывается на запуске docker-контейнеров, содержащих соответствующие сборки IDE. Поэтому помимо настройки функциональности в разделе xsvacer/webide необходимо также настроить доступ к docker-хосту в разделе xsvacer/docker (Help:XSvacer:Docker). В противном случае функциональность webide не сможет работать корректно.
Примечание: в случае отсутствия файла svacer.cfg или отсутствии раздела xsvacer/webide, будет использоваться конфигурация по умолчанию (см. ниже)

Конфигурация запуска Theia IDE

Внимание! На этапе внедрения расширений XSvacer конфигурация функциональностей может меняться. Следите за анонсами!

Конфигурации запуска Theia IDE добавляются в виде полей в разделе xsvacer/webide. Название поля является идентификатором конфигурации запуска. Например идентификатор по номеру используемой версии IDE:

xsvacer:
  webide:
    theia:
      1-46-0:
        name: Theia blueprint web IDE (v1.46.0)
        ...

Базовые параметры конфигурации запуска

Название Тип данных Описание Значение в конфигурации по умолчанию
disabled bool Конфигурация запуска неактивна. Неактивная конфигурация не доступна для запуска экземпляра IDE true (переопределяется в конфигурации default)
order int Порядковый номер в списке выбора конфигурации запуска 0
name string Название конфигурации Theia blueprint web IDE (v1.46.0)
sourcesroot string Путь к папке содержащей исходные коды снимков на машине со svacer'ом ${USER_CACHE_DIR}/svacer-snapshot-sources
dockerhostsourcesroot string Путь к папке содержащей исходные коды снимков на хосте docker'а. Нужен при использовании удалённого docker-хоста, т.к. в таком случае папка с исходными кодами скорее всего будет доступна по адресу, отличающемуся от sourcesroot
dockerhostpathseparator string Разделитель пути на хосте docker'а. По умолчанию "/".
sariffiletemplate golang template string Шаблон названия sarif-файла с предупреждениями анализатора. В шаблон передаётся структура sarifFileContext "{{.Context.ProjectName}}.{{.Context.BranchName}}.sarif"

Параметры менеджера запуска IDE

Конфигурация менеджера запуска IDE. На данный момент доступен только "стандартный" менеджер (type: default)

Название Тип данных Описание Значение в конфигурации по умолчанию
manager map Конфигурация менеджера запуска IDE
manager/type enum: default Тип менеджера запуска IDE default

Параметры запуска docker-контейнеров с IDE

Данные параметры используются для настройки запуска docker-контейнеров с IDE

Название Тип данных Описание Значение в конфигурации по умолчанию
docker/ map Настройки создания docker-контейнера с IDE
docker/hostid string Идентификатор хоста docker'а, описанного в xsvacer/docker/hosts. Запуск docker-контейнера с IDE будет выполнен на этом хосте default
docker/containernametemplate golang template string Шаблон для формирования названия контейнера IDE для выбранного снимка. В шаблон передаётся структура TheiaDockerContainerStartContext (см. ниже) "theia-1-46-{{.StartArgs.SnapshotID}}"
docker/containerconfiglabels []map Список "меток" docker-контейнера. Дополняет список меток в docker/container/config/labels
- "com.docker.compose.project": svacer             
docker/image/ map Параметры docker-образа из которого будет запущен контейнер
docker/image/name string Название образа theia-blueprint
docker/image/tag string Тег образа 1.46.0.sarif.clang
docker/image/sourcetype enum: repository/file Тип источника для загрузки образа в docker-хост.
  • repository - будет вызван docker pull образа {image/name}:{image/tag}
  • file - будет вызван docker load с url'ом image/sourcefileurl
file
docker/image/sourcefileurl url Url откуда будет загружен docker-образ если image/sourcetype == "file"

Url может содержать: - путь к локальному файлу: схема file:// - http/https-адрес: схема http:// или https://

https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar
docker/container/ map Свойства docker-контейнера
docker/container/config map Конфигурация контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/config.go#L70
docker/container/config/env []string Список переменных среды, которые будут установлены в контейнере
- THEIA_WEBVIEW_EXTERNAL_ENDPOINT={{hostname}}     
docker/container/hostconfig/ map Параметры хостинга контейнера. Соответствует структуре https://github.com/moby/moby/blob/v24.0.7/api/types/container/hostconfig.go#L379
docker/container/hostconfig/autoremove bool true
docker/container/hostconfig/portbindings map
"3000/tcp":                                        
  - hostport: 0                                    
docker/container/networkconfig/ map Сетевые настройки контейнера. Соответствуют структуре https://github.com/moby/moby/blob/v24.0.7/api/types/network/network.go#L104

Параметры проверки доступности healthcheck

Данные параметры используются для проверки доступности IDE после запуска docker-контейнера

Название Тип данных Описание Значение в конфигурации по умолчанию
healthcheck map Параметры проверки доступности IDE
healthcheck/starttoreadyretries int Количества попыток проверки до ошибки доступности 10
healthcheck/starttoreadyperiod golang duration string Интервал проверки 200ms

Структуры передаваемые в поля с golang-шаблонами строк

sarifFileContext {
    Time    time.Time
	Context: {
        ProjectID  *string
        BranchID   *string
        SnapshotID *string
        MarkerID   *string

        ProjectName  *string
        BranchName   *string
        SnapshotName *string
        MarkerName   *string
        CreatedBy    null.String
        CreatedByID  null.String
        CreateTs     null.Time
    }
}

TheiaDockerContainerStartContext {
	IdeID: {
        IdeType  string
        ConfigID string
    },
	StartArgs: {
        SnapshotID string
        UserID     string
        User       string
    },
	Context: {
        ProjectID  *string
        BranchID   *string
        SnapshotID *string
        MarkerID   *string

        ProjectName  *string
        BranchName   *string
        SnapshotName *string
        MarkerName   *string
        CreatedBy    null.String
        CreatedByID  null.String
        CreateTs     null.Time
    }
}

Конфигурация по умолчанию используемая в svacer

Данная настройка применяется по умолчанию для запуска Theia IDE, если в конфигурационном файле svacer.cfg отсутствует раздел xsvacer/webide:

xsvacer:
  docker:
    hosts:
      default: # конфигурация docker-хоста, действующая по умолчанию
        type: external
      ...

  webide:
    theia:
      1-46-0: &1-46-0
        disabled: true
        order: 0
        name: Theia blueprint web IDE (v1.46.0)
        sourcesroot: ${USER_CACHE_DIR}/svacer-snapshot-sources
        sariffiletemplate: "{{.Context.ProjectName}}.{{.Context.BranchName}}.sarif"
        manager:
          type: default
        docker:
          hostid: default # идентификатор используемого docker-хоста
          containernametemplate: "theia-1-46-{{.StartArgs.SnapshotID}}"
          image:
            name: theia-blueprint
            tag: 1.46.0.sarif.clang
            sourcetype: file
            sourcefileurl: https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar
          containerconfiglabels:
            - "com.docker.compose.project": svacer
          container:
            config:
              env:
                - THEIA_WEBVIEW_EXTERNAL_ENDPOINT={{hostname}}
            hostconfig:
              autoremove: true
              portbindings:
                "3000/tcp":
                  - hostport: 0
            networkconfig:
        healthcheck:
          starttoreadyretries: 10
          starttoreadyperiod: 200ms
      default:
        <<: *1-46-0
        order: 0
        disabled: false
Внимание! По умолчанию используется docker-хост с идентификатором default. Согласно настройке этого хоста, по умолчанию предполагается взаимодействие с докером через unix-сокет unix:///var/run/docker.sock. Соответственно пользователь, под которым запускается svacer должен иметь доступ к этому сокету (https://docs.docker.com/engine/install/linux-postinstall/).
Внимание! При наличии раздела xsvacer/webide в конфигурационном файле svacer.cfg, будут применены только настройки из этого раздела. Настройки по умолчанию будут полностью проигнорированы.

Изменение конфигурационных параметров с помощью переменных окружения

Значения атрибутов конфигурации могут быть изменены с помощью переменных окружения XSVACER_WEBIDE_THEIA_{id конфигурации ide}[_параметр]={значение параметра}

Например, для активации rootless-хоста xsvacer/hosts/local и переключения запуска IDE с идентификатором default на этот хост, можно указать такие значения переменных окружения при запуске svacer'а:

XSVACER_DOCKER_HOSTS_LOCAL_DISABLED=false
XSVACER_WEBIDE_THEIA_DEFAULT_DOCKER_HOSTID=local

Рекомендации

Предварительная загрузка docker-образа с IDE

По умолчанию параметр xsvacer/webide/theia/1-46-0/docker/image/sourcefileurl содержит значение https://nextcloud.ispras.ru/index.php/s/gr7pa4RDJBBqAPy/download/theia-blueprint.1.46.0.sarif.clang.tar. По этому адресу находится архив с docker-образом для Theia IDE.

Если docker-образ ещё не был загружен, то загрузка начнётся при первой попытке запуска IDE. Т.к. этот процесс занимает длительное время, то запрос запуска IDE тоже будет выполняться долго.

Для ускорения первого запуска IDE, докер образ можно загрузить в хост docker'а вручную. Для этого необходимо:

  1. Скачать файл архива;
  2. Выполнить команду docker image load -i /path/to/tar/theia-blueprint.1.46.0.sarif.clang.tag;

docker-образ Theia IDE