Сборка пакетов start: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
 
(не показаны 143 промежуточные версии 3 участников)
Строка 1: Строка 1:
Возможно будет дорабатываться статья [[Сборка пакета с нуля]]
{{Note|В примере будет участник '''Petya Ivanov''' с email - '''petyaivanov@altlinux.org''' и именем пользователя '''petr'''}}
 
=Подготовка=
=Подготовка=
==_==
==Генерация ключей==
{{Note|Основная статья: [[Работа с ключами разработчика]]}}
 
Для доступа к инфраструктуре ALT Linux нужны два открытых ключа: SSH и GPG. SSH ключ будет обеспечивать защищенное подключение к ресурсам ALT Linux Team, а GPG необходим для подписи пакетов.
 
===SSH===
Для работы с git-репозиториями ALT нужен будет SSH-ключ, который нужно сгенерировать. Его можно создать согласно инструкции с [[Работа_с_ключами_разработчика|этой страницы]].
 
$ ssh-keygen -t ED25519
 
{|class="wikitable mw-collapsible mw-collapsed" style="float:center; margin-left:2em"
!Генерация ключа проходит следующим образом:
|-
|
$ ssh-keygen -t ED25519
Generating public/private ED25519 key pair.
'''Enter file in which to save the key (/home/petr/.ssh/id_ed25519)''':''// Указывается место сохранения открытого и закрытого ключей (в скобках указан путь по-умолчанию) Жмем {{Button|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:
<nowiki>+--[ED25519 256]--+
|.o..            |
|=.o      .      |
|++ .. o . .      |
|.... B B .      |
|. . B.@ S        |
| . +oB.B .      |
|.  .X+..+        |
|.  =E+.+.        |
| .. +. o+        |
+----[SHA256]-----+</nowiki>
|}
Публичная часть ключа — файл '''~/.ssh/id_ed25519.pub'''.
 
===GPG-ключ===
Для подписи пакетов нужна открытая часть ключа. Следующими командами мы сгенерируем GPG-ключ и экспортируем в файл gpgkey.pub открытую часть.
$ gpg --gen-key
$ gpg --armor --export petyaivanov@altlinux.org > gpgkey.pub
 
