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

Материал из ALT Linux Wiki
Нет описания правки
 
(не показано 50 промежуточных версий 2 участников)
Строка 1: Строка 1:
{{stub}}
Возможно будет дорабатываться статья [[Сборка пакета с нуля]]
{{Note|В примере будет участник '''Petya Ivanov''' с email - '''petyaivanov@altlinux.org''' и именем пользователя '''petr'''}}
{{Note|В примере будет участник '''Petya Ivanov''' с email - '''petyaivanov@altlinux.org''' и именем пользователя '''petr'''}}


Строка 12: Строка 10:
Для работы с git-репозиториями ALT нужен будет SSH-ключ, который нужно сгенерировать. Его можно создать согласно инструкции с [[Работа_с_ключами_разработчика|этой страницы]].
Для работы с git-репозиториями ALT нужен будет SSH-ключ, который нужно сгенерировать. Его можно создать согласно инструкции с [[Работа_с_ключами_разработчика|этой страницы]].


  $ ssh-keygen -t ED25519 -b 4096
  $ ssh-keygen -t ED25519


{|class="wikitable mw-collapsible mw-collapsed" style="float:center; margin-left:2em"  
{|class="wikitable mw-collapsible mw-collapsed" style="float:center; margin-left:2em"  
Строка 18: Строка 16:
|-
|-
|
|
  $ ssh-keygen -t ED25519 -b 4096
  $ ssh-keygen -t ED25519
  Generating public/private ED25519 key pair.
  Generating public/private ED25519 key pair.
  '''Enter file in which to save the key (/home/petr/.ssh/id_ed25519)''':''// Указывается место сохранения открытого и закрытого ключей (в скобках указан путь по-умолчанию) Жмем {{Button|Enter}}''
  '''Enter file in which to save the key (/home/petr/.ssh/id_ed25519)''':''// Указывается место сохранения открытого и закрытого ключей (в скобках указан путь по-умолчанию) Жмем {{Button|Enter}}''
Строка 108: Строка 106:
В ALT Linux для сборки есть два инструмента.
В ALT Linux для сборки есть два инструмента.


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


В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке).
В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке).


Если какой-то пакет, необходимый для сборки, не указан в спеке, то появится ошибка. Так обеспечивается чистота сборки.
Если какой-то пакет, необходимый для сборки, не указан в спеке, то появится ошибка. Так обеспечивается воспроизводимость сборки.


Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой новой сборке в Hasher.
Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой новой сборке в Hasher.
Строка 123: Строка 121:
=== Установка инструментов для сборки ===
=== Установка инструментов для сборки ===
Для сборки пакетов нам понадобятся:
Для сборки пакетов нам понадобятся:
* Любой удобный текстовый редактор (Vim, Emacs, Mcedit);
* Любой удобный текстовый редактор (Vim, Emacs, mcedit);
* Система управления версиями '''Git'''
* Система управления версиями '''Git'''
* Сборочная среда '''Hasher'''
* Сборочная среда '''Hasher'''
Строка 162: Строка 160:


<source lang=bash>
<source lang=bash>
[cas@cas ~]$ gpg --list-secret-keys
$ gpg --list-secret-keys
------------------------------
------------------------------
sec  1024D/835560D9 2023-05-15
sec  1024D/835560D9 2023-05-15
Строка 188: Строка 186:
Добавление пользователя petr в группу hashman
Добавление пользователя petr в группу hashman
</pre>
</pre>
====Создание конфигурационного фала====
====Создание конфигурационного файла====
Так же необходимо создать пользователю в домашнем каталоге файл {{path|.hasher/config}}:
Так же необходимо создать пользователю в домашнем каталоге файл {{path|.hasher/config}}:
  $ mkdir ~/.hasher
  $ mkdir ~/.hasher
Строка 197: Строка 195:
  #workdir="/tmp/.private/petr/"
  #workdir="/tmp/.private/petr/"
  workdir="$HOME/hasher"
  workdir="$HOME/hasher"
  target='''i586'''
  target='''x86_64'''
  packager="`rpm --eval %packager`"
  packager="`rpm --eval %packager`"
  #apt_config="$HOME/.hasher/apt.conf"
  #apt_config="$HOME/.hasher/apt.conf"
Строка 203: Строка 201:


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


====Инициализация окружения Hasher====
====Инициализация окружения Hasher====
Строка 214: Строка 212:
{{Note|[[Hasher/FAQ|FAQ по Hasher]]}}
{{Note|[[Hasher/FAQ|FAQ по Hasher]]}}


===Настройка Gear===
<!--===Настройка Gear===
-->
 
===Настройка окружения RPM===
===Настройка окружения RPM===
Для настройки сборки RPM-пакетов (чтобы указать в них кто собрал данный пакет и подпись разработчика) нужно создать в домашнем каталоге файл .rpmmacros.
Для настройки сборки RPM-пакетов (чтобы указать в них кто собрал данный пакет и подпись разработчика) нужно создать в домашнем каталоге файл .rpmmacros.
Строка 263: Строка 263:
  hello$ cd .gear
  hello$ cd .gear
  .gear$ mcedit rules  
  .gear$ mcedit rules  
Наполняем файл следующими строками и сохраняем файл:
Наполняем файл следующей строкой и сохраняем его:
tar: hello name=@name@-@version@ base=@name@-@version@
{{Note|В более сложных пакетах используется конструкция вида <code><nowiki>tar.gz: . name=hello base=hello</nowiki></code>}}
  spec: hello.spec
  tar.gz: hello
*Первая срока указывает, что будет создан архив с нашим каталогом hello.
*Указанная строка {{path|tar.gz:hello}} указывает, что будет создан архив с нашим каталогом hello.
*Вторая строка указывает, что для сборки пакета нужно использовать файл hello.spec. Если спек лежит в корневом каталоге, его указывать не нужно.


Наш каталог:
Наш каталог:
Строка 277: Строка 276:


=== Импорт исходного кода ===
=== Импорт исходного кода ===
Исходный код Hello лежит на Github: [https://ftp.gnu.org/gnu/hello/ https://ftp.gnu.org/gnu/hello/].  
Исходный код Hello лежит на FTP: [https://ftp.gnu.org/gnu/hello/ https://ftp.gnu.org/gnu/hello/].  


Выходим из папки .gear в каталог выше и клонируем в него исходный код.  
Выходим из папки .gear в каталог выше и клонируем в него исходный код.  
  .gear$ cd ..
  .gear$ cd ..
  hellof$ wget https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz
  hello$ wget https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
  hello$ tar xzvf hello-2.12.tar.gz
  hello$ tar xzvf hello-2.10.tar.gz
  hello$ rm hello-2.12.tar.gz
  hello$ rm hello-2.10.tar.gz


Наш каталог:
Наш каталог:
  home
  home
  └── hello  <- Мы сейчас здесь
  └── hello  <- Мы сейчас здесь
     ├── hello-2.12 <- Мы распаковали исходный код программы сюда
     ├── hello-2.10 <- Мы распаковали исходный код программы сюда
     ├── .gear
     ├── .gear
     └── .git
     └── .git
{{Note|Т.к. для Hasher-а нужно чтобы имя пакета в spec-е и имя репозитория совпадали (а пакет у нас будет называться hello, а не hello-2.12), мы переименуем каталог с исходным кодом в соответствии с именем пакета}}
{{Note|Т.к. для Hasher-а нужно, чтобы имя пакета в spec-е и имя репозитория совпадали (а пакет у нас будет называться hello, а не hello-2.10), мы переименуем каталог с исходным кодом в соответствии с именем пакета}}
  hello$ mv hello-2.12 hello
  hello$ mv hello-2.10 hello


=== Написание спека ===
=== Написание спека ===
Строка 312: Строка 311:
Name: hello
Name: hello
#Версия программы
#Версия программы
Version: 2.12
Version: 2.10
#Номер сборки в текущем бранче
#Номер сборки в текущем бранче
Release: alt1
Release: alt1.1


#Описание на английском
Summary: GNU hello, THE greeting printing program
Summary: GNU hello, THE greeting printing program
 
#Группа в меню ([[Ярлычки_программ#Категории|см. здесь]])
Group: Development/C
#Лицензия
#Лицензия
License: GPLv3+
License: GPLv3+
#Группа в меню ([[Ярлычки_программ#Категории|см. здесь]])
Group: Development/C


#Сайт программы
#Сайт программы
Url: ftp://ftp.gnu.org/gnu/hello/
Url: ftp://ftp.gnu.org/gnu/hello/
#
 
Source: %name-%version.tar.gz
Source: %name-%version.tar.gz
#Сборщик пакета (имя и email, указывается вручную)
# explicitly added texinfo for info files
Packager: Petr Akhlamov <ahlamovpm@altlinux.org>
 


#Зависимость для сборки
#Зависимость для сборки
BuildRequires: texinfo
BuildRequires: texinfo


#Описание на английском
#Описание на английском
%description
%description
The GNU `hello' program produces a familiar, friendly greeting.  It
The GNU `hello' program produces a familiar, friendly greeting.  It
Строка 340: Строка 340:
would otherwise be unavailable to them.  Because it is protected by the
would otherwise be unavailable to them.  Because it is protected by the
GNU General Public License, users are free to share and change it.
GNU General Public License, users are free to share and change it.
#Команды сборки


%prep
%prep
Строка 361: Строка 363:


#История изменений
#История изменений
%changelog
%changelog
* Thu Oct 10 2023 Petr Akhlamov ahlamovpm@altlinux.org 2.12-alt1
- Update version
* Thu Dec 03 2015 Igor Vlasenko <viy@altlinux.ru> 2.10-alt1.1
* Thu Dec 03 2015 Igor Vlasenko <viy@altlinux.ru> 2.10-alt1.1
- NMU: added BR: texinfo
- NMU: added BR: texinfo
Строка 393: Строка 393:
* Thu Oct 23 2003 Andrey Rahmatullin <wrar@altlinux.ru> 2.1.1-alt1
* Thu Oct 23 2003 Andrey Rahmatullin <wrar@altlinux.ru> 2.1.1-alt1
- initial build
- initial build
</syntaxhighlight>
</syntaxhighlight>
|}
|}
Строка 402: Строка 403:
<syntaxhighlight lang="spec">
<syntaxhighlight lang="spec">
Name: hello
Name: hello
Version: 2.12
Version: 2.10
Release: alt1
Release: alt1.1


Summary: GNU hello, THE greeting printing program
Summary: GNU hello, THE greeting printing program
 
Group: Development/C
License: GPLv3+
License: GPLv3+
Group: Development/C


Url: ftp://ftp.gnu.org/gnu/hello/
Url: ftp://ftp.gnu.org/gnu/hello/
Source: %name-%version.tar.gz
Source: %name-%version.tar.gz
Packager: Petr Akhlamov <ahlamovpm@altlinux.org>
# explicitly added texinfo for info files
 
BuildRequires: texinfo
BuildRequires: texinfo


Строка 442: Строка 442:


%changelog
%changelog
* Thu Oct 10 2023 Petr Akhlamov ahlamovpm@altlinux.org 2.12-alt1
- Update version
* Thu Dec 03 2015 Igor Vlasenko <viy@altlinux.ru> 2.10-alt1.1
* Thu Dec 03 2015 Igor Vlasenko <viy@altlinux.ru> 2.10-alt1.1
- NMU: added BR: texinfo
- NMU: added BR: texinfo
Строка 472: Строка 469:


* Thu Oct 23 2003 Andrey Rahmatullin <wrar@altlinux.ru> 2.1.1-alt1
* Thu Oct 23 2003 Andrey Rahmatullin <wrar@altlinux.ru> 2.1.1-alt1
- initial build</syntaxhighlight>
- initial build
</syntaxhighlight>
|}
|}


Строка 487: Строка 485:


Для этого переходим в каталог hello, в котором мы находились в предыдущем шаге и вносим коммит:
Для этого переходим в каталог hello, в котором мы находились в предыдущем шаге и вносим коммит:
$ git add .
  $ git commit -am "Initial commit"
  $ git commit -am "Initial commit"
$ git add .


=== Сборка в Hasher ===
=== Сборка в Hasher ===
Чтобы собрать пакет в Hasher перейдите в корневой каталог проекта и выполните команду:
Чтобы собрать пакет в Hasher перейдите в корневой каталог проекта и выполните команду:
  $ gear --hasher -- hsh --no-sisyphus-check
  $ gear --hasher -- hsh --no-sisyphus-check -v
Для пересборки пакета (в случае исправления опечатки или ещё каких-то изменений без изменения зависимостей) пакет можно пересобрать командами:
$ gear --hasher -- hsh-rebuild --no-sisyphus-check -v


=== Отправка в git.alt ===
=== Отправка в 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}}


==Создание пакета на основе существующего==
===Создание нового пакета на основе существующего===
==="Воскрешение" "умершего" пакета===
==="Воскрешение" "умершего" пакета===


Строка 518: Строка 574:


Сборка осуществляется командой:
Сборка осуществляется командой:
  rpmbuild --rebuild package.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


В итоге получится готовый <nowiki>*</nowiki>.rpm-пакет который можно установить командой:
=Некоторые команды=
  # rpm -Uvh package.rpm
==Пересобрать пакет без пересборки окружения==
gear --hasher -- hsh-rebuild
==Войти в chroot сборки==
  hsh-shell


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


=Источники=
=Источники=
Строка 544: Строка 611:
*[[Join/Environment]]
*[[Join/Environment]]
*[[Собираем в Hasher]]
*[[Собираем в 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, необходимые для сборки пакета.

Источники