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

Материал из ALT Linux Wiki
Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Возможно будет дорабатываться статья Сборка пакета с нуля

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


Подготовка

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

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


Для доступа к инфраструктуре ALT Linux нужны два открытых ключа: SSH и GPG. SSH ключ будет обеспечивать защищенное подключение к ресурсам ALT Linux Team, а GPG необходим для подписи пакетов.

SSH

Для работы с git-репозиториями ALT нужен будет SSH-ключ, который нужно сгенерировать. Его можно создать согласно инструкции с этой страницы.

$ ssh-keygen -t ED25519 -b 4096
Генерация ключа проходит следующим образом:
$ ssh-keygen -t ED25519 -b 4096
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 ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле 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>

или

[cas@cas ~]$ 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=i586
packager="`rpm --eval %packager`"
#apt_config="$HOME/.hasher/apt.conf"
mount=/dev/pts,/proc

Тут смотрите на строки с командами:

  • echo packager ... - тут должны быть ваше имя и email
  • echo 'USER=petr' - тут должно быть ваше имя пользователя, которое вы завели в hasher-useradd
  • target - тут должна быть архитектура, под которую будут собираться пакеты, i586 или x86_64
  • workdir - временная папка. /tmp - обозначает, что данные будут загружаться в оперативную память, если у вас ее не так много укажите локальный каталог, например $HOME/hasher

Инициализация окружения Hasher

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


Настройка Gear

Настройка окружения 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

Виды сборки пакетов

Создание пакета с нуля

Для примера мы попробуем собрать утилиту CompressPDF.

Подготовка репозитория Git

Первым делом нужно создать Git-репозиторий для нужного пакета. Для этого мы создадим каталог и инициализируем в нем git-репозиторий.

$ mkdir compresspdf
$ cd compresspdf
compresspdf$ git init .

Наш каталог:

home
└── compresspdf <- Мы сейчас здесь
   └── .git <- Служебный каталог Git

Написание .gear/rules

В созданной папке compresspdf создаем каталог .gear и в нем файл rules:

compresspdf$ mkdir .gear
compresspdf$ cd .gear
.gear$ mcedit rules 

Наполняем файл следующими строками и сохраняем файл:

tar: compresspdf name=@name@-@version@ base=@name@-@version@
spec: compresspdf.spec
  • Первая срока указывает, что будет создан архив с нашим каталогом compresspdf.
  • Вторая строка указывает, что для сборки пакета нужно использовать файл compresspdf.spec. Если спек лежит в корневом каталоге, его указывать не нужно.

Наш каталог:

home
└── compresspdf
    ├── .gear <- Мы сейчас здесь
    │   └── rules <- Мы создали этот файл
    └── .git

Импорт исходного кода

Исходный код CompressPdf лежит на Github: https://github.com/itsfoss/compress-pdf/.

Выходим из папки .gear в каталог выше и клонируем в него исходный код.

.gear$ cd ..
compresspdf$ git clone https://github.com/itsfoss/compress-pdf.git

Наш каталог:

home
└── compresspdf  <- Мы сейчас здесь
    ├── compress-pdf <- Git clone склонировал репозиторий программы сюда
    ├── .gear
    └── .git
Примечание: Т.к. для Hasher-а нужно чтобы имя пакета в spec-е и имя репозитория совпадали (а пакет у нас будет называться compresspdf, а не compress-pdf), мы переименуем каталог с исходным кодом в соответствии с именем пакета


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

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

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

compresspdf$ mcedit compresspdf.spec

Т.к. у нас программа на Qt, мы можем взять пример из программы Qpdf.

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

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


Шаблон с комментариями на русском для изучения
#Название пакета
Name: compresspdf
#Версия программы
Version: 0.1
#Номер сборки в текущем бранче
Release: alt1

#Описание на английском
Summary: Application for compress PDF files
#Описание на русском
Summary(ru_RU.UTF-8): Утилита для сжатия PDF-файлов

#Лицензия
License: GNU GPL
#Группа в меню ([[Ярлычки_программ#Категории|см. здесь]])
Group: Utility

#Сайт программы
Url: https://github.com/itsfoss/compress-pdf/
#
Source: %{name}-%{version}.tar.gz
#Сборщик пакета (имя и email, указывается вручную)
Packager: Petr Akhlamov <ahlamovpm@altlinux.org>

BuildPreReq: /proc

BuildRequires(pre): rpm-build-python3
BuildArch: noarch

#Описание на английском
%description
Application for compress PDF files

#Описание на русском
%description -l ru_RU.UTF-8
Приложение для сжатия PDF-файлов

%prep
%setup

%build
%pyproject_build

%install
%pyproject_install

