Сборка пакетов start

Материал из ALT Linux Wiki
Примечание: В примере будет участник 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, необходимые для сборки пакета.

Источники