# Управление проектами

Проекты - это объединения git репозиториев, результат которого - это репозиторий rpm пакетов (подписанный и не подписанный).

Неподписанный репозиторий используется для внутренних сборок, при подключении проекта в другой проект.

Подписанный репозиторий используется для публикации rpm пакетов на внешний сервер (внешний репозиторий).

## Список проектов

![Список проектов пустой](../img/mockgui_project1.png)

![Список проектов](../img/mockgui_projects4.png)

## Создание нового проекта

![Новый проект](../img/mockgui_projects2.png)

* `Название проекта` - уникальное название проекта, оно будет содержаться в названии будущего репозитория, поэтому стоит подходить к названию с умом.
* `Описание` - краткое описание
* `Не публиковать отладочные пакеты и исходные коды` - при установленном флажке в подписанный репозиторий не публикуются пакеты src.rpm, debuginfo, debugsource. Если флажок не установлен, то подписывается и публикуется все. Флажок для проприетарного ПО
* `Добавлять к версии пакетов дату и ID сборки` - при установке данного флажка, все сборки проекта в версии пакета, т.е. все пакеты будут иметь суффикс вида `YYYY-MM-DD_BUILDID`. Т.е. если из гит репозитория из spec файла собирается пакет с версией `0.1-1`, то в таком проекте будет собран пакет с версией `0.1-1.20251010_10`, при слудующей сборке даже без изменения spec файла будет собран пакет с версией `0.1-1.20251010_11` и т.д. Такие проекты удобны для создания тестовых репозиториев, когда не нужны изменения в spec файле, но функционал собираемой программы меняется.
* `Выберите конфигурацию окружения сборки для проекта` - выбирается конфигурация сборки, выбирается один раз при создании проекта и больше потом не меняется. Можно только создать новый проект с другой конфигурацией.

Пример выбора конфигурации. Имеется поле фильтрации.

![Выбор конфигурации](../img/mockgui_projects3.png)

## Информация о проекте

![Проектная информация](../img/mockgui_projects5.png)

`Добавить git репозиторий к проекту` - позволяет добавить к проекту один из существующих git репозиториев.

Необходимо из выпадающего списка выбрать один - нажать кнопку "Добавить".

Тк выглядит добавленный в проект новый git репозиторий.
![Добавленый репозиторий](../img/mockgui_projects5.png)

Пустые репозиторий без исходников добавить в проект нельзя!

`Редактировать конфигурацию сборки` - локальная конфигурация сборочного окружения для mock.

Данный пункт меню позволяет отредактировать корневой файл сборочного окружения.
Здесь условно можно поменять конфигурацию сборки с которой создавался проект, но такой финт лучше не проделывать, особенно если есть уже собранные пакеты.

![Конфигурация сборки](../img/mockgui_projects7.png)

`Добавить внутренний репозиторий из другого проекта` - позволяет связать проекты при сборке, т.е внутренний неподписанный репозиторий одного проекта, становится доступен для сборки текущего. 

![Линк на другой проект](../img/mockgui_projects8.png)

`Добавить бинарный пакет в репозиторий` - позволяет добавить rpm пакет собранный не в текущей сборочной системе в репозиторий. Например, если проект собирается в gitlab в рамках процесса CI/CD и потом может быть добавлен в репозиторий и опубликован.

![Добавление стороннего rpm](../img/mockgui_projects30.png)

Для добавления пакета необходимо или выбрать стандартный каталог, в который будет загружен пакет `Выберите каталог куда будет помещен файл:` или
ввести свое название каталога в поле `Создать новый каталог с именем (может быть пустым, если уже существует нужный каталог):` и в поле загрузки файла выбрать rpm файл.

`Посмотреть список загруженных rpm пакетов` - позволяет получить список пакетов, которые были загруженны через меню `Добавить бинарный пакет в репозиторий`

![Добавление стороннего rpm, просмотр списка пакетов](../img/mockgui_projects31.png)

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

`Список всех пакетов` - список пакетов, собранных для данного проекта (неподписанных пакетов)