%files
%python3_sitelibdir

#История изменений
%changelog
* Mon Oct 09 2023 Petr Akhlamov akhlamovpm@altlinux.org 0.1-alt1
- new version

* Thu Oct 05 2023 Petr Akhlamov ahlamovpm@altlinux.org 0.1-alt1
- Initial build for ALT Linux Sisyphus
Шаблон без комментариев на русском для продакшена
Name: compresspdf
Version: 0.1
Release: alt1

Summary: Application for compress PDF files
Summary(ru_RU.UTF-8): Утилита для сжатия PDF-файлов

License: GNU GPL
Group: Utility

Url: https://github.com/itsfoss/compress-pdf/
Source: %{name}-%{version}.tar
Packager: Petr Akhlamov <ahlamovpm@altlinux.org>

BuildPreReq: /proc

BuildRequires(pre): rpm-build-python3
BuildArch: noarch

%description
Application for compress PDF files

%description -l ru_RU.UTF-8
Приложение для сжатия PDF-файлов

%prep
%setup

%build
%pyproject_build

%install
%pyproject_install

%files
%python3_sitelibdir

%changelog
* Mon Oct 09 2023 Petr Akhlamov akhlamovpm@altlinux.org 0.1-alt1
- new version

* Thu Oct 05 2023 Petr Akhlamov ahlamovpm@altlinux.org 0.1-alt1
- Initial build for ALT Linux Sisyphus

Наш каталог:

home
└── compresspdf <- Мы сейчас здесь
    ├── compresspdf <- В прошлом шаге мы переименовали каталог с исходным кодом для совпадения имени репы исходного кода и пакета
    ├── compresspdf.spec <- Файл спека, который мы создали
    ├── .gear
    └── .git

Внесение изменений в Git

После того, как мы внесли код, спек и настроили хэшер, внесенные изменения надо внести в Git.

Для этого переходим в каталог compresspdf, в котором мы находились в предыдущем шаге и вносим коммит:

$ git commit -am "Initial commit"
$ git add .

Сборка в Hasher

Чтобы собрать пакет в Hasher перейдите в корневой каталог проекта и выполните команду:

$ gear --hasher -- hsh --no-sisyphus-check

Отправка в git.alt


См. Сборка пакета с нуля

Создание пакета на основе существующего

Создание нового пакета на основе существующего

"Воскрешение" "умершего" пакета

Сборка пакета из srcrpm

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

В ALT Linux кроме обычных пакетов есть пакеты с исходным кодом (имеют расширение *.src.rpm).

Такой пакет содержит:

  • архив (один или несколько) с исходным кодом
  • файл Spec (далее — просто спек)
  • возможно, разнообразные патчи и дополнения.

Т.е. однажды разработчик все приготовил для того, чтобы собрать программу и упаковать ее в пакет, "заархивировал" все это в специальный файл и теперь вместо того чтобы все делать по новой (например, при обновлении программы), достаточно скачать данный пакет, подправить его содержимое и некоторые параметры и собрать новый пакет.

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

Сборка осуществляется командой:

rpmbuild --rebuild package.src.rpm

В итоге получится готовый *.rpm-пакет который можно установить командой:

# rpm -Uvh package.rpm

Глоссарий

  • Gear - инструмент, позволяющий оперируя данными из git репозитория проводить сборку исходного текста в rpm пакет,тарболл или просто экспортировать результаты выполненияправил (gear-rules) в определённый каталог.
  • Git - консольная утилита, для отслеживания и ведения истории изменения файлов, в проекте. Она отслеживает и фиксирует изменения в файлах и сохраняет их в специальных "снимках" - коммитах.
  • Hasher - инструмент безопасной и воспроизводимой сборки пакетов. Все пакеты Sisyphus собираются с его помощью.
  • GPG - программа шифрования информации с публичным ключом. Используется для подписи пакетов чтобы подтвердить подлинность разработчика, который выпустил данный пакет.
  • RPM - формат пакетов программного обеспечения и утилита для установки данных пакетов. Так же у RPM существуют утилиты для сборки пакетов из специально приготовленных пакетов с исходным кодом.
  • SSH - это защищенный сетевой протокол для удаленного управления операционной системой с помощью командной строки и передачи данных в зашифрованном виде. Он используется для передачи данных между разработчиком и сервером с пакетами.
  • Исходный код - часть программного обеспечения, с которой программисты работают, чтобы изменить работу приложения или добавить новые функции.
  • Патч (Patch) - программное средство, используемое для устранения проблем в программном обеспечении или изменения его функциональности
  • Спек (Spec) - файл содержащий инструкции для программы rpmbuild, необходимые для сборки пакета.

Источники