Сборка пакетов start: различия между версиями
Garrett (обсуждение | вклад) Нет описания правки |
|||
(не показана 71 промежуточная версия 2 участников) | |||
Строка 1: | Строка 1: | ||
{{Note|В примере будет участник '''Petya Ivanov''' с email - '''petyaivanov@altlinux.org''' и именем пользователя '''petr'''}} | {{Note|В примере будет участник '''Petya Ivanov''' с email - '''petyaivanov@altlinux.org''' и именем пользователя '''petr'''}} | ||
Строка 12: | Строка 10: | ||
Для работы с git-репозиториями ALT нужен будет SSH-ключ, который нужно сгенерировать. Его можно создать согласно инструкции с [[Работа_с_ключами_разработчика|этой страницы]]. | Для работы с git-репозиториями ALT нужен будет SSH-ключ, который нужно сгенерировать. Его можно создать согласно инструкции с [[Работа_с_ключами_разработчика|этой страницы]]. | ||
$ ssh-keygen -t ED25519 | $ ssh-keygen -t ED25519 | ||
{|class="wikitable mw-collapsible mw-collapsed" style="float:center; margin-left:2em" | {|class="wikitable mw-collapsible mw-collapsed" style="float:center; margin-left:2em" | ||
Строка 18: | Строка 16: | ||
|- | |- | ||
| | | | ||
$ ssh-keygen -t ED25519 | $ ssh-keygen -t ED25519 | ||
Generating public/private ED25519 key pair. | Generating public/private ED25519 key pair. | ||
'''Enter file in which to save the key (/home/petr/.ssh/id_ed25519)''':''// Указывается место сохранения открытого и закрытого ключей (в скобках указан путь по-умолчанию) Жмем {{Button|Enter}}'' | '''Enter file in which to save the key (/home/petr/.ssh/id_ed25519)''':''// Указывается место сохранения открытого и закрытого ключей (в скобках указан путь по-умолчанию) Жмем {{Button|Enter}}'' | ||
Строка 108: | Строка 106: | ||
В ALT Linux для сборки есть два инструмента. | В ALT Linux для сборки есть два инструмента. | ||
* [[Hasher]] - для сборки в изолированном окружении. | * [[Hasher]] - для сборки в изолированном окружении [[chroot]]. | ||
В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке). | В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке). | ||
Если какой-то пакет, необходимый для сборки, не указан в спеке, то появится ошибка. Так обеспечивается | Если какой-то пакет, необходимый для сборки, не указан в спеке, то появится ошибка. Так обеспечивается воспроизводимость сборки. | ||
Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой новой сборке в Hasher. | Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой новой сборке в Hasher. | ||
Строка 123: | Строка 121: | ||
=== Установка инструментов для сборки === | === Установка инструментов для сборки === | ||
Для сборки пакетов нам понадобятся: | Для сборки пакетов нам понадобятся: | ||
* Любой удобный текстовый редактор (Vim, Emacs, | * Любой удобный текстовый редактор (Vim, Emacs, mcedit); | ||
* Система управления версиями '''Git''' | * Система управления версиями '''Git''' | ||
* Сборочная среда '''Hasher''' | * Сборочная среда '''Hasher''' | ||
Строка 129: | Строка 127: | ||
* Утилиты RPM для сборки пакетов | * Утилиты RPM для сборки пакетов | ||
* Инструменты для сборки программ: gcc, make, python, patch. | * Инструменты для сборки программ: gcc, make, python, patch. | ||
* Утилита для импорта проектов с Github | |||
* Доступ к [[Branches|репозиторию пакетов]] | * Доступ к [[Branches|репозиторию пакетов]] | ||
Установка: | Установка: | ||
# apt-get install mc git hasher hasher-priv gear gcc make python patch rpmdevtools rpm-utils rpm-build rpmlint rpm-build-licenses | # apt-get install mc git hasher hasher-priv gear gcc make python patch rpmdevtools rpm-utils rpm-build rpmlint rpm-build-licenses github2spec | ||
===Настройка Git=== | ===Настройка Git=== | ||
Строка 161: | Строка 160: | ||
<source lang=bash> | <source lang=bash> | ||
$ gpg --list-secret-keys | |||
------------------------------ | ------------------------------ | ||
sec 1024D/835560D9 2023-05-15 | sec 1024D/835560D9 2023-05-15 | ||
Строка 187: | Строка 186: | ||
Добавление пользователя petr в группу hashman | Добавление пользователя petr в группу hashman | ||
</pre> | </pre> | ||
====Создание конфигурационного | ====Создание конфигурационного файла==== | ||
Так же необходимо создать пользователю в домашнем каталоге файл {{path|.hasher/config}}: | Так же необходимо создать пользователю в домашнем каталоге файл {{path|.hasher/config}}: | ||
$ mkdir ~/.hasher | $ mkdir ~/.hasher | ||
$ | $ mcedit ~/.hasher/config | ||
Вставляем в файл следующее содержимое: | |||
packager="'''Petya Ivanov <petyaivanov@altlinux.org>'''" | |||
USER='''petr''' | |||
#workdir="/tmp/.private/petr/" | |||
workdir="$HOME/hasher" | |||
target='''x86_64''' | |||
packager="`rpm --eval %packager`" | |||
#apt_config="$HOME/.hasher/apt.conf" | |||
mount=/dev/pts,/proc | |||
Тут смотрите на строки с командами: | Тут смотрите на строки с командами: | ||
*''' | *'''packager ...''' - тут должны быть ваше имя и email | ||
*''' | *''''USER=petr'''' - тут должно быть ваше имя пользователя, которое вы завели в '''hasher-useradd''' | ||
*'''target''' - тут должна быть архитектура, под которую будут собираться пакеты, '''i586''' или '''x86_64''' | *'''target''' - тут должна быть архитектура, под которую будут собираться пакеты, '''i586''' или '''x86_64''' | ||
*'''workdir''' - временная папка. '''/tmp''' - обозначает, что данные будут загружаться в [[tmpfs]] (в оперативную память) и, соответственно, собираться быстрее. Если у вас не так много оперативной памяти, укажите локальный каталог, например '''$HOME/hasher''' | |||
====Инициализация окружения Hasher==== | ====Инициализация окружения Hasher==== | ||
{{Note|Данную команду нужно выполнять после ре-логина или перезагрузки}} | {{Note|Данную команду нужно выполнять после ре-логина или перезагрузки}} | ||
$ hsh -v --initroot-only | {{Note|Если вы указали использовать вместо оперативной памяти каталог на жестком диске, проверьте, существует ли данный каталог, и если его нет создайте его командой {{cmd|mkdir ~/hasher}}}} | ||
$ hsh -v --initroot-only | |||
{{Note|[[Hasher/FAQ|FAQ по Hasher]]}} | |||
<!--===Настройка Gear=== | |||
--> | |||
===Настройка окружения RPM=== | ===Настройка окружения RPM=== | ||
Для настройки сборки RPM-пакетов (чтобы указать в них кто собрал данный пакет и подпись разработчика) нужно создать в домашнем каталоге файл .rpmmacros. | Для настройки сборки RPM-пакетов (чтобы указать в них кто собрал данный пакет и подпись разработчика) нужно создать в домашнем каталоге файл .rpmmacros. | ||
Отредактируйте файл ~/.rpmmacros (конечно, заменив ключ и имя мейнтейнера на свои): | |||
<source lang=bash> | <source lang=bash> | ||
$ | $ mcedit ~/.rpmmacros | ||
</source> | |||
<source lang=bash> | |||
"%packager Petya Ivanov <petyaivanov@altlinux.org>" | |||
"%_gpg_name 1B40E49FD40245D0472E4C5FD9528003835560D9" | |||
</source> | </source> | ||
Строка 234: | Строка 246: | ||
=Виды сборки пакетов= | =Виды сборки пакетов= | ||
==Создание пакета с нуля== | ==Создание пакета с нуля== | ||
Для примера мы попробуем собрать утилиту [https:// | Для примера мы попробуем собрать утилиту [https://ftp.gnu.org/gnu/hello/ Hello]. | ||
=== Подготовка репозитория Git === | === Подготовка репозитория Git === | ||
Первым делом нужно создать Git-репозиторий для нужного пакета. Для этого мы создадим каталог и инициализируем в нем git-репозиторий. | Первым делом нужно создать Git-репозиторий для нужного пакета. Для этого мы создадим каталог и инициализируем в нем git-репозиторий. | ||
$ mkdir | $ mkdir hello | ||
$ cd | $ cd hello | ||
hello$ git init . | |||
Наш каталог: | Наш каталог: | ||
home | home | ||
└── | └── hello <- Мы сейчас здесь | ||
└── .git <- Служебный каталог Git | └── .git <- Служебный каталог Git | ||
=== Написание .gear/rules === | === Написание .gear/rules === | ||
В созданной папке | В созданной папке hello создаем каталог .gear и в нем файл rules: | ||
hello$ mkdir .gear | |||
hello$ cd .gear | |||
.gear$ mcedit rules | .gear$ mcedit rules | ||
Наполняем файл | Наполняем файл следующей строкой и сохраняем его: | ||
{{Note|В более сложных пакетах используется конструкция вида <code><nowiki>tar.gz: . name=hello base=hello</nowiki></code>}} | |||
tar.gz: hello | |||
* | *Указанная строка {{path|tar.gz:hello}} указывает, что будет создан архив с нашим каталогом hello. | ||
Наш каталог: | Наш каталог: | ||
home | home | ||
└── | └── hello | ||
├── .gear <- Мы сейчас здесь | ├── .gear <- Мы сейчас здесь | ||
│ └── rules <- Мы создали этот файл | │ └── rules <- Мы создали этот файл | ||
Строка 265: | Строка 276: | ||
=== Импорт исходного кода === | === Импорт исходного кода === | ||
Исходный код | Исходный код Hello лежит на FTP: [https://ftp.gnu.org/gnu/hello/ https://ftp.gnu.org/gnu/hello/]. | ||
Выходим из папки .gear в каталог выше и клонируем в него исходный код. | Выходим из папки .gear в каталог выше и клонируем в него исходный код. | ||
.gear$ cd .. | .gear$ cd .. | ||
hello$ wget https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz | |||
hello$ tar xzvf hello-2.10.tar.gz | |||
hello$ rm hello-2.10.tar.gz | |||
Наш каталог: | Наш каталог: | ||
home | home | ||
└── | └── hello <- Мы сейчас здесь | ||
├── | ├── hello-2.10 <- Мы распаковали исходный код программы сюда | ||
├── .gear | ├── .gear | ||
└── .git | └── .git | ||
{{Note|Т.к. для Hasher-а нужно, чтобы имя пакета в spec-е и имя репозитория совпадали (а пакет у нас будет называться hello, а не hello-2.10), мы переименуем каталог с исходным кодом в соответствии с именем пакета}} | |||
hello$ mv hello-2.10 hello | |||
=== Написание спека === | === Написание спека === | ||
Строка 283: | Строка 298: | ||
Создадим в каталоге, где мы собираемся собирать программу этот файл. | Создадим в каталоге, где мы собираемся собирать программу этот файл. | ||
hello$ mcedit hello.spec | |||
Добавляем в файл следующие строки: | Добавляем в файл следующие строки: | ||
Строка 296: | Строка 309: | ||
<syntaxhighlight lang="spec"> | <syntaxhighlight lang="spec"> | ||
#Название пакета | #Название пакета | ||
Name: | Name: hello | ||
#Версия программы | #Версия программы | ||
Version: | Version: 2.10 | ||
#Номер сборки в текущем бранче | #Номер сборки в текущем бранче | ||
Release: alt1 | Release: alt1.1 | ||
Summary: GNU hello, THE greeting printing program | |||
#Группа в меню ([[Ярлычки_программ#Категории|см. здесь]]) | |||
Group: Development/C | |||
#Лицензия | #Лицензия | ||
License: | License: GPLv3+ | ||
#Сайт программы | #Сайт программы | ||
Url: ftp://ftp.gnu.org/gnu/hello/ | |||
Source: %name-%version.tar.gz | |||
# explicitly added texinfo for info files | |||
#Зависимость для сборки | |||
BuildRequires: texinfo | |||
#Описание на английском | #Описание на английском | ||
%description | %description | ||
The GNU `hello' program produces a familiar, friendly greeting. It | |||
allows nonprogrammers to use a classic computer science tool which | |||
would otherwise be unavailable to them. Because it is protected by the | |||
GNU General Public License, users are free to share and change it. | |||
# | #Команды сборки | ||
%prep | %prep | ||
%setup | %setup -a0 | ||
%build | %build | ||
% | %autoreconf | ||
%configure | |||
%make_build | |||
%install | %install | ||
% | %makeinstall | ||
%find_lang %name | |||
%files | %files -f %name.lang | ||
% | %doc AUTHORS ChangeLog ChangeLog.O NEWS README THANKS TODO | ||
%doc %name-%version | |||
%_bindir/* | |||
%_infodir/* | |||
%_mandir/man?/* | |||
#История изменений | #История изменений | ||
%changelog | %changelog | ||
* Mon Oct | * Thu Dec 03 2015 Igor Vlasenko <viy@altlinux.ru> 2.10-alt1.1 | ||
- | - NMU: added BR: texinfo | ||
* Mon Nov 17 2014 Fr. Br. George <george@altlinux.ru> 2.10-alt1 | |||
- Autobuild version bump to 2.10 | |||
- Use autoreconf for educational purpose | |||
- Add full source tree in documentation | |||
* Thu Apr 17 2014 Fr. Br. George <george@altlinux.ru> 2.9-alt1 | |||
- Autobuild version bump to 2.9 | |||
* Mon Apr 15 2013 Dmitry V. Levin (QA) <qa_ldv@altlinux.org> 2.4-alt2.qa1 | |||
- NMU: rebuilt for debuginfo. | |||
* Thu May 21 2009 Andrey Rahmatullin <wrar@altlinux.ru> 2.4-alt2 | |||
- remove obsolete %%{,un}install_info calls | |||
* Sat Dec 13 2008 Andrey Rahmatullin <wrar@altlinux.ru> 2.4-alt1 | |||
- 2.4 | |||
* Wed Aug 15 2007 Andrey Rahmatullin <wrar@altlinux.ru> 2.3-alt1 | |||
- 2.3 | |||
* Thu Feb 15 2007 Andrey Rahmatullin <wrar@altlinux.ru> 2.2-alt1 | |||
- 2.2 | |||
* Thu Oct 23 2003 Andrey Rahmatullin <wrar@altlinux.ru> 2.1.1-alt1 | |||
- initial build | |||
</syntaxhighlight> | </syntaxhighlight> | ||
|} | |} | ||
Строка 359: | Строка 402: | ||
| | | | ||
<syntaxhighlight lang="spec"> | <syntaxhighlight lang="spec"> | ||
Name: | Name: hello | ||
Version: | Version: 2.10 | ||
Release: alt1 | Release: alt1.1 | ||
Summary: GNU hello, THE greeting printing program | |||
Group: | Group: Development/C | ||
License: GPLv3+ | |||
Url: | Url: ftp://ftp.gnu.org/gnu/hello/ | ||
Source: %name-%version.tar.gz | |||
# explicitly added texinfo for info files | |||
BuildRequires | BuildRequires: texinfo | ||
%description | %description | ||
The GNU `hello' program produces a familiar, friendly greeting. It | |||
allows nonprogrammers to use a classic computer science tool which | |||
would otherwise be unavailable to them. Because it is protected by the | |||
GNU General Public License, users are free to share and change it. | |||
%prep | %prep | ||
%setup | %setup -a0 | ||
%build | %build | ||
% | %autoreconf | ||
%configure | |||
%make_build | |||
%install | %install | ||
% | %makeinstall | ||
%find_lang %name | |||
%files | %files -f %name.lang | ||
% | %doc AUTHORS ChangeLog ChangeLog.O NEWS README THANKS TODO | ||
%doc %name-%version | |||
%_bindir/* | |||
%_infodir/* | |||
%_mandir/man?/* | |||
%changelog | %changelog | ||
* Mon | * Thu Dec 03 2015 Igor Vlasenko <viy@altlinux.ru> 2.10-alt1.1 | ||
- | - NMU: added BR: texinfo | ||
* Mon Nov 17 2014 Fr. Br. George <george@altlinux.ru> 2.10-alt1 | |||
- Autobuild version bump to 2.10 | |||
- Use autoreconf for educational purpose | |||
- Add full source tree in documentation | |||
* Thu Apr 17 2014 Fr. Br. George <george@altlinux.ru> 2.9-alt1 | |||
- Autobuild version bump to 2.9 | |||
* Mon Apr 15 2013 Dmitry V. Levin (QA) <qa_ldv@altlinux.org> 2.4-alt2.qa1 | |||
- NMU: rebuilt for debuginfo. | |||
* Thu May 21 2009 Andrey Rahmatullin <wrar@altlinux.ru> 2.4-alt2 | |||
- remove obsolete %%{,un}install_info calls | |||
* Sat Dec 13 2008 Andrey Rahmatullin <wrar@altlinux.ru> 2.4-alt1 | |||
- 2.4 | |||
* Thu Oct | * Wed Aug 15 2007 Andrey Rahmatullin <wrar@altlinux.ru> 2.3-alt1 | ||
- | - 2.3 | ||
* Thu Feb 15 2007 Andrey Rahmatullin <wrar@altlinux.ru> 2.2-alt1 | |||
- 2.2 | |||
* Thu Oct 23 2003 Andrey Rahmatullin <wrar@altlinux.ru> 2.1.1-alt1 | |||
- initial build | |||
</syntaxhighlight> | </syntaxhighlight> | ||
|} | |} | ||
Строка 407: | Строка 475: | ||
Наш каталог: | Наш каталог: | ||
home | home | ||
└──hello <- Мы сейчас здесь | |||
├── | ├── hello <- В прошлом шаге мы переименовали каталог с исходным кодом для совпадения имени репы исходного кода и пакета | ||
├── | ├── hello.spec <- Файл спека, который мы создали | ||
├── .gear | ├── .gear | ||
└── .git | └── .git | ||
Строка 416: | Строка 484: | ||
После того, как мы внесли код, спек и настроили хэшер, внесенные изменения надо внести в Git. | После того, как мы внесли код, спек и настроили хэшер, внесенные изменения надо внести в Git. | ||
Для этого переходим в каталог | Для этого переходим в каталог hello, в котором мы находились в предыдущем шаге и вносим коммит: | ||
$ git add . | |||
$ git commit -am "Initial commit" | $ git commit -am "Initial commit" | ||
=== Сборка в Hasher === | === Сборка в Hasher === | ||
Чтобы собрать пакет в Hasher перейдите в корневой каталог проекта и выполните команду: | Чтобы собрать пакет в Hasher перейдите в корневой каталог проекта и выполните команду: | ||
$ | $ gear --hasher -- hsh --no-sisyphus-check -v | ||
Для пересборки пакета (в случае исправления опечатки или ещё каких-то изменений без изменения зависимостей) пакет можно пересобрать командами: | |||
$ gear --hasher -- hsh-rebuild --no-sisyphus-check -v | |||
=== Отправка в git.alt === | === Отправка в git.alt === | ||
<...> | |||
==Создание пакета на основе существующего== | |||
===Создание нового пакета на основе существующего=== | |||
Например, в Git-репозитории ALT Linux уже есть утилитка Hello, которая подойдет для начинающих сборщиков пакетов. | |||
https://git.altlinux.org/gears/h/hello.git. | |||
==== Подготовка Git-репозитория ==== | |||
Первым делом нужно создать Git-репозиторий для этого пакета. Для этого мы создадим каталог и склонируем в него git-репозиторий. | |||
$ mkdir MyRepos | |||
$ cd MyRepos | |||
MyRepos$ git clone https://git.altlinux.org/gears/h/hello.git | |||
Наш каталог: | |||
home | |||
└── MyRepos <- Мы сейчас здесь | |||
└── hello <- Склонированный репозиторий Git | |||
Перейдем в каталог репозитория: | |||
$ cd hello | |||
==== Содержимое репозитория ==== | |||
hello | |||
├── .gear | |||
├── .git | |||
├── hello | |||
└── hello.spec | |||
====Проверка .gear/rules==== | |||
Перейдем в каталог .gear | |||
hello$ cd .gear | |||
hello | |||
├── .gear <- Мы сейчас здесь | |||
│ └── rules <- Смотрим этот файл | |||
├── .git | |||
├── hello | |||
└── hello.spec | |||
.gear$ cat rules | |||
tar.gz: hello | |||
Правило {{cmd|tar.gz: hello}}, указывает, что каталог hello упаковывается в hello.tar.gz. | |||
====Сборка==== | |||
Переходим в каталог выше: | |||
.gear$ cd .. | |||
hello <- Мы сейчас здесь | |||
├── .gear | |||
├── .git | |||
├── hello | |||
└── hello.spec | |||
И запускаем сборку: | |||
$ gear --hasher -- hsh --no-sisyphus-check -v | |||
====Готовый пакет==== | |||
Готовый пакет расположен по адресу: | |||
{{path|/home/user/hasher/repo/x86_64/RPMS.hasher}} | |||
== | ==="Воскрешение" "умершего" пакета=== | ||
==Сборка пакета из srcrpm== | ==Сборка пакета из srcrpm== | ||
Строка 447: | Строка 574: | ||
Сборка осуществляется командой: | Сборка осуществляется командой: | ||
$ hsh --no-sisyphus-check -v ~/hasher '/home/user/Загрузки/hello-2.10-alt1.1.src.rpm' | |||
====Готовый пакет==== | |||
Готовый <nowiki>*</nowiki>.rpm-пакет расположен по адресу: | |||
{{path|/home/user/hasher/repo/x86_64/RPMS.hasher}} | |||
Его можно установить командой: | |||
# rpm -Uvh hello-2.10-alt1.1.rpm | |||
=Некоторые команды= | |||
==Пересобрать пакет без пересборки окружения== | |||
gear --hasher -- hsh-rebuild | |||
==Войти в chroot сборки== | |||
hsh-shell | |||
=Глоссарий= | =Глоссарий= | ||
*'''Gear''' - инструмент, позволяющий оперируя данными из git репозитория проводить сборку исходного текста в rpm пакет,тарболл или просто экспортировать результаты | *'''Gear''' - инструмент, позволяющий оперируя данными из git репозитория проводить сборку исходного текста в rpm пакет, тарболл или просто экспортировать результаты выполнения правил (gear-rules) в определённый каталог. | ||
*'''Git''' - консольная утилита, для отслеживания и ведения истории изменения файлов, в проекте. Она отслеживает и фиксирует изменения в файлах и сохраняет их в специальных "снимках" - коммитах. | *'''Git''' - консольная утилита, для отслеживания и ведения истории изменения файлов, в проекте. Она отслеживает и фиксирует изменения в файлах и сохраняет их в специальных "снимках" - коммитах. | ||
*'''Hasher''' - инструмент безопасной и воспроизводимой сборки пакетов. Все пакеты Sisyphus собираются с его помощью. | *'''Hasher''' - инструмент безопасной и воспроизводимой сборки пакетов. Все пакеты Sisyphus собираются с его помощью. | ||
Строка 461: | Строка 599: | ||
*'''Исходный код''' - часть программного обеспечения, с которой программисты работают, чтобы изменить работу приложения или добавить новые функции. | *'''Исходный код''' - часть программного обеспечения, с которой программисты работают, чтобы изменить работу приложения или добавить новые функции. | ||
*'''Патч (Patch)''' - программное средство, используемое для устранения проблем в программном обеспечении или изменения его функциональности | *'''Патч (Patch)''' - программное средство, используемое для устранения проблем в программном обеспечении или изменения его функциональности | ||
*'''Спек (Spec)''' - файл содержащий инструкции для программы rpmbuild, необходимые для сборки пакета. | *'''Спек (Spec)''' - файл, содержащий инструкции для программы rpmbuild, необходимые для сборки пакета. | ||
=Источники= | =Источники= | ||
Строка 473: | Строка 611: | ||
*[[Join/Environment]] | *[[Join/Environment]] | ||
*[[Собираем в Hasher]] | *[[Собираем в Hasher]] | ||
*[[Технология сборки пакетов RPM]] | |||
*[[Hasher/Краткое_руководство]] | |||
{{Category navigation|title=Начинающему разработчику|category=Начинающему разработчику|sortkey={{SUBPAGENAME}}}} | |||
[[Категория:Сборка пакетов]] |
Текущая версия от 17:13, 30 августа 2024
Подготовка
Генерация ключей
Для доступа к инфраструктуре ALT Linux нужны два открытых ключа: SSH и GPG. SSH ключ будет обеспечивать защищенное подключение к ресурсам ALT Linux Team, а GPG необходим для подписи пакетов.
SSH
Для работы с git-репозиториями ALT нужен будет SSH-ключ, который нужно сгенерировать. Его можно создать согласно инструкции с этой страницы.
$ ssh-keygen -t ED25519
Генерация ключа проходит следующим образом: |
---|
$ ssh-keygen -t ED25519
Generating public/private ED25519 key pair.
Enter file in which to save the key (/home/petr/.ssh/id_ed25519):// Указывается место сохранения открытого и закрытого ключей (в скобках указан путь по-умолчанию) Жмем Enter
Enter passphrase (empty for no passphrase): // Вводим пароль от ключа
Enter same passphrase again: // Повторяем пароль
Your identification has been saved in /home/petr/.ssh/id_ed25519. // Путь закрытого ключа
Your public key has been saved in /home/petr/.ssh/id_ed25519.pub. // Путь открытого ключа
The key fingerprint is:
SHA256:hWKLApBzHoGmrl/jG8E92WzrDqFZ6jTUsHZP+G6A440 petr@alt-petr
The key's randomart image is:
+--[ED25519 256]--+
|.o.. |
|=.o . |
|++ .. o . . |
|.... B B . |
|. . B.@ S |
| . +oB.B . |
|. .X+..+ |
|. =E+.+. |
| .. +. o+ |
+----[SHA256]-----+
|
Публичная часть ключа — файл ~/.ssh/id_ed25519.pub.
GPG-ключ
Для подписи пакетов нужна открытая часть ключа. Следующими командами мы сгенерируем GPG-ключ и экспортируем в файл gpgkey.pub открытую часть.
$ gpg --gen-key $ gpg --armor --export petyaivanov@altlinux.org > gpgkey.pub
Генерация ключа проходит следующим образом: |
---|
$ gpg --gen-key Выберите тип ключа: (1) RSA и RSA (по умолчанию) (2) DSA и Elgamal (3) DSA (только для подписи) (4) RSA (только для подписи) Ваш выбор? 1 длина ключей RSA может быть от 1024 до 4096 бит. Какой размер ключа Вам необходим? (2048) 4096 Запрошенный размер ключа - 4096 бит Выберите срок действия ключа. 0 = без ограничения срока действия <n> = срок действия - n дней <n>w = срок действия - n недель <n>m = срок действия - n месяцев <n>y = срок действия - n лет Срок действия ключа? (0) Срок действия ключа не ограничен Все верно? (y/N) y Для идентификации Вашего ключа необходим ID пользователя. Программа создаст его из Вашего имени, комментария и адреса электронной почты в виде: "Baba Yaga (pensioner) <yaga@deepforest.ru>" Ваше настоящее имя: Petya Ivanov Адрес электронной почты: petyaivanov@altlinux.org Комментарий: community member Вы выбрали следующий ID пользователя: "Petya Ivanov (community member) <petyaivanov@altlinux.org>" Сменить (N)Имя, (C)Комментарий, (E)адрес или (O)Принять/(Q)Выход? O Для защиты секретного ключа необходима фраза-пароль. //тут вводится фраза-пароль Необходимо сгенерировать много случайных чисел. Желательно, чтобы Вы выполняли некоторые другие действия (печать на клавиатуре, движения мыши, обращения к дискам) в процессе генерации; это даст генератору случайных чисел больше возможностей получить достаточное количество энтропии. .............+++++ ........+++++ ..ll.....,..t.h..h.t.h.hm.t.h..to.m.pt.m..m.p+++++ m+++++ gpgpg: /home/petr/.gnupg/trustdb.gpg: создана таблица доверия gpg: ключ 53DE950D помечен как абсолютно доверенный. открытый и секретный ключи созданы и подписаны. gpg: проверка таблицы доверия gpg: требуется 3 с ограниченным доверием, 1 с полным, модель доверия PGP gpg: глубина: 0 верных: 1 подписанных: 0 доверие: 0-, 0q, 0n, 0m, 0f, 1u pub 4096R/53DE950D 2023-10-06 Отпечаток ключа = 57C3 4384 526A F344 424C 30C0 A0DC 9D85 53DE 950D uid Petya Ivanov (community member) <petyaivanov@altlinux.org> sub 4096R/D32A2F02 2023-10-06 |
Инструменты для сборки
В ALT Linux для сборки есть два инструмента.
В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке).
Если какой-то пакет, необходимый для сборки, не указан в спеке, то появится ошибка. Так обеспечивается воспроизводимость сборки.
Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой новой сборке в Hasher.
- Gear - для сборки пакетов из репозитория Git.
В этом случае все файлы лежат в распакованном виде и в src.rpm упаковываются по правилам, определённым в .gear/rules.
Это позволяет работать сразу с содержимым, быстро делать патчи, вести историю изменений и обмениваться изменениями при коллективной разработке.
Установка инструментов для сборки
Для сборки пакетов нам понадобятся:
- Любой удобный текстовый редактор (Vim, Emacs, mcedit);
- Система управления версиями Git
- Сборочная среда Hasher
- Инфраструктура Gear
- Утилиты RPM для сборки пакетов
- Инструменты для сборки программ: gcc, make, python, patch.
- Утилита для импорта проектов с Github
- Доступ к репозиторию пакетов
Установка:
# apt-get install mc git hasher hasher-priv gear gcc make python patch rpmdevtools rpm-utils rpm-build rpmlint rpm-build-licenses github2spec
Настройка Git
Чтобы у нашего Git-репозитория была идентификация, что именно мы занимаемся сборкой пакетов, его нужно настроить.
Следующими командами мы, для создаваемых вновь GIT репозиториев, настроим:
- имя
- адрес
- идентификатор ключа:
$git config --global user.name 'Petya Ivanov'
$git config --global user.email 'petyaivanov@altlinux.org'
$git config --global user.signingkey '835560D9'
Третья команда задаёт идентификатор вашего GPG-ключа для подписи.
Чтобы узнать этот идентификатор, выполните одну из следующих команд:
$ gpg --list-keys | grep -B 1 'Petya Ivanov'
pub 1024D/835560D9 2023-05-15
uid Petya Ivanov (ALT Linux Team) <petyaivanov@altlinux.ru>
или
$ gpg --list-secret-keys
------------------------------
sec 1024D/835560D9 2023-05-15
uid Petya Ivanov (ALT Linux Team) <petyaivanov@altlinux.ru>
Работа с Git
Основы работы с Git-репозиторием описаны в указанной ниже статье.
- См. Git start
Настройка Hasher
Чтобы настроить сборочную среду Hasher нужно выполнить два действия - добавить пользователя в соответствующие группы и создать конфигурационный файл.
Добавление пользователя в группу
Из-под под root:
$ su - # hasher-useradd <существующий пользователь>
Например:
# hasher-useradd petr Добавление пользователя petr в группу petr_a Добавление пользователя petr в группу petr_b Добавление пользователя petr в группу hashman
Создание конфигурационного файла
Так же необходимо создать пользователю в домашнем каталоге файл .hasher/config:
$ mkdir ~/.hasher $ mcedit ~/.hasher/config
Вставляем в файл следующее содержимое:
packager="Petya Ivanov <petyaivanov@altlinux.org>" USER=petr #workdir="/tmp/.private/petr/" workdir="$HOME/hasher" target=x86_64 packager="`rpm --eval %packager`" #apt_config="$HOME/.hasher/apt.conf" mount=/dev/pts,/proc
Тут смотрите на строки с командами:
- packager ... - тут должны быть ваше имя и email
- 'USER=petr' - тут должно быть ваше имя пользователя, которое вы завели в hasher-useradd
- target - тут должна быть архитектура, под которую будут собираться пакеты, i586 или x86_64
- workdir - временная папка. /tmp - обозначает, что данные будут загружаться в tmpfs (в оперативную память) и, соответственно, собираться быстрее. Если у вас не так много оперативной памяти, укажите локальный каталог, например $HOME/hasher
Инициализация окружения Hasher
$ hsh -v --initroot-only
Настройка окружения RPM
Для настройки сборки RPM-пакетов (чтобы указать в них кто собрал данный пакет и подпись разработчика) нужно создать в домашнем каталоге файл .rpmmacros.
Отредактируйте файл ~/.rpmmacros (конечно, заменив ключ и имя мейнтейнера на свои):
$ mcedit ~/.rpmmacros
"%packager Petya Ivanov <petyaivanov@altlinux.org>"
"%_gpg_name 1B40E49FD40245D0472E4C5FD9528003835560D9"
Визуально проверьте файл на соответствие ожидаемому:
$ cat ~/.rpmmacros
Что указывается в %_gpg_name?
В %_gpg_name указывается отпечаток ключа (а не краткий идентификатор, как для Git). Получить его можно командой:
$ LANG=C gpg --fingerprint 835560D9 | grep 'fingerprint =' | tr -d ' ' | cut -d= -f2
1B40E49FD40245D0472E4C5FD9528003835560D9
или
$ gpg --fingerprint 835560D9 | sed -n '/.*=/{s/.*=/%_gpg_name\t/;s/ //gp}'
%_gpg_name 1B40E49FD40245D0472E4C5FD9528003835560D9
Виды сборки пакетов
Создание пакета с нуля
Для примера мы попробуем собрать утилиту Hello.
Подготовка репозитория Git
Первым делом нужно создать Git-репозиторий для нужного пакета. Для этого мы создадим каталог и инициализируем в нем git-репозиторий.
$ mkdir hello $ cd hello hello$ git init .
Наш каталог:
home └── hello <- Мы сейчас здесь └── .git <- Служебный каталог Git
Написание .gear/rules
В созданной папке hello создаем каталог .gear и в нем файл rules:
hello$ mkdir .gear hello$ cd .gear .gear$ mcedit rules
Наполняем файл следующей строкой и сохраняем его:
tar.gz: . name=hello base=hello
tar.gz: hello
- Указанная строка tar.gz:hello указывает, что будет создан архив с нашим каталогом hello.
Наш каталог:
home └── hello ├── .gear <- Мы сейчас здесь │ └── rules <- Мы создали этот файл └── .git
Импорт исходного кода
Исходный код Hello лежит на FTP: https://ftp.gnu.org/gnu/hello/.
Выходим из папки .gear в каталог выше и клонируем в него исходный код.
.gear$ cd .. hello$ wget https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz hello$ tar xzvf hello-2.10.tar.gz hello$ rm hello-2.10.tar.gz
Наш каталог:
home └── hello <- Мы сейчас здесь ├── hello-2.10 <- Мы распаковали исходный код программы сюда ├── .gear └── .git
hello$ mv hello-2.10 hello
Написание спека
Теперь нам нужно создать файл спека (spec).
Создадим в каталоге, где мы собираемся собирать программу этот файл.
hello$ mcedit hello.spec
Добавляем в файл следующие строки:
Шаблон с комментариями на русском для изучения |
---|
#Название пакета
Name: hello
#Версия программы
Version: 2.10
#Номер сборки в текущем бранче
Release: alt1.1
Summary: GNU hello, THE greeting printing program
#Группа в меню ([[Ярлычки_программ#Категории|см. здесь]])
Group: Development/C
#Лицензия
License: GPLv3+
#Сайт программы
Url: ftp://ftp.gnu.org/gnu/hello/
Source: %name-%version.tar.gz
# explicitly added texinfo for info files
#Зависимость для сборки
BuildRequires: texinfo
#Описание на английском
%description
The GNU `hello' program produces a familiar, friendly greeting. It
allows nonprogrammers to use a classic computer science tool which
would otherwise be unavailable to them. Because it is protected by the
GNU General Public License, users are free to share and change it.
#Команды сборки
%prep
%setup -a0
%build
%autoreconf
%configure
%make_build
%install
%makeinstall
%find_lang %name
%files -f %name.lang
%doc AUTHORS ChangeLog ChangeLog.O NEWS README THANKS TODO
%doc %name-%version
%_bindir/*
%_infodir/*
%_mandir/man?/*
#История изменений
%changelog
* Thu Dec 03 2015 Igor Vlasenko <viy@altlinux.ru> 2.10-alt1.1
- NMU: added BR: texinfo
* Mon Nov 17 2014 Fr. Br. George <george@altlinux.ru> 2.10-alt1
- Autobuild version bump to 2.10
- Use autoreconf for educational purpose
- Add full source tree in documentation
* Thu Apr 17 2014 Fr. Br. George <george@altlinux.ru> 2.9-alt1
- Autobuild version bump to 2.9
* Mon Apr 15 2013 Dmitry V. Levin (QA) <qa_ldv@altlinux.org> 2.4-alt2.qa1
- NMU: rebuilt for debuginfo.
* Thu May 21 2009 Andrey Rahmatullin <wrar@altlinux.ru> 2.4-alt2
- remove obsolete %%{,un}install_info calls
* Sat Dec 13 2008 Andrey Rahmatullin <wrar@altlinux.ru> 2.4-alt1
- 2.4
* Wed Aug 15 2007 Andrey Rahmatullin <wrar@altlinux.ru> 2.3-alt1
- 2.3
* Thu Feb 15 2007 Andrey Rahmatullin <wrar@altlinux.ru> 2.2-alt1
- 2.2
* Thu Oct 23 2003 Andrey Rahmatullin <wrar@altlinux.ru> 2.1.1-alt1
- initial build
|
Шаблон без комментариев на русском для продакшена |
---|
Name: hello
Version: 2.10
Release: alt1.1
Summary: GNU hello, THE greeting printing program
Group: Development/C
License: GPLv3+
Url: ftp://ftp.gnu.org/gnu/hello/
Source: %name-%version.tar.gz
# explicitly added texinfo for info files
BuildRequires: texinfo
%description
The GNU `hello' program produces a familiar, friendly greeting. It
allows nonprogrammers to use a classic computer science tool which
would otherwise be unavailable to them. Because it is protected by the
GNU General Public License, users are free to share and change it.
%prep
%setup -a0
%build
%autoreconf
%configure
%make_build
%install
%makeinstall
%find_lang %name
%files -f %name.lang
%doc AUTHORS ChangeLog ChangeLog.O NEWS README THANKS TODO
%doc %name-%version
%_bindir/*
%_infodir/*
%_mandir/man?/*
%changelog
* Thu Dec 03 2015 Igor Vlasenko <viy@altlinux.ru> 2.10-alt1.1
- NMU: added BR: texinfo
* Mon Nov 17 2014 Fr. Br. George <george@altlinux.ru> 2.10-alt1
- Autobuild version bump to 2.10
- Use autoreconf for educational purpose
- Add full source tree in documentation
* Thu Apr 17 2014 Fr. Br. George <george@altlinux.ru> 2.9-alt1
- Autobuild version bump to 2.9
* Mon Apr 15 2013 Dmitry V. Levin (QA) <qa_ldv@altlinux.org> 2.4-alt2.qa1
- NMU: rebuilt for debuginfo.
* Thu May 21 2009 Andrey Rahmatullin <wrar@altlinux.ru> 2.4-alt2
- remove obsolete %%{,un}install_info calls
* Sat Dec 13 2008 Andrey Rahmatullin <wrar@altlinux.ru> 2.4-alt1
- 2.4
* Wed Aug 15 2007 Andrey Rahmatullin <wrar@altlinux.ru> 2.3-alt1
- 2.3
* Thu Feb 15 2007 Andrey Rahmatullin <wrar@altlinux.ru> 2.2-alt1
- 2.2
* Thu Oct 23 2003 Andrey Rahmatullin <wrar@altlinux.ru> 2.1.1-alt1
- initial build
|
Наш каталог:
home └──hello <- Мы сейчас здесь ├── hello <- В прошлом шаге мы переименовали каталог с исходным кодом для совпадения имени репы исходного кода и пакета ├── hello.spec <- Файл спека, который мы создали ├── .gear └── .git
Внесение изменений в Git
После того, как мы внесли код, спек и настроили хэшер, внесенные изменения надо внести в Git.
Для этого переходим в каталог hello, в котором мы находились в предыдущем шаге и вносим коммит:
$ git add . $ git commit -am "Initial commit"
Сборка в Hasher
Чтобы собрать пакет в Hasher перейдите в корневой каталог проекта и выполните команду:
$ gear --hasher -- hsh --no-sisyphus-check -v
Для пересборки пакета (в случае исправления опечатки или ещё каких-то изменений без изменения зависимостей) пакет можно пересобрать командами:
$ gear --hasher -- hsh-rebuild --no-sisyphus-check -v
Отправка в git.alt
<...>
Создание пакета на основе существующего
Создание нового пакета на основе существующего
Например, в Git-репозитории ALT Linux уже есть утилитка Hello, которая подойдет для начинающих сборщиков пакетов.
https://git.altlinux.org/gears/h/hello.git.
Подготовка Git-репозитория
Первым делом нужно создать Git-репозиторий для этого пакета. Для этого мы создадим каталог и склонируем в него git-репозиторий.
$ mkdir MyRepos $ cd MyRepos MyRepos$ git clone https://git.altlinux.org/gears/h/hello.git
Наш каталог:
home └── MyRepos <- Мы сейчас здесь └── hello <- Склонированный репозиторий Git
Перейдем в каталог репозитория:
$ cd hello
Содержимое репозитория
hello ├── .gear ├── .git ├── hello └── hello.spec
Проверка .gear/rules
Перейдем в каталог .gear
hello$ cd .gear
hello ├── .gear <- Мы сейчас здесь │ └── rules <- Смотрим этот файл ├── .git ├── hello └── hello.spec
.gear$ cat rules tar.gz: hello
Правило tar.gz: hello, указывает, что каталог hello упаковывается в hello.tar.gz.
Сборка
Переходим в каталог выше:
.gear$ cd ..
hello <- Мы сейчас здесь ├── .gear ├── .git ├── hello └── hello.spec
И запускаем сборку:
$ gear --hasher -- hsh --no-sisyphus-check -v
Готовый пакет
Готовый пакет расположен по адресу:
/home/user/hasher/repo/x86_64/RPMS.hasher
"Воскрешение" "умершего" пакета
Сборка пакета из srcrpm
В ALT Linux кроме обычных пакетов есть пакеты с исходным кодом (имеют расширение *.src.rpm).
Такой пакет содержит:
- архив (один или несколько) с исходным кодом
- файл Spec (далее — просто спек)
- возможно, разнообразные патчи и дополнения.
Т.е. однажды разработчик все приготовил для того, чтобы собрать программу и упаковать ее в пакет, "заархивировал" все это в специальный файл и теперь вместо того чтобы все делать по новой (например, при обновлении программы), достаточно скачать данный пакет, подправить его содержимое и некоторые параметры и собрать новый пакет.
Пакет *.src.rpm можно использовать только для сборки двоичных пакетов, но не для установки.
Сборка осуществляется командой:
$ hsh --no-sisyphus-check -v ~/hasher '/home/user/Загрузки/hello-2.10-alt1.1.src.rpm'
Готовый пакет
Готовый *.rpm-пакет расположен по адресу:
/home/user/hasher/repo/x86_64/RPMS.hasher
Его можно установить командой:
# rpm -Uvh hello-2.10-alt1.1.rpm
Некоторые команды
Пересобрать пакет без пересборки окружения
gear --hasher -- hsh-rebuild
Войти в chroot сборки
hsh-shell
Глоссарий
- Gear - инструмент, позволяющий оперируя данными из git репозитория проводить сборку исходного текста в rpm пакет, тарболл или просто экспортировать результаты выполнения правил (gear-rules) в определённый каталог.
- Git - консольная утилита, для отслеживания и ведения истории изменения файлов, в проекте. Она отслеживает и фиксирует изменения в файлах и сохраняет их в специальных "снимках" - коммитах.
- Hasher - инструмент безопасной и воспроизводимой сборки пакетов. Все пакеты Sisyphus собираются с его помощью.
- GPG - программа шифрования информации с публичным ключом. Используется для подписи пакетов чтобы подтвердить подлинность разработчика, который выпустил данный пакет.
- RPM - формат пакетов программного обеспечения и утилита для установки данных пакетов. Так же у RPM существуют утилиты для сборки пакетов из специально приготовленных пакетов с исходным кодом.
- SSH - это защищенный сетевой протокол для удаленного управления операционной системой с помощью командной строки и передачи данных в зашифрованном виде. Он используется для передачи данных между разработчиком и сервером с пакетами.
- Исходный код - часть программного обеспечения, с которой программисты работают, чтобы изменить работу приложения или добавить новые функции.
- Патч (Patch) - программное средство, используемое для устранения проблем в программном обеспечении или изменения его функциональности
- Спек (Spec) - файл, содержащий инструкции для программы rpmbuild, необходимые для сборки пакета.