{|class="wikitable mw-collapsible mw-collapsed" style="float:center; margin-left:2em"
!Генерация ключа проходит следующим образом:
|-
|
$ '''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 для сборки есть два инструмента.
 
* [[Hasher]] - для сборки в изолированном окружении [[chroot]].
 
В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке).
 
Если какой-то пакет, необходимый для сборки, не указан в спеке, то появится ошибка. Так обеспечивается воспроизводимость сборки.
 
Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой новой сборке в Hasher.
* [[Gear]] - для сборки пакетов из репозитория Git.
 
В этом случае все файлы лежат в распакованном виде и в src.rpm упаковываются по правилам, определённым в [[Gear/old#Синтаксис_.gear-rules|.gear/rules]].
 
Это позволяет работать сразу с содержимым, быстро делать патчи, вести историю изменений и обмениваться изменениями при коллективной разработке.
 
=== Установка инструментов для сборки ===
Для сборки пакетов нам понадобятся:
* Любой удобный текстовый редактор (Vim, Emacs, mcedit);
* Система управления версиями '''Git'''
* Сборочная среда '''Hasher'''
* Инфраструктура '''Gear'''
* Утилиты RPM для сборки пакетов
* Инструменты для сборки программ: gcc, make, python, patch.
* Утилита для импорта проектов с Github
* Доступ к [[Branches|репозиторию пакетов]]
 
Установка:
# 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 репозиториев, настроим:
*имя
*адрес
*идентификатор ключа:
 
<source lang=bash>
$git config --global user.name 'Petya Ivanov'
$git config --global user.email 'petyaivanov@altlinux.org'
$git config --global user.signingkey '835560D9'
</source>
 
Третья команда задаёт идентификатор вашего GPG-ключа для подписи.
 
Чтобы узнать этот идентификатор, выполните одну из следующих команд:
 
<source lang=bash>
$ gpg --list-keys | grep -B 1 'Petya Ivanov'
pub  1024D/835560D9 2023-05-15
uid                  Petya Ivanov (ALT Linux Team) <petyaivanov@altlinux.ru>
</source>
 
или
 
<source lang=bash>
$ gpg --list-secret-keys
------------------------------
sec  1024D/835560D9 2023-05-15
uid                  Petya Ivanov (ALT Linux Team) <petyaivanov@altlinux.ru>
</source>
 
====Работа с Git====
Основы работы с Git-репозиторием описаны в указанной ниже статье.
*См. [[Git start]]
 
===Настройка Hasher===
Чтобы настроить сборочную среду Hasher нужно выполнить два действия - добавить пользователя в соответствующие группы и создать конфигурационный файл.
{{Note|После добавления пользователя в группу Hasher, для применения параметров, необходимо выполнить ре-логин в систему (в GUI или в консоли - в зависимости от того, где вы работаете)}}
====Добавление пользователя в группу====
Из-под под root:
<pre>
$ su -
# hasher-useradd <существующий пользователь>
</pre>
Например:
<pre>
# hasher-useradd petr
Добавление пользователя petr в группу petr_a
Добавление пользователя petr в группу petr_b
Добавление пользователя petr в группу hashman
</pre>
====Создание конфигурационного файла====
Так же необходимо создать пользователю в домашнем каталоге файл {{path|.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====
{{Note|Данную команду нужно выполнять после ре-логина или перезагрузки}}
{{Note|Если вы указали использовать вместо оперативной памяти каталог на жестком диске, проверьте, существует ли данный каталог, и если его нет создайте его командой {{cmd|mkdir ~/hasher}}}}
$ hsh -v --initroot-only
{{Note|[[Hasher/FAQ|FAQ по Hasher]]}}
 
<!--===Настройка Gear===
-->
 
===Настройка окружения RPM===
Для настройки сборки RPM-пакетов (чтобы указать в них кто собрал данный пакет и подпись разработчика) нужно создать в домашнем каталоге файл .rpmmacros.
 
Отредактируйте файл ~/.rpmmacros (конечно, заменив ключ и имя мейнтейнера на свои):
<source lang=bash>
$ mcedit ~/.rpmmacros
</source>
 
<source lang=bash>
"%packager Petya Ivanov <petyaivanov@altlinux.org>"
"%_gpg_name 1B40E49FD40245D0472E4C5FD9528003835560D9"
</source>
 
Визуально проверьте файл на соответствие ожидаемому:
<source lang=bash>$ cat ~/.rpmmacros</source>
 
====Что указывается в %_gpg_name?====
{{Note|Обратите внимание, в качестве одного из аргументов используется краткий идентификатор ключа. Мы его получили в [[#Настройка Git|шаге настройки Git]].}}
В %_gpg_name указывается отпечаток ключа (а не краткий идентификатор, как для Git). Получить его можно командой:
<source lang=bash>
$ LANG=C gpg --fingerprint 835560D9 | grep 'fingerprint =' | tr -d ' ' | cut -d= -f2
1B40E49FD40245D0472E4C5FD9528003835560D9
</source>
или
<source lang=bash>
$ gpg --fingerprint 835560D9 | sed -n '/.*=/{s/.*=/%_gpg_name\t/;s/ //gp}'
%_gpg_name 1B40E49FD40245D0472E4C5FD9528003835560D9
</source>
 
=Виды сборки пакетов=
==Создание пакета с нуля==
Для примера мы попробуем собрать утилиту [https://ftp.gnu.org/gnu/hello/ 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
Наполняем файл следующей строкой и сохраняем его:
{{Note|В более сложных пакетах используется конструкция вида <code><nowiki>tar.gz: . name=hello base=hello</nowiki></code>}}
tar.gz: hello
*Указанная строка {{path|tar.gz:hello}} указывает, что будет создан архив с нашим каталогом hello.


=Создание пакета на основе существующего=
Наш каталог:
home
└── hello
    ├── .gear <- Мы сейчас здесь
    │   └── rules <- Мы создали этот файл
    └── .git


=Сборка пакета из srcrpm=
=== Импорт исходного кода ===
В ALT Linux кроме обычных пакетов есть '''пакеты с исходным кодом''' (имеют расширение .src.rpm). Такой пакет содержит архив (один или несколько) с исходным кодом, файл Spec (далее — просто спек) и, возможно, разнообразные патчи и дополнения. Пакет src.rpm можно использовать только для сборки двоичных пакетов, но не установки. Сборка осуществляется командой:
Исходный код Hello лежит на FTP: [https://ftp.gnu.org/gnu/hello/ https://ftp.gnu.org/gnu/hello/].  


  rpmbuild --rebuild package...src.rpm
Выходим из папки .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
{{Note|Т.к. для Hasher-а нужно, чтобы имя пакета в spec-е и имя репозитория совпадали (а пакет у нас будет называться hello, а не hello-2.10), мы переименуем каталог с исходным кодом в соответствии с именем пакета}}
hello$ mv hello-2.10 hello
 
=== Написание спека ===
{{Note|[https://github.com/altlinux/specs/ Примеры спеков ALT Linux]}}
Теперь нам нужно создать файл спека (spec).
 
Создадим в каталоге, где мы собираемся собирать программу этот файл.
hello$ mcedit hello.spec
 
Добавляем в файл следующие строки:
{{Note|RPMBuild не поддерживает комментарии на русском языке, поэтому используйте на практике вариант без них.}}
 
{|class="wikitable mw-collapsible mw-collapsed" style="float:center; margin-left:2em"
!Шаблон с комментариями на русском для изучения
|-
|
<syntaxhighlight lang="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
 
</syntaxhighlight>
|}
 
{|class="wikitable mw-collapsible mw-collapsed" style="float:center; margin-left:2em"
!Шаблон без комментариев на русском для продакшена
|-
|
<syntaxhighlight lang="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
</syntaxhighlight>
|}
 
Наш каталог:
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
 
Правило {{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==
{{Note|Для сборки из '''.src.rpm''' нужно установить пакеты '''rpm-utils''', '''rpm-build''' и '''rpm-build-licenses'''}}
В ALT Linux кроме обычных пакетов есть '''пакеты с исходным кодом''' (имеют расширение '''<nowiki>*</nowiki>.src.rpm''').
 
Такой пакет содержит:
*архив (один или несколько) с исходным кодом
*файл Spec (далее — просто спек)
*возможно, разнообразные патчи и дополнения.
 
Т.е. однажды разработчик все приготовил для того, чтобы собрать программу и упаковать ее в пакет, "заархивировал" все это в специальный файл и теперь вместо того чтобы все делать по новой (например, при обновлении программы), достаточно скачать данный пакет, подправить его содержимое и некоторые параметры и собрать новый пакет.
 
Пакет '''<nowiki>*</nowiki>.src.rpm''' можно использовать только для сборки двоичных пакетов, но не для установки.
 
Сборка осуществляется командой:
$ 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 -  
*'''Gear''' - инструмент, позволяющий оперируя данными из git репозитория проводить сборку исходного текста в rpm пакет, тарболл или просто экспортировать результаты выполнения правил (gear-rules) в определённый каталог.
*Hasher-
*'''Git''' - консольная утилита, для отслеживания и ведения истории изменения файлов, в проекте. Она отслеживает и фиксирует изменения в файлах и сохраняет их в специальных "снимках" - коммитах.
*Исходный код -  
*'''Hasher''' - инструмент безопасной и воспроизводимой сборки пакетов. Все пакеты Sisyphus собираются с его помощью.
*Патч (Patch)
*'''GPG''' - программа шифрования информации с публичным ключом. Используется для подписи пакетов чтобы подтвердить подлинность разработчика, который выпустил данный пакет.
*Спек (Spec)
*'''RPM''' - формат пакетов программного обеспечения и утилита для установки данных пакетов. Так же у RPM существуют утилиты для сборки пакетов из специально приготовленных пакетов с исходным кодом.
*'''SSH''' - это защищенный сетевой протокол для удаленного управления операционной системой с помощью командной строки и передачи данных в зашифрованном виде. Он используется для передачи данных между разработчиком и сервером с пакетами.
*'''Исходный код''' - часть программного обеспечения, с которой программисты работают, чтобы изменить работу приложения или добавить новые функции.
*'''Патч (Patch)''' - программное средство, используемое для устранения проблем в программном обеспечении или изменения его функциональности
*'''Спек (Spec)''' - файл, содержащий инструкции для программы rpmbuild, необходимые для сборки пакета.
 
=Источники=
*[[О стратегии сборки RPM пакетов]]
*[[Сборка пакета с нуля]]
*[[Сборка пакета с РЕАЛЬНОГО НУЛЯ]]
*[[Spec]]
*[[Краткое руководство по сборке пакета]]
*[[SpecTips]]
*[[SampleSpecs]]
*[[Join/Environment]]
*[[Собираем в Hasher]]
*[[Технология сборки пакетов RPM]]
*[[Hasher/Краткое_руководство]]
{{Category navigation|title=Начинающему разработчику|category=Начинающему разработчику|sortkey={{SUBPAGENAME}}}}
[[Категория:Сборка пакетов]]

Текущая версия от 17:13, 30 августа 2024

Примечание: В примере будет участник Petya Ivanov с email - petyaivanov@altlinux.org и именем пользователя petr


Подготовка

Генерация ключей

Примечание: Основная статья: Работа с ключами разработчика


Для доступа к инфраструктуре 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 для сборки есть два инструмента.

  • Hasher - для сборки в изолированном окружении chroot.

В 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-репозиторием описаны в указанной ниже статье.

Настройка Hasher

Чтобы настроить сборочную среду Hasher нужно выполнить два действия - добавить пользователя в соответствующие группы и создать конфигурационный файл.

Примечание: После добавления пользователя в группу Hasher, для применения параметров, необходимо выполнить ре-логин в систему (в GUI или в консоли - в зависимости от того, где вы работаете)

Добавление пользователя в группу

Из-под под 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

Примечание: Данную команду нужно выполнять после ре-логина или перезагрузки
Примечание: Если вы указали использовать вместо оперативной памяти каталог на жестком диске, проверьте, существует ли данный каталог, и если его нет создайте его командой mkdir ~/hasher
$ hsh -v --initroot-only
Примечание: FAQ по Hasher


Настройка окружения RPM

Для настройки сборки RPM-пакетов (чтобы указать в них кто собрал данный пакет и подпись разработчика) нужно создать в домашнем каталоге файл .rpmmacros.

Отредактируйте файл ~/.rpmmacros (конечно, заменив ключ и имя мейнтейнера на свои):

$ mcedit ~/.rpmmacros
"%packager Petya Ivanov <petyaivanov@altlinux.org>"
"%_gpg_name 1B40E49FD40245D0472E4C5FD9528003835560D9"

Визуально проверьте файл на соответствие ожидаемому:

$ cat ~/.rpmmacros

Что указывается в %_gpg_name?

Примечание: Обратите внимание, в качестве одного из аргументов используется краткий идентификатор ключа. Мы его получили в шаге настройки Git.

В %_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
Примечание: Т.к. для Hasher-а нужно, чтобы имя пакета в spec-е и имя репозитория совпадали (а пакет у нас будет называться hello, а не hello-2.10), мы переименуем каталог с исходным кодом в соответствии с именем пакета
hello$ mv hello-2.10 hello

Написание спека

Теперь нам нужно создать файл спека (spec).

Создадим в каталоге, где мы собираемся собирать программу этот файл.

hello$ mcedit hello.spec

Добавляем в файл следующие строки:

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


Шаблон с комментариями на русском для изучения
#Название пакета
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

Примечание: Для сборки из .src.rpm нужно установить пакеты rpm-utils, rpm-build и rpm-build-licenses

В 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, необходимые для сборки пакета.

Источники