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

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


=Подготовка=
=Подготовка=
Строка 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'''
* Инфраструктура '''Gear'''
* Инфраструктура '''Gear'''
* Утилиты RPM для сборки пакетов
* Утилиты RPM для сборки пакетов
* Инструменты для сборки программ: gcc, make, python, patch.
* Утилита для импорта проектов с Github
* Доступ к [[Branches|репозиторию пакетов]]
* Доступ к [[Branches|репозиторию пакетов]]


Установка:
Установка:
  # apt-get install mcedit git hasher hasher-priv gear gcc make python patch rpmdevtools rpm-utils rpm-build rpmlint rpm-build-licenses
  # 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===
Строка 160: Строка 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
Строка 186: Строка 186:
Добавление пользователя petr в группу hashman
Добавление пользователя petr в группу hashman
</pre>
</pre>
====Создание конфигурационного фала====
====Создание конфигурационного файла====
Так же необходимо создать пользователю в домашнем каталоге файл {{path|.hasher/config}}:
Так же необходимо создать пользователю в домашнем каталоге файл {{path|.hasher/config}}:
  $ mkdir ~/.hasher
  $ mkdir ~/.hasher
  $ echo 'packager="'''Petya Ivanov <petyaivanov@altlinux.org>'''"' >~/.hasher/config
  $ mcedit ~/.hasher/config
  $ echo 'USER='''petr'''' >~/.hasher/config
Вставляем в файл следующее содержимое:
  $ echo 'workdir="/tmp/.private/petr/"' >~/.hasher/config
packager="'''Petya Ivanov <petyaivanov@altlinux.org>'''"
  $ echo 'target='''i586'''' >~/.hasher/config
  USER='''petr'''
  $ echo 'packager="`rpm --eval %packager`"' >~/.hasher/config
  #workdir="/tmp/.private/petr/"
  $ echo 'apt_config="$HOME/.hasher/apt.conf"' >~/.hasher/config
workdir="$HOME/hasher"
  $ echo 'mount=/dev/pts,/proc' >~/.hasher/config
  target='''x86_64'''
  packager="`rpm --eval %packager`"
  #apt_config="$HOME/.hasher/apt.conf"
  mount=/dev/pts,/proc


Тут смотрите на строки с командами:
Тут смотрите на строки с командами:
*'''echo packager ...''' - тут должны быть ваше имя и email
*'''packager ...''' - тут должны быть ваше имя и email
*'''echo 'USER=petr'''' - тут должно быть ваше имя пользователя, которое вы завели в '''hasher-useradd'''
*''''USER=petr'''' - тут должно быть ваше имя пользователя, которое вы завели в '''hasher-useradd'''
*'''target''' - тут должна быть архитектура, под которую будут собираться пакеты, '''i586''' или '''x86_64'''
*'''target''' - тут должна быть архитектура, под которую будут собираться пакеты, '''i586''' или '''x86_64'''
*'''workdir''' - временная папка. '''/tmp''' - обозначает, что данные будут загружаться в [[tmpfs]] (в оперативную память) и, соответственно, собираться быстрее. Если у вас не так много оперативной памяти, укажите локальный каталог, например '''$HOME/hasher'''
====Инициализация окружения Hasher====
{{Note|Данную команду нужно выполнять после ре-логина или перезагрузки}}
{{Note|Если вы указали использовать вместо оперативной памяти каталог на жестком диске, проверьте, существует ли данный каталог, и если его нет создайте его командой {{cmd|mkdir ~/hasher}}}}
$ hsh -v --initroot-only
{{Note|[[Hasher/FAQ|FAQ по Hasher]]}}
<!--===Настройка Gear===
-->


===Настройка Gear===
===Настройка окружения RPM===
===Настройка окружения RPM===
Для настройки сборки RPM-пакетов (чтобы указать в них кто собрал данный пакет и подпись разработчика) нужно создать в домашнем каталоге файл .rpmmacros.
Для настройки сборки RPM-пакетов (чтобы указать в них кто собрал данный пакет и подпись разработчика) нужно создать в домашнем каталоге файл .rpmmacros.


Создайте данный файл ~/.rpmmacros (конечно, заменив ключ и имя мейнтейнера на свои):  
Отредактируйте файл ~/.rpmmacros (конечно, заменив ключ и имя мейнтейнера на свои):  
<source lang=bash>
$ mcedit ~/.rpmmacros
</source>
 
<source lang=bash>
<source lang=bash>
$ echo "%packager Petya Ivanov <petyaivanov@altlinux.org>" >> ~/.rpmmacros
"%packager Petya Ivanov <petyaivanov@altlinux.org>"
$ echo "%_gpg_name 1B40E49FD40245D0472E4C5FD9528003835560D9" >> ~/.rpmmacros
"%_gpg_name 1B40E49FD40245D0472E4C5FD9528003835560D9"
</source>
</source>


Строка 230: Строка 246:
=Виды сборки пакетов=
=Виды сборки пакетов=
==Создание пакета с нуля==
==Создание пакета с нуля==
Для примера мы попробуем собрать утилиту [https://github.com/itsfoss/compress-pdf/ CompressPDF].
Для примера мы попробуем собрать утилиту [https://ftp.gnu.org/gnu/hello/ Hello].
=== Подготовка репозитория Git ===
=== Подготовка репозитория Git ===
Первым делом нужно создать Git-репозиторий для нужного пакета. Для этого мы создадим каталог и инициализируем в нем git-репозиторий.
Первым делом нужно создать Git-репозиторий для нужного пакета. Для этого мы создадим каталог и инициализируем в нем git-репозиторий.
  $ mkdir compresspdf
  $ mkdir hello
  $ cd compresspdf
  $ cd hello
  compresspdf$ git init .
  hello$ git init .


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


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


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


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


Выходим из папки .gear в каталог выше, создаем каталог для исходного кода и клонируем в него исходный код.  
Выходим из папки .gear в каталог выше и клонируем в него исходный код.  
  .gear$ cd ..
  .gear$ cd ..
  compresspdf$ git clone https://github.com/itsfoss/compress-pdf.git
  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


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


=== Написание спека ===
=== Написание спека ===
{{Note|[https://github.com/altlinux/specs/ Примеры спеков ALT Linux]}}
Теперь нам нужно создать файл спека (spec).
Теперь нам нужно создать файл спека (spec).


Создадим в каталоге, где мы собираемся собирать программу этот файл.
Создадим в каталоге, где мы собираемся собирать программу этот файл.
  compresspdf$ touch compresspdf.spec
  hello$ mcedit hello.spec
compresspdf$ mcedit compresspdf.spec
 
Т.к. у нас программа на Qt, мы можем взять [http://github.com/altlinux/specs/blob/sisyphus/q/qpdf/qpdf.spec пример из программы Qpdf].


Добавляем в файл следующие строки:
Добавляем в файл следующие строки:
{{Note|RPMBuild не поддерживает комментарии на русском языке, поэтому используйте на практике вариант без них.}}


<syntaxhighlight lang="bash">
{|class="wikitable mw-collapsible mw-collapsed" style="float:center; margin-left:2em"
!Шаблон с комментариями на русском для изучения
|-
|
<syntaxhighlight lang="spec">
#Название пакета
#Название пакета
Name: compresspdf
Name: hello
#Версия программы
#Версия программы
Version: 0.1
Version: 2.10
#Номер сборки в текущем бранче
#Номер сборки в текущем бранче
Release: alt1
Release: alt1.1
 
#Описание на английском
Summary: Application for compress PDF files
#Описание на русском
Summary(ru_RU.UTF-8): Утилита для сжатия PDF-файлов


Summary: GNU hello, THE greeting printing program
#Группа в меню ([[Ярлычки_программ#Категории|см. здесь]])
Group: Development/C
#Лицензия
#Лицензия
License: GNU GPL
License: GPLv3+
#Группа в меню ([[Ярлычки_программ#Категории|см. здесь]])
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.
Url: ftp://ftp.gnu.org/gnu/hello/
BuildPreReq: /proc


BuildRequires: gcc
Source: %name-%version.tar.gz
BuildArch: i586
# explicitly added texinfo for info files
 
 
#Зависимость для сборки
 
BuildRequires: texinfo
 
#Описание на английском


#Описание
%description
%description
Application for compress PDF files
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
%prep
%setup
%setup -a0


%build
%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
</syntaxhighlight>
|}
{|class="wikitable mw-collapsible mw-collapsed" style="float:center; margin-left:2em"
!Шаблон без комментариев на русском для продакшена
|-
|
<syntaxhighlight lang="spec">
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.


%define dirBuild %{_topdir}/BUILD/%{name}-%{version}
%prep
%define dirBin %{dirBuild}/%{name}-%{version}
%setup -a0
mkdir -p %{dirBin}
 
gcc "%{dirBuild}/hello.c" -o "%{dirBin}/hello.out"
%build
%autoreconf
%configure
%make_build


%install
%install
install -D -m755 "%{dirBin}/hello.out" %{buildroot}%{_bindir}/hello.out
%makeinstall
rm -rf %{dirBin}
%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


%files
* Wed Aug 15 2007 Andrey Rahmatullin <wrar@altlinux.ru> 2.3-alt1
%{_bindir}/*
- 2.3


%doc hello.c
* 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
%changelog
- initial build
* %{dateFormated} %{namePackager} <%{addressPackager}> %{version}-%{release}
- Initial build for ALT Linux Sisyphus
</syntaxhighlight>
</syntaxhighlight>
|}
Наш каталог:
home
└──hello <- Мы сейчас здесь
    ├── hello <- В прошлом шаге мы переименовали каталог с исходным кодом для совпадения имени репы исходного кода и пакета
    ├── hello.spec <- Файл спека, который мы создали
    ├── .gear
    └── .git
=== Внесение изменений в Git ===
После того, как мы внесли код, спек и настроили хэшер, внесенные изменения надо внести в Git.
Для этого переходим в каталог hello, в котором мы находились в предыдущем шаге и вносим коммит:
$ git add .
$ git commit -am "Initial commit"


=== Сборка в Hasher ===
=== Сборка в Hasher ===
Чтобы собрать пакет в Hasher перейдите в корневой каталог проекта и выполните команду:
$ 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}}
 
==="Воскрешение" "умершего" пакета===


==Сборка пакета из srcrpm==
==Сборка пакета из srcrpm==
Строка 366: Строка 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 собираются с его помощью.  
Строка 380: Строка 599:
*'''Исходный код''' - часть программного обеспечения, с которой программисты работают, чтобы изменить работу приложения или добавить новые функции.  
*'''Исходный код''' - часть программного обеспечения, с которой программисты работают, чтобы изменить работу приложения или добавить новые функции.  
*'''Патч (Patch)''' - программное средство, используемое для устранения проблем в программном обеспечении или изменения его функциональности
*'''Патч (Patch)''' - программное средство, используемое для устранения проблем в программном обеспечении или изменения его функциональности
*'''Спек (Spec)''' - файл содержащий инструкции для программы rpmbuild, необходимые для сборки пакета.
*'''Спек (Spec)''' - файл, содержащий инструкции для программы rpmbuild, необходимые для сборки пакета.


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

Источники