![Список пакетов](../img/mockgui_projects20.png)

Отображается структура репозитория, где можно перемещаться по папкам и нажимать на rpm пакеты, получая о них информацию.

`Управление снимками репозитория` - это ссылка настраницу, где можно создать снимок `неопубликоанного` репозитория, восстановить пакеты из сохраненного писка или удалить ранее созданные снимки или посмотреть содержимое снимков.

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

Пример создания и управления снимками.

Так выглядит страница управления снимками:

![Снимки репозитория](../img/mockgui_projects20_1.png)

Слева список снимков, справа - содержимое выбранного снимка.

Пример отображения содержимого:

![Снимки репозитория](../img/mockgui_projects20_2.png)

Напротив каждого снимка есть занчок "Корзина" и "Стрелочка". Нажимая на корзинку - можно удалить снимок, а на жимая на стрелочку - восстановить пакеты из снимка. При восстановлении, пакеты из неподписанного репозитория удаляются и заменяются пакетами из снимка. Далее их можно переподписать и они переместятся в репозиторий с подписанными пакетами.

Для создания снимка необхоимо нажать на знак "+".

Важно отметить, что для создания, удаления или восстановления снимка открывается дополнительный экран:

![Снимки репозитория](../img/mockgui_projects20_3.png)

Для подтвержения действия недостаточно только нажать на кнопку "Создать", "Удалить", "Восстановить". Важно еще сделать активным флажок.

Этот флажок подтверждает действие окончательно. Если его не установить, то ничего не произойдет и операция не будет выполнена.

`Список сборок проектов` - отображается список сборок, принадлежащих проекту.

В данном списке можно получить информацию о каждой сборке. Детальнее о [сборках](builds.md)

`Подписать` - подписать gpg ключом файлы репозитория проекта и опубликовать их в отдельном репозитории

Как происходит подпись:

![Подпись](../img/mockgui_projects25.png)

Подписывание требует наличие gpg ключей в папке keys.

Данные ключи создаются при [установке](../install.md) скриптом ./install-key из папки `gen-scripts`

Параметры запуска:

```shell
cd gen-scripts
./install-key UserName UserEmail 316224000 StrongSignPassword
```

* UserName - это имя владельца ключа
* UserEmail - почта владельца ключа
* 316224000 - число секунд жизни ключа. Высчитывается по формуле: пусть нужен ключ на 2 года значит число будет: 2 * 366 * 24 * 60 * 60 = 63244800, а 316224000 = 10 лет
* StrongSignPassword - пароль для ключа

В результате будет сгенерирован gpg ключ приватный и публичный в папке keys, желательно не потерять их.

`Просмотр подписанного репозитория` - после подписи в проекте появится подписанный репозиторий с пакетами и сгенерированным файлом repoview. Т.е в таком виде как репозиторий будет выглядеть при публикации в интернете.

![Подписанный репозиторий](../img/mockgui_projects26.png)

`Установить адрес подписанного репозитория` - установить адрес подписанного репозитория, т.е установить url, данная информация необходима для корректного формирования шапки:

```shell
echo -e "[project_test1]
name=project_test1
baseurl=https://test.repo.tst/repo1/
enabled=1
gpgkey=https://test.repo.tst/repo1/project_test1-gpg-key
gpgcheck=1" > /etc/yum.repos.d/project_test1.repo
```

т.е устанавливается корректный url будущего удаленного репозитория.

`Удалить старые версии пакетов` - позволяет подчистить накопившиеся старые версии пакетов, остаются только заданное число самых свежив версий.
При нажатии, так же нужно подтвердить намерение удаления и указать, число версий пакета, которые должны быть оставлены. Но нужно быть аккуратным, например некоторые пакеты требуют наличие более старых версий при сборке.
Именно для этого, перед удалением выдается сисок всех пакетов, которые планируются к удалению. И в данном списке можно отменить удаление отдельных пакетов.



`Удалить проект` - удаляется весь проект, подписанные и неподписанные репозитории, сборки.

