Сборка пакетов start: различия между версиями
Garrett (обсуждение | вклад) Нет описания правки |
Garrett (обсуждение | вклад) Нет описания правки |
||
Строка 280: | Строка 280: | ||
Выходим из папки .gear в каталог выше и клонируем в него исходный код. | Выходим из папки .gear в каталог выше и клонируем в него исходный код. | ||
.gear$ cd .. | .gear$ cd .. | ||
hello$ wget https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz | |||
hello$ tar xzvf hello-2.10.tar.gz | hello$ tar xzvf hello-2.10.tar.gz | ||
hello$ rm hello-2.10.tar.gz | hello$ rm hello-2.10.tar.gz | ||
Строка 491: | Строка 491: | ||
Чтобы собрать пакет в Hasher перейдите в корневой каталог проекта и выполните команду: | Чтобы собрать пакет в Hasher перейдите в корневой каталог проекта и выполните команду: | ||
$ gear --hasher -- hsh --no-sisyphus-check -v | $ gear --hasher -- hsh --no-sisyphus-check -v | ||
Для пересборки пакета (в случае исправления опечатки или | Для пересборки пакета (в случае исправления опечатки или ещё каких-то изменений без изменения зависимостей) пакет можно пересобрать командами: | ||
$ gear --hasher -- hsh-rebuild --no-sisyphus-check -v | $ gear --hasher -- hsh-rebuild --no-sisyphus-check -v | ||
Строка 599: | Строка 599: | ||
*'''Исходный код''' - часть программного обеспечения, с которой программисты работают, чтобы изменить работу приложения или добавить новые функции. | *'''Исходный код''' - часть программного обеспечения, с которой программисты работают, чтобы изменить работу приложения или добавить новые функции. | ||
*'''Патч (Patch)''' - программное средство, используемое для устранения проблем в программном обеспечении или изменения его функциональности | *'''Патч (Patch)''' - программное средство, используемое для устранения проблем в программном обеспечении или изменения его функциональности | ||
*'''Спек (Spec)''' - файл содержащий инструкции для программы rpmbuild, необходимые для сборки пакета. | *'''Спек (Spec)''' - файл, содержащий инструкции для программы rpmbuild, необходимые для сборки пакета. | ||
=Источники= | =Источники= |
Версия от 11:28, 29 августа 2024
Подготовка
Генерация ключей
Для доступа к инфраструктуре ALT Linux нужны два открытых ключа: SSH и GPG. SSH ключ будет обеспечивать защищенное подключение к ресурсам ALT Linux Team, а GPG необходим для подписи пакетов.
SSH
Для работы с git-репозиториями ALT нужен будет SSH-ключ, который нужно сгенерировать. Его можно создать согласно инструкции с этой страницы.
$ ssh-keygen -t ED25519
развернутьГенерация ключа проходит следующим образом: |
---|
Публичная часть ключа — файл ~/.ssh/id_ed25519.pub.
GPG-ключ
Для подписи пакетов нужна открытая часть ключа. Следующими командами мы сгенерируем GPG-ключ и экспортируем в файл gpgkey.pub открытую часть.
$ gpg --gen-key $ gpg --armor --export petyaivanov@altlinux.org > gpgkey.pub
развернутьГенерация ключа проходит следующим образом: |
---|
Инструменты для сборки
В ALT Linux для сборки есть два инструмента.
В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке).
Если какой-то пакет, необходимый для сборки, не указан в спеке, то появится ошибка. Так обеспечивается воспроизводимость сборки.
Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой новой сборке в Hasher.
- Gear - для сборки пакетов из репозитория Git.
В этом случае все файлы лежат в распакованном виде и в src.rpm упаковываются по правилам, определённым в .gear/rules.
Это позволяет работать сразу с содержимым, быстро делать патчи, вести историю изменений и обмениваться изменениями при коллективной разработке.
Установка инструментов для сборки
Для сборки пакетов нам понадобятся:
- Любой удобный текстовый редактор (Vim, Emacs, mcedit);
- Система управления версиями Git
- Сборочная среда Hasher
- Инфраструктура Gear
- Утилиты RPM для сборки пакетов
- Инструменты для сборки программ: gcc, make, python, patch.
- Утилита для импорта проектов с Github
- Доступ к репозиторию пакетов
Установка:
# apt-get install mc git hasher hasher-priv gear gcc make python patch rpmdevtools rpm-utils rpm-build rpmlint rpm-build-licenses github2spec
Настройка Git
Чтобы у нашего Git-репозитория была идентификация, что именно мы занимаемся сборкой пакетов, его нужно настроить.
Следующими командами мы, для создаваемых вновь GIT репозиториев, настроим:
- имя
- адрес
- идентификатор ключа:
$git config --global user.name 'Petya Ivanov'
$git config --global user.email 'petyaivanov@altlinux.org'
$git config --global user.signingkey '835560D9'
Третья команда задаёт идентификатор вашего GPG-ключа для подписи.
Чтобы узнать этот идентификатор, выполните одну из следующих команд:
$ gpg --list-keys | grep -B 1 'Petya Ivanov'
pub 1024D/835560D9 2023-05-15
uid Petya Ivanov (ALT Linux Team) <petyaivanov@altlinux.ru>
или
$ gpg --list-secret-keys
------------------------------
sec 1024D/835560D9 2023-05-15
uid Petya Ivanov (ALT Linux Team) <petyaivanov@altlinux.ru>
Работа с Git
Основы работы с Git-репозиторием описаны в указанной ниже статье.
- См. Git start
Настройка Hasher
Чтобы настроить сборочную среду Hasher нужно выполнить два действия - добавить пользователя в соответствующие группы и создать конфигурационный файл.
Добавление пользователя в группу
Из-под под root:
$ su - # hasher-useradd <существующий пользователь>
Например:
# hasher-useradd petr Добавление пользователя petr в группу petr_a Добавление пользователя petr в группу petr_b Добавление пользователя petr в группу hashman
Создание конфигурационного фала
Так же необходимо создать пользователю в домашнем каталоге файл .hasher/config:
$ mkdir ~/.hasher $ mcedit ~/.hasher/config
Вставляем в файл следующее содержимое:
packager="Petya Ivanov <petyaivanov@altlinux.org>" USER=petr #workdir="/tmp/.private/petr/" workdir="$HOME/hasher" target=x86_64 packager="`rpm --eval %packager`" #apt_config="$HOME/.hasher/apt.conf" mount=/dev/pts,/proc
Тут смотрите на строки с командами:
- packager ... - тут должны быть ваше имя и email
- 'USER=petr' - тут должно быть ваше имя пользователя, которое вы завели в hasher-useradd
- target - тут должна быть архитектура, под которую будут собираться пакеты, i586 или x86_64
- workdir - временная папка. /tmp - обозначает, что данные будут загружаться в tmpfs (в оперативную память) и, соответственно, собираться быстрее. Если у вас не так много оперативной памяти, укажите локальный каталог, например $HOME/hasher
Инициализация окружения Hasher
$ hsh -v --initroot-only
Настройка окружения RPM
Для настройки сборки RPM-пакетов (чтобы указать в них кто собрал данный пакет и подпись разработчика) нужно создать в домашнем каталоге файл .rpmmacros.
Отредактируйте файл ~/.rpmmacros (конечно, заменив ключ и имя мейнтейнера на свои):
$ mcedit ~/.rpmmacros
"%packager Petya Ivanov <petyaivanov@altlinux.org>"
"%_gpg_name 1B40E49FD40245D0472E4C5FD9528003835560D9"
Визуально проверьте файл на соответствие ожидаемому:
$ cat ~/.rpmmacros
Что указывается в %_gpg_name?
В %_gpg_name указывается отпечаток ключа (а не краткий идентификатор, как для Git). Получить его можно командой:
$ LANG=C gpg --fingerprint 835560D9 | grep 'fingerprint =' | tr -d ' ' | cut -d= -f2
1B40E49FD40245D0472E4C5FD9528003835560D9
или
$ gpg --fingerprint 835560D9 | sed -n '/.*=/{s/.*=/%_gpg_name\t/;s/ //gp}'
%_gpg_name 1B40E49FD40245D0472E4C5FD9528003835560D9
Виды сборки пакетов
Создание пакета с нуля
Для примера мы попробуем собрать утилиту Hello.
Подготовка репозитория Git
Первым делом нужно создать Git-репозиторий для нужного пакета. Для этого мы создадим каталог и инициализируем в нем git-репозиторий.
$ mkdir hello $ cd hello hello$ git init .
Наш каталог:
home └── hello <- Мы сейчас здесь └── .git <- Служебный каталог Git
Написание .gear/rules
В созданной папке hello создаем каталог .gear и в нем файл rules:
hello$ mkdir .gear hello$ cd .gear .gear$ mcedit rules
Наполняем файл следующей строкой и сохраняем его:
tar.gz: . name=hello base=hello
tar.gz: hello
- Указанная строка tar.gz:hello указывает, что будет создан архив с нашим каталогом hello.
Наш каталог:
home └── hello ├── .gear <- Мы сейчас здесь │ └── rules <- Мы создали этот файл └── .git
Импорт исходного кода
Исходный код Hello лежит на FTP: https://ftp.gnu.org/gnu/hello/.
Выходим из папки .gear в каталог выше и клонируем в него исходный код.
.gear$ cd .. hello$ wget https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz hello$ tar xzvf hello-2.10.tar.gz hello$ rm hello-2.10.tar.gz
Наш каталог:
home └── hello <- Мы сейчас здесь ├── hello-2.10 <- Мы распаковали исходный код программы сюда ├── .gear └── .git
hello$ mv hello-2.10 hello
Написание спека
Теперь нам нужно создать файл спека (spec).
Создадим в каталоге, где мы собираемся собирать программу этот файл.
hello$ mcedit hello.spec
Добавляем в файл следующие строки:
развернутьШаблон с комментариями на русском для изучения |
---|
развернутьШаблон без комментариев на русском для продакшена |
---|
Наш каталог:
home └──hello <- Мы сейчас здесь ├── hello <- В прошлом шаге мы переименовали каталог с исходным кодом для совпадения имени репы исходного кода и пакета ├── hello.spec <- Файл спека, который мы создали ├── .gear └── .git
Внесение изменений в Git
После того, как мы внесли код, спек и настроили хэшер, внесенные изменения надо внести в Git.
Для этого переходим в каталог hello, в котором мы находились в предыдущем шаге и вносим коммит:
$ git add . $ git commit -am "Initial commit"
Сборка в Hasher
Чтобы собрать пакет в Hasher перейдите в корневой каталог проекта и выполните команду:
$ gear --hasher -- hsh --no-sisyphus-check -v
Для пересборки пакета (в случае исправления опечатки или ещё каких-то изменений без изменения зависимостей) пакет можно пересобрать командами:
$ gear --hasher -- hsh-rebuild --no-sisyphus-check -v
Отправка в git.alt
<...>
Создание пакета на основе существующего
Создание нового пакета на основе существующего
Например, в Git-репозитории ALT Linux уже есть утилитка Hello, которая подойдет для начинающих сборщиков пакетов.
https://git.altlinux.org/gears/h/hello.git.
Подготовка Git-репозитория
Первым делом нужно создать Git-репозиторий для этого пакета. Для этого мы создадим каталог и склонируем в него git-репозиторий.
$ mkdir MyRepos $ cd MyRepos MyRepos$ git clone https://git.altlinux.org/gears/h/hello.git
Наш каталог:
home └── MyRepos <- Мы сейчас здесь └── hello <- Склонированный репозиторий Git
Перейдем в каталог репозитория:
$ cd hello
Содержимое репозитория
hello ├── .gear ├── .git ├── hello └── hello.spec
Проверка .gear/rules
Перейдем в каталог .gear
hello$ cd .gear
hello ├── .gear <- Мы сейчас здесь │ └── rules <- Смотрим этот файл ├── .git ├── hello └── hello.spec
.gear$ cat rules tar.gz: hello
Правило tar.gz: hello, указывает, что каталог hello упаковывается в hello.tar.gz.
Сборка
Переходим в каталог выше:
.gear$ cd ..
hello <- Мы сейчас здесь ├── .gear ├── .git ├── hello └── hello.spec
И запускаем сборку:
$ gear --hasher -- hsh --no-sisyphus-check -v
Готовый пакет
Готовый пакет расположен по адресу:
/home/user/hasher/repo/x86_64/RPMS.hasher
"Воскрешение" "умершего" пакета
Сборка пакета из srcrpm
В ALT Linux кроме обычных пакетов есть пакеты с исходным кодом (имеют расширение *.src.rpm).
Такой пакет содержит:
- архив (один или несколько) с исходным кодом
- файл Spec (далее — просто спек)
- возможно, разнообразные патчи и дополнения.
Т.е. однажды разработчик все приготовил для того, чтобы собрать программу и упаковать ее в пакет, "заархивировал" все это в специальный файл и теперь вместо того чтобы все делать по новой (например, при обновлении программы), достаточно скачать данный пакет, подправить его содержимое и некоторые параметры и собрать новый пакет.
Пакет *.src.rpm можно использовать только для сборки двоичных пакетов, но не для установки.
Сборка осуществляется командой:
$ hsh --no-sisyphus-check -v ~/hasher '/home/user/Загрузки/hello-2.10-alt1.1.src.rpm'
Готовый пакет
Готовый *.rpm-пакет расположен по адресу:
/home/user/hasher/repo/x86_64/RPMS.hasher
Его можно установить командой:
# rpm -Uvh hello-2.10-alt1.1.rpm
Некоторые команды
Пересобрать пакет без пересборки окружения
gear --hasher -- hsh-rebuild
Войти в chroot сборки
hsh-shell
Глоссарий
- Gear - инструмент, позволяющий оперируя данными из git репозитория проводить сборку исходного текста в rpm пакет, тарболл или просто экспортировать результаты выполнения правил (gear-rules) в определённый каталог.
- Git - консольная утилита, для отслеживания и ведения истории изменения файлов, в проекте. Она отслеживает и фиксирует изменения в файлах и сохраняет их в специальных "снимках" - коммитах.
- Hasher - инструмент безопасной и воспроизводимой сборки пакетов. Все пакеты Sisyphus собираются с его помощью.
- GPG - программа шифрования информации с публичным ключом. Используется для подписи пакетов чтобы подтвердить подлинность разработчика, который выпустил данный пакет.
- RPM - формат пакетов программного обеспечения и утилита для установки данных пакетов. Так же у RPM существуют утилиты для сборки пакетов из специально приготовленных пакетов с исходным кодом.
- SSH - это защищенный сетевой протокол для удаленного управления операционной системой с помощью командной строки и передачи данных в зашифрованном виде. Он используется для передачи данных между разработчиком и сервером с пакетами.
- Исходный код - часть программного обеспечения, с которой программисты работают, чтобы изменить работу приложения или добавить новые функции.
- Патч (Patch) - программное средство, используемое для устранения проблем в программном обеспечении или изменения его функциональности
- Спек (Spec) - файл, содержащий инструкции для программы rpmbuild, необходимые для сборки пакета.