Сборка пакетов start
Возможно будет дорабатываться статья Сборка пакета с нуля
Подготовка
Генерация ключей
Для доступа к инфраструктуре 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.
- Доступ к репозиторию пакетов
Установка:
# apt-get install mcedit git hasher hasher-priv gear gcc make python patch rpmdevtools rpm-utils rpm-build rpmlint rpm-build-licenses
Настройка 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-репозиторием описаны в указанной ниже статье.
- См. Git start
Настройка Hasher
Чтобы настроить сборочную среду Hasher нужно выполнить два действия - добавить пользователя в соответствующие группы и создать конфигурационный файл.
Добавление пользователя в группу
Из-под под root:
$ su - # hasher-useradd <существующий пользователь>
Например:
# hasher-useradd petr Добавление пользователя petr в группу petr_a Добавление пользователя petr в группу petr_b Добавление пользователя petr в группу hashman
Создание конфигурационного фала
Так же необходимо создать пользователю в домашнем каталоге файл .hasher/config:
$ mkdir ~/.hasher $ echo 'packager="Petya Ivanov <petyaivanov@altlinux.org>"' >~/.hasher/config $ echo 'USER=petr' >~/.hasher/config $ echo 'workdir="/tmp/.private/petr/"' >~/.hasher/config $ echo 'target=i586' >~/.hasher/config $ echo 'packager="`rpm --eval %packager`"' >~/.hasher/config $ echo 'apt_config="$HOME/.hasher/apt.conf"' >~/.hasher/config $ echo 'mount=/dev/pts,/proc' >~/.hasher/config
Тут смотрите на строки с командами:
- echo packager ... - тут должны быть ваше имя и email
- echo 'USER=petr' - тут должно быть ваше имя пользователя, которое вы завели в hasher-useradd
- target - тут должна быть архитектура, под которую будут собираться пакеты, i586 или x86_64
Настройка Gear
Настройка окружения RPM
Для настройки сборки RPM-пакетов (чтобы указать в них кто собрал данный пакет и подпись разработчика) нужно создать в домашнем каталоге файл .rpmmacros.
Создайте данный файл ~/.rpmmacros (конечно, заменив ключ и имя мейнтейнера на свои):
$ echo "%packager Petya Ivanov <petyaivanov@altlinux.org>" >> ~/.rpmmacros
$ echo "%_gpg_name 1B40E49FD40245D0472E4C5FD9528003835560D9" >> ~/.rpmmacros
Визуально проверьте файл на соответствие ожидаемому:
$ 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
Виды сборки пакетов
Создание пакета с нуля
Для примера мы попробуем собрать утилиту 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 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
Написание спека
Теперь нам нужно создать файл спека (spec).
Создадим в каталоге, где мы собираемся собирать программу этот файл.
compresspdf$ touch compresspdf.spec compresspdf$ mcedit compresspdf.spec
Т.к. у нас программа на Qt, мы можем взять пример из программы Qpdf.
Добавляем в файл следующие строки:
#Название пакета
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: %{namePackager} <%{addressPackager}>
# Fake dependency. Used as example of syntax, etc.
BuildPreReq: /proc
BuildRequires: gcc
BuildArch: i586
#Описание на английском
%description
Application for compress PDF files
#Описание на русском
%description -l ru_RU.UTF-8
Приложение для сжатия PDF-файлов
%prep
%setup
%build
%define dirBuild %{_topdir}/BUILD/%{name}-%{version}
%define dirBin %{dirBuild}/%{name}-%{version}
mkdir -p %{dirBin}
gcc "%{dirBuild}/hello.c" -o "%{dirBin}/hello.out"
%install
install -D -m755 "%{dirBin}/hello.out" %{buildroot}%{_bindir}/hello.out
rm -rf %{dirBin}
%files
%{_bindir}/*
%doc hello.c
#История изменений
%changelog
* %{dateFormated} %{namePackager} <%{addressPackager}> %{version}-%{release}
- Initial build for ALT Linux Sisyphus
Наш каталог:
compresspdf <- Мы сейчас здесь ├── compress-pdf ├── compresspdf.spec <- Файл спека, который мы создали ├── .gear └── .git
Сборка в Hasher
Чтобы собрать пакет в Hasher перейдите в корневой каталог проекта и выполните команду:
$ rpmbsh
Отправка в git.alt
Создание пакета на основе существующего
Сборка пакета из srcrpm
В 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, необходимые для сборки пакета.