Но если проект залинкован в другом проекте, то удаление будет невозможным, пока не будет снят линк.

![Пример удаления](../img/mockgui_projects27.png)

Для удаления - нужно перевести в активное состояние флажок и нажать кнопку "Удалить".
Без установки флажка - удаление не произойдет. Такая защита от случайного удаления.

### Список действий над репозиторием проекта

Напротив каждого git репозитория, добавленного в проект есть список действий:

![Расширенный список действий](../img/mockgui_list2.png)

Слева направо:
* удалить git репозиторий из проекта (при этом rpm пакеты в проекте, сборки - остаются)
* обновить исходники проекта - если такой значок появился, значит в git репозиторий в ветку master были внесены изменения и в текущем проекте неактуальные исходники. Когда исходники актуальны список действий выглядит так:

![](../img/mockgui_list1.png)

* запустить сборку - запускается сборка проекта в фоне. Отображается страница, которая обновляется каждые 5 секунд (обновление можно остановить или запустить опять)

![Сборка проекта](../img/mockgui_projects10.png)

Во время сборки отображается лог файл процесса сборки. Результат сборки можно посмотреть на странице [сборки](builds.md)

* указать файл spec для проекта и git репозитория - если в гит репозитории несколько spec файлов, то будет подхватываться первый попавшийся файл, чтоб избежать такого поведения можно точно указать какой файл использовать

![Установка spec файла](../img/mockgui_projects9.png)

* отобразить список сборок для проекта и текущего git репозитория

* в последней версии MockGUI появился дополнительный значек - задать нестандартную/кастомную сборку

![Расширенный список действий](../img/mockgui_list10.png)

Данный значек позволяет изменить процедуру сборки. На текущий момент, существуюи множестов систем сборки rpm пакетов, а так же проекты, которые собирают проект в docker без создания src.rpm файла, что затрудняет сборку с помощью mock который требует spec файл и подготвленные исходные файлы.
Елсли же проект собирается в докере и при завершении сборки может предоставить rpm файлы, то такой проект можно собрать с помощью кастомной сборки, пример такого проекта представлен ниже.

![Кастомная сборка](../img/mockgui_custombuild1.png)

Такой репозиторий добавлеятся как обычно, но потом на против репозитория необходимо нажать на значек `молоток`, откроется форма ввода:

![Кастомная сборка](../img/mockgui_custombuild2.png)

В открывшемся окне необходимо ввести имя скрипта, он будет создан в момент сборки и не должен совпадать с именем существующих файлов в проекте.
Так же необходимо ввести описание скрипта и непосредственнос сам код скрипта.

Для примера:

```
#!/bin/bash

RESULT="$1"
if [ -z "$RESULT" ]; then
	exit 1
fi

bash -x package_preparer.sh prepare "almalinux:9"

cp -r tmpbuild/*.* "${RESULT}/"
```

В первом параметре скрипту передается каталог, куда нужно сохранять собранные rpm пакеты и логи. Система из автоматом подхватит и положит в репозиторий.
Единственно важное замечание, данный скрипт работает в реальной сборочной системе, оэтому все что он сделает, затронет реальную систему, скрипт работает не в изоляции. Поэтому рекомендуется в скрипте запускать Docker контейнер и все манипуляции производить в контейнере и по завершению манипуляций удалять контейнер.

Поэтому для поддержки такой опции в проекте есть скрипт установки Docker, для его запуска необходимо выполнить команду из корня проекта:

```
ansible-playbook install/docker_install.yml --ask-become-pass
```

Для того, чтоб проект отвязать от кастомной сборки, нужно на странице кастомной сборки нажать кнопку `Удалить` и в появившемся подтверждающем окне ввести имя скрипта, для подтверждения удаления. После этого гит проект будет отвязан он кастомной сборки и будет собираться в mock.

Если нажать на имя git репозитория в списке, то можно просмотреть его содержимое, т.е список файлов:

![Список файлов репозитория](../img/mockgui_projects14.png)