Gear/cronbuild: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
 
(не показано 26 промежуточных версий 4 участников)
Строка 1: Строка 1:
{{Category navigation|title=gear|category=gear|sortkey={{SUBPAGENAME}}}}
<!-- {{stub}} -->
<!-- {{stub}} -->


Строка 6: Строка 5:
Некоторые пакеты по своей природе нуждаются в постоянном обновлении,
Некоторые пакеты по своей природе нуждаются в постоянном обновлении,
при этом при обновлении у этих пакетов спек практически не меняется.
при этом при обновлении у этих пакетов спек практически не меняется.
К таким пакетам относятся различные базы - антивирусные, оборудования
Например, к таким пакетам относятся различные базы - антивирусные, оборудования
(foomatic-db, PCI IDs, мониторов, ...), cliparts, и т. д.
(foomatic-db, PCI IDs, мониторов, ...), cliparts, и т. д.
Как правило, в версии/релизе таких пакетов присутствует timestamp.
Как правило, в версии/релизе таких пакетов присутствует timestamp.
Система cronbuild предназначена для автоматизации сборки таких пакетов.
Система cronbuild предназначена для автоматизации сборки таких пакетов.
Теперь майнтайнеру достаточно один раз настроить для пакета cronbuild
Теперь майнтайнеру достаточно один раз настроить для пакета cronbuild
и пакет будет автоматически собираться в Сизиф с заданной майнтайнером периодичностью,
и в дальнейшем при появлении обновлений пакет будет автоматически собираться в Сизиф
например, раз в неделю, до тех пор, пока сборка не сломается.
до тех пор, пока сборка не сломается. Сервер cronbuild проверяет  пакет на наличие обновлений
с заданной майнтайнером периодичностью, по умолчанию это раз в неделю.


При этом пакеты собираются только тогда, когда это действительно нужно:
При этом пакеты собираются только тогда, когда это действительно нужно:
Строка 18: Строка 19:
то сборка пакета будет пропущена, так как в ней нет необходимости.
то сборка пакета будет пропущена, так как в ней нет необходимости.


Управлять роботом очень легко: если нужно внести в пакет какие-то изменения,
Управлять сервисом Cronbuild просто: если нужно внести в пакет какие-то изменения, достаточно внести их локально и отправьть пакет на сборку вручную. При следующей попытке обновления робот склонирует уже измененный репозиторий, т.е. изменения будут подхвачены автоматически.
просто внесите их локально и отправьте пакет на сборку вручную.
 
Робот автоматически подхватит вашу работу.
== Быстрая настройка ==
 
1. Создать служебный файл {{path|.gear/cronbuild-options}} в gear-репозитории:
echo "cronbuild_mailto=<email мейнтейнера" > .gear/cronbuild-options


== Настройка cronbuild. ==
2. Закоммитить и собрать пакет с этим файлом
 
3. Завести багу в https://bugzilla.altlinux.org/enter_bug.cgi?product=Infrastructure на компонент '''cronbuild'''.
В теме указать имя пакета.
 
== Часто задаваемые вопросы ==
 
> Пока я вижу, что cronbuild все еще использует старую версию а не ту, что в моем git.
 
Да, так и должно быть. cronbuild клонирует последнюю _собранную_в_Сизиф_ сборку,
в ваш git он не лезет и не должен, ведь там может быть нестабильная разработка.
 
Отправьте ваши изменения в Сизиф, тогда cronbuild их подхватит.
 
== Настройка cronbuild ==
cronbuild состоит из 3-х частей:
cronbuild состоит из 3-х частей:


Строка 33: Строка 51:


После этого gear-cronbuild можно пользоваться локально, для ускорения работы,
После этого gear-cronbuild можно пользоваться локально, для ускорения работы,
а можно подключть в сервер удаленной сборки.
а также можно разместить на сервере удаленной сборки.


=== утилиты для локальной сборки (пакет {{pkg|gear-cronbuild}}) ===
=== утилиты для локальной сборки (пакет {{pkg|gear-cronbuild}}) ===
Строка 48: Строка 66:
gear-commit
gear-commit
</source>
</source>
=== Настройка cronbuild для автоматизации обновления .git репозитрия ===
Для работы cronbuild необходимо
* либо добавить .gear/upstream/remotes и настроить обновления по git tag (см. [[Gear/remotes]].). Рекомендовано для обновления из git репрзитория по тегу.
* либо добавить в репозиторий .watch файл (см. [[Watch]]). Рекомендовано для обновления из версионированного архива на удаленном сайте.
* либо написать скрипт {{cmd|.gear/cronbuild-update-source}}, в котором заскриптовать процесс обновления для нестандартных случаев.
==== обновление до новых версий с помошью файла .gear/upstream/remotes ====
Если в репозитории присутствует файл {{path|.gear/upstream/remotes}}, то при отсутствии скрипта {{cmd|.gear/cronbuild-update-source}}
утилита {{prg|gear-cronbuild-apply-hooks}} запустит утилиту gear-remotes-uscan (см. [[Gear/remotes]].),
Если репозиторий корректно настроен на работу с gear-remotes-*,
то никаких скриптов для cronbuild создавать не нужно, достаточно {{path|.gear/upstream/remotes}}.
==== обновление до новых версий с помошью .watch файла ====
Если в репозитории присутствует .watch файл, то при отсутствии скрипта {{cmd|.gear/cronbuild-update-source}}
утилита {{prg|gear-cronbuild-apply-hooks}} запустит связку утилит rpm-uscan + [[Gear/gear-uupdate|gear-uupdate]], см. [[Watch]].
Если .watch файл корректный, и стркутура репозитария поддерживается утилитой gear-uupdate,
то никаких скриптов для cronbuild создавать не нужно, .watch файла достаточно.


=== локальные скрипты cronbuild для автоматизации обновления .git репозитрия ===
=== локальные скрипты cronbuild для автоматизации обновления .git репозитрия ===


Для работы cronbuild необходимо добавить в репозиторий .watch файл (см. [[Watch]].)
==== Скрипт {{cmd|.gear/cronbuild-update-source}} и необязательные скрипты-помощники. ====
либо написать скрипт {{cmd|.gear/cronbuild-update-source}}.
 
Этот скрипт пишется индивидуально для каждого пакета. Его задача --
Скрипт {{cmd|.gear/cronbuild-update-source}} пишется индивидуально для каждого пакета. Его задача --
обновить исходные тексты пакета, используя {{cmd|git-fetch}}, {{cmd|git-svn}}
обновить исходные тексты пакета, используя {{cmd|git-fetch}}, {{cmd|git-svn}}
или просто {{cmd|wget}}.  
или просто {{cmd|wget}}.  
Дополнительно могут понадобиться необязательные скрипты
* {{cmd|.gear/cronbuild-update-version}} для установки новой версии и/ли релиза вручную (без него новая версия будет выставлена в ГГГГММДД (ГодМесяцДень)
* {{cmd|.gear/cronbuild-add-changelog}} чтобы заменить стандартную фразу cronbuild в %changelog на свою.
Скрипты должны быть помечены как исполняемые.
Все скрипты получают спек-файл как первый аргумент.
Внутренняя служебная утилита {{cmd|gear-cronbuild-apply-hooks}} запускает скрипт {{cmd|.gear/cronbuild-update-source}}.
Если скрипт завершился с ошибкой, обновление останавливается и сообщение об ошибке получает майнтайнер.
Если скрипт завершился без ошибок, утилита {{cmd|gear-cronbuild-apply-hooks}} выполняет
git diff $last_commit_before_the_run
Если в git репозитории изменений не произошло, то обновлений нет и работа gear-cronbuild завершается.
Если git diff $last_commit_before_the_run показал изменения, то считается, что обновления есть
и работа gear-cronbuild продолжается.
Заметим, что скрипт {{cmd|.gear/cronbuild-update-source}} не должен трогать спек. Для изменения версии в спек файле
предусмотрен скрипт {{cmd|.gear/cronbuild-update-version}}.


==== пример скрипта для обновления через wget ====
==== пример скрипта для обновления через wget ====
Строка 74: Строка 131:
git add $PKGNAME
git add $PKGNAME
</source>
</source>
==== обновление до новых версий с помошью .watch файла ====
Если в репозитории присутствует .watch файл, то при отсутствии скрипта {{cmd|.gear/cronbuild-update-source}}
утилита {{prg|gear-cronbuild-apply-hooks}} запустит связку утилит rpm-uscan + gear-uupdate, см. [[Watch]].
Если .watch файл корректный, и стркутура репозитария поддерживается утилитой gear-uupdate,
то никаких скриптов для cronbuild создавать не нужно, .watch файла достаточно.


==== замечания к скрипту ====
==== замечания к скрипту ====
* скрипт должен сообщать о всех проблемах при обновлении. Проще всего использовать {{path|#!/bin/sh -ve}},
* Если версия не изменилась/исходники не обновлялись, если вы ничего не добавляли в индекс git, просто выходите через exit 0. Иначе перед выходом сначала сбросьте изменения в индексе git с помощью {{cmd|git reset}}.
* Удаляйте за собой мусор: временные файлы, каталоги и т.д.
* скрипт должен сообщать о всех проблемах при обновлении через exit с ненулевым exit_code. Проще всего использовать {{path|#!/bin/sh -ve}},
иначе придется у каждой команды проверять код завершения.
иначе придется у каждой команды проверять код завершения.
* изменения должны быть добавлены в индекс git.  
* изменения должны быть добавлены в индекс git.  
Строка 115: Строка 168:
Для этого необходимо создать файл {{path|.gear/cronbuild-options}},
Для этого необходимо создать файл {{path|.gear/cronbuild-options}},
указать там желаемую периодичность сборки и e-mail для рассылки оповещений,
указать там желаемую периодичность сборки и e-mail для рассылки оповещений,
и зарегистрировать в bugzilla заявку на Infrastructure/cronbuild
отправить в сизиф сборку пакета с новым содержимым {{path|.gear/cronbuild-options}},
(пока это не реализовано, можно на пакет gear-cronbuild).
и зарегистрировать в bugzilla заявку на Infrastructure/cronbuild.
 
'''Важно!''' сервис cronbuild для работы клонирует последнюю успешную сборку пакета в Сизифе.
Поэтому важно собрать в сизиф пакет с новыми настройками {{path|.gear/cronbuild-options}}.
Изменения локально на рабочей машине майнтайнера, даже опубликованные на git.altlinux.org,
без сборки пакета в Сизиф подхвачены не будут!


==== Как вносить изменения в сборку ====
==== Как вносить изменения в сборку ====
Строка 156: Строка 214:


Скрипты cronbuild-update-source, cronbuild-update-version, cronbuild-add-changelog получают спек-файл как первый аргумент.
Скрипты cronbuild-update-source, cronbuild-update-version, cronbuild-add-changelog получают спек-файл как первый аргумент.
==== Другие файлы, используемые утилитой {{prg|gear-cronbuild-apply-hooks}} ====
{| class="standard"
!файл
!Описание
|-
|class="shadow"|.gear/upstream/remotes
|настройка [[Gear/remotes|remotes]] для клонированного git репозитория. Не обязателен.
|-
|class="shadow"|.gear/cronbuild-git-config
|опции к команде git-config, для дополнительной настройки клонированного git репозитория. Устарел.
|}


==== Файлы, используемые сервером сборки cronbuild repocop.altlinux.org ====
==== Файлы, используемые сервером сборки cronbuild repocop.altlinux.org ====
Строка 175: Строка 246:
К файлам конфигурации это не относится.
К файлам конфигурации это не относится.


=== cronbuild-options ===
=== ./gear/cronbuild-options ===
{| class="standard"
{| class="standard"
!переменная
!переменная
Строка 185: Строка 256:
|-
|-
|class="shadow"|cronbuild_interval
|class="shadow"|cronbuild_interval
|периодичность сборок в днях. желательно.
|периодичность сборок в днях. Желательно. По умолчанию — 3 дня.
|-
|-
|class="shadow"|cronbuild_mailto
|class="shadow"|'''cronbuild_mailto'''
|e-mail ответственного. обязательно.
|'''e-mail ответственного. Обязательно.'''
|-
|-
|class="shadow"|cronbuild_cc
|class="shadow"|cronbuild_cc
|список дополнительных e-mail (optional)
|список дополнительных e-mail через запятую. Не обязательно.<br>(Передается в mutt опцией: -c "$cronbuild_cc")
|-
|-
|class="shadow"|cronbuild_mastergit
|class="shadow"|cronbuild_mastergit
Строка 204: Строка 275:
== Примечания ==
== Примечания ==
<references />
<references />
{| class="wide"
| Разработано при поддержке [http://www.fasie.ru/ Фонда содействия развитию МП НТС] в рамках НИОКР 01201066526
| [[Изображение:Logo_FASIE_preview.jpg|200px|rigft]]
|}
{{Category navigation|title=gear|category=gear|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=Автоматизация работы с пакетами|category=Packaging Automation}}
{{Category navigation|title=Автоматизация работы с пакетами|category=Packaging Automation}}
[[Категория:Справочники]]

Текущая версия от 20:43, 22 сентября 2022


Введение в cronbuild.

Некоторые пакеты по своей природе нуждаются в постоянном обновлении, при этом при обновлении у этих пакетов спек практически не меняется. Например, к таким пакетам относятся различные базы - антивирусные, оборудования (foomatic-db, PCI IDs, мониторов, ...), cliparts, и т. д. Как правило, в версии/релизе таких пакетов присутствует timestamp. Система cronbuild предназначена для автоматизации сборки таких пакетов.

Теперь майнтайнеру достаточно один раз настроить для пакета cronbuild и в дальнейшем при появлении обновлений пакет будет автоматически собираться в Сизиф до тех пор, пока сборка не сломается. Сервер cronbuild проверяет пакет на наличие обновлений с заданной майнтайнером периодичностью, по умолчанию это раз в неделю.

При этом пакеты собираются только тогда, когда это действительно нужно: если после обновления файлы исходников не изменились (согласно git diff <commit before update>), то сборка пакета будет пропущена, так как в ней нет необходимости.

Управлять сервисом Cronbuild просто: если нужно внести в пакет какие-то изменения, достаточно внести их локально и отправьть пакет на сборку вручную. При следующей попытке обновления робот склонирует уже измененный репозиторий, т.е. изменения будут подхвачены автоматически.

Быстрая настройка

1. Создать служебный файл .gear/cronbuild-options в gear-репозитории:

echo "cronbuild_mailto=<email мейнтейнера" > .gear/cronbuild-options

2. Закоммитить и собрать пакет с этим файлом

3. Завести багу в https://bugzilla.altlinux.org/enter_bug.cgi?product=Infrastructure на компонент cronbuild. В теме указать имя пакета.

Часто задаваемые вопросы

> Пока я вижу, что cronbuild все еще использует старую версию а не ту, что в моем git.

Да, так и должно быть. cronbuild клонирует последнюю _собранную_в_Сизиф_ сборку, в ваш git он не лезет и не должен, ведь там может быть нестабильная разработка.

Отправьте ваши изменения в Сизиф, тогда cronbuild их подхватит.

Настройка cronbuild

cronbuild состоит из 3-х частей:

  • локальные скрипты cronbuild для автоматизации обновления .git репозитрия.
  • утилиты для локальной сборки (пакет gear-cronbuild)
  • сервер удаленной сборки (cronbuild repocop.altlinux.org)

Для того, чтобы воспользоваться cronbuild, надо написать по примерам скрипт .gear/cronbuild-update-source и, возможно, другие скрипты, проверить их работоспособность с помощью локальных утилит и закоммитить их в .git.

После этого gear-cronbuild можно пользоваться локально, для ускорения работы, а также можно разместить на сервере удаленной сборки.

утилиты для локальной сборки (пакет gear-cronbuild)

Для того, чтобы пользоваться скриптами cronbuild на локальной машине, необходимо установить пакет gear-cronbuild. Команда gear-cronbuild-apply-hooks вызывает локальные скрипты cronbuild и обновляет git репозиторий до следующей версии. Для удобства пользователя есть скрипт-обертка gear-cronbuild, который обновляет репозиторий, собирает пакет, и в случае успеха, коммитит изменения.

скрипт-обертка gear-cronbuild:

#!/bin/sh -ve
gear-cronbuild-apply-hooks
gear "$@"
gear-commit

Настройка cronbuild для автоматизации обновления .git репозитрия

Для работы cronbuild необходимо

  • либо добавить .gear/upstream/remotes и настроить обновления по git tag (см. Gear/remotes.). Рекомендовано для обновления из git репрзитория по тегу.
  • либо добавить в репозиторий .watch файл (см. Watch). Рекомендовано для обновления из версионированного архива на удаленном сайте.
  • либо написать скрипт .gear/cronbuild-update-source, в котором заскриптовать процесс обновления для нестандартных случаев.

обновление до новых версий с помошью файла .gear/upstream/remotes

Если в репозитории присутствует файл .gear/upstream/remotes, то при отсутствии скрипта .gear/cronbuild-update-source утилита gear-cronbuild-apply-hooks запустит утилиту gear-remotes-uscan (см. Gear/remotes.), Если репозиторий корректно настроен на работу с gear-remotes-*, то никаких скриптов для cronbuild создавать не нужно, достаточно .gear/upstream/remotes.

обновление до новых версий с помошью .watch файла

Если в репозитории присутствует .watch файл, то при отсутствии скрипта .gear/cronbuild-update-source утилита gear-cronbuild-apply-hooks запустит связку утилит rpm-uscan + gear-uupdate, см. Watch. Если .watch файл корректный, и стркутура репозитария поддерживается утилитой gear-uupdate, то никаких скриптов для cronbuild создавать не нужно, .watch файла достаточно.

локальные скрипты cronbuild для автоматизации обновления .git репозитрия

Скрипт .gear/cronbuild-update-source и необязательные скрипты-помощники.

Скрипт .gear/cronbuild-update-source пишется индивидуально для каждого пакета. Его задача -- обновить исходные тексты пакета, используя git-fetch, git-svn или просто wget.

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

  • .gear/cronbuild-update-version для установки новой версии и/ли релиза вручную (без него новая версия будет выставлена в ГГГГММДД (ГодМесяцДень)
  • .gear/cronbuild-add-changelog чтобы заменить стандартную фразу cronbuild в %changelog на свою.

Скрипты должны быть помечены как исполняемые. Все скрипты получают спек-файл как первый аргумент.

Внутренняя служебная утилита gear-cronbuild-apply-hooks запускает скрипт .gear/cronbuild-update-source. Если скрипт завершился с ошибкой, обновление останавливается и сообщение об ошибке получает майнтайнер. Если скрипт завершился без ошибок, утилита gear-cronbuild-apply-hooks выполняет

git diff $last_commit_before_the_run

Если в git репозитории изменений не произошло, то обновлений нет и работа gear-cronbuild завершается. Если git diff $last_commit_before_the_run показал изменения, то считается, что обновления есть и работа gear-cronbuild продолжается.

Заметим, что скрипт .gear/cronbuild-update-source не должен трогать спек. Для изменения версии в спек файле предусмотрен скрипт .gear/cronbuild-update-version.

пример скрипта для обновления через wget

Этот скрипт работает в случае, когда исходники публикуются в виде тарбола, а в git репозитарии хранятся в распакованном виде в поддиректории $PKGNAME.

.gear/cronbuild-update-source:

#!/bin/sh -ve
PKGNAME="$(gear --command sh -- -c 'printf %s "$gear_pkg_name"')"
rm -f $PKGNAME-SNAPSHOT.tar.gz
wget -c http://www.pkgname.org/download/pkgname/pkgname-SNAPSHOT.tar.gz
tar xzf $PKGNAME-SNAPSHOT.tar.gz
rm -f $PKGNAME-SNAPSHOT.tar.gz
git rm -r -f $PKGNAME
rm -rf $PKGNAME
mv $PKGNAME-SNAPSHOT $PKGNAME
git add $PKGNAME

замечания к скрипту

  • Если версия не изменилась/исходники не обновлялись, если вы ничего не добавляли в индекс git, просто выходите через exit 0. Иначе перед выходом сначала сбросьте изменения в индексе git с помощью git reset.
  • Удаляйте за собой мусор: временные файлы, каталоги и т.д.
  • скрипт должен сообщать о всех проблемах при обновлении через exit с ненулевым exit_code. Проще всего использовать #!/bin/sh -ve,

иначе придется у каждой команды проверять код завершения.

  • изменения должны быть добавлены в индекс git.
  • не нужно коммитить изменения: git-cronbuild это сделает автоматически после успешной сборки.

Изменение версии/релиза пакета

Утилита gear-cronbuild-update-spec-timestamp автоматически ищет и обновляет timestamp вида ГГГГММДД в тегах Serial, Epoch, Version, Release, либо в декларациях %define <macrosname> <timestamp>. Если пакет использует другую систему нумерации, необходимо создать свой скрипт изменения версии/релиза пакета .gear/cronbuild-update-version. Также можно переопределить стандартный changelog скриптом .gear/cronbuild-add-changelog. В теле этого скрипта должна быть вызвана команда add_changelog с желаемым текстом[1].

сервер удаленной сборки (cronbuild repocop.altlinux.org)

локальные утилиты gear-cronbuild имеют тот недостаток, что их надо не забывать запускать. Кроме того, они не автоматизируют отправку пакета в Сизиф.

Сервер удаленной сборки cronbuild в песочнице repocop.altlinux.org позволяет автоматизировать сборку пакетов полностью.

Как поставить пакет на сборку

Если пакет успешно собирается с помощью gear-cronbuild локально, пришло время поставить его на автоматическую сборку.

Для этого необходимо создать файл .gear/cronbuild-options, указать там желаемую периодичность сборки и e-mail для рассылки оповещений, отправить в сизиф сборку пакета с новым содержимым .gear/cronbuild-options, и зарегистрировать в bugzilla заявку на Infrastructure/cronbuild.

Важно! сервис cronbuild для работы клонирует последнюю успешную сборку пакета в Сизифе. Поэтому важно собрать в сизиф пакет с новыми настройками .gear/cronbuild-options. Изменения локально на рабочей машине майнтайнера, даже опубликованные на git.altlinux.org, без сборки пакета в Сизиф подхвачены не будут!

Как вносить изменения в сборку

сервер сборки поддерживает 2 системы транспорта: сборка по тегу из git+gear репозитория и сборка из srpm.

  • Сборка по тегу из git+gear репозитория.

Управление сборкой устроенно очень просто: сервер клонирует последнюю успешную сборку в Сизиф и применяет к ней gear-cronbuild. Поэтому, если вы хотите починить или улучшить автоматическую сборку, просто соберите пакет вручную, и в дальнейшем автоматическая сборка будет идти на ее основе.

  • сборка из srpm.

считается экспериментальной.

Приложения.

Полный список служебных файлов cronbuild в .gear/

Скрипты, используемые утилитой gear-cronbuild-apply-hooks

файл Описание
cronbuild-update-source Основной скрипт для обновления содержимого пакета.
cronbuild-update-version Скрипт для обновления версии и/ли релиза пакета. Не обязателен.
cronbuild-add-changelog Скрипт для кастомизации changelog. Не обязателен.

Скрипты должны быть помечены как исполняемые.

Скрипты cronbuild-update-source, cronbuild-update-version, cronbuild-add-changelog получают спек-файл как первый аргумент.

Другие файлы, используемые утилитой gear-cronbuild-apply-hooks

файл Описание
.gear/upstream/remotes настройка remotes для клонированного git репозитория. Не обязателен.
.gear/cronbuild-git-config опции к команде git-config, для дополнительной настройки клонированного git репозитория. Устарел.

Файлы, используемые сервером сборки cronbuild repocop.altlinux.org

файл Описание
cronbuild-tagname Скрипт для кастомизации git tag name. Не обязателен.
cronbuild-tagmsg Скрипт для кастомизации git tag message. Не обязателен.
cronbuild-options Конфигурационный файл. Требуется при размещении на сервере cronbuild.

Скрипты должны быть помечены как исполняемые. К файлам конфигурации это не относится.

./gear/cronbuild-options

переменная Описание
cronbuild_requires набор дополнительных пакетов, который будет передан в hsh-install для установки в chroot.

необходим, если скрипты используют утилиты, не входящие в базовый набор (curl, wget, git, unzip, ...)

cronbuild_interval периодичность сборок в днях. Желательно. По умолчанию — 3 дня.
cronbuild_mailto e-mail ответственного. Обязательно.
cronbuild_cc список дополнительных e-mail через запятую. Не обязательно.
(Передается в mutt опцией: -c "$cronbuild_cc")
cronbuild_mastergit experimental
cronbuild_masterbranch experimental

Пример использования .gear/cronbuild-*

Примечания

  1. Для работы механизм обновления секции changelog нужно определить значение %packager в ~/.rpmmacros.
Разработано при поддержке Фонда содействия развитию МП НТС в рамках НИОКР 01201066526 rigft