LINUX.ORG.RU

Как правильно запаковать проект?

 , ,


1

1

Некоторое время назад приходил сюда просить для своего проекта дампы dmidecode с реального железа. Спустя почти год проект прошёл путь от 0.1 до 0.5.1 и превратился из простого аналога dmidecode во что-то большее:

  • Имеет в базе движок на C, который предоставляет прямой доступ к типизированным данным по полям, причём кодеки в движке описываются декларативно
  • Декодирует гораздо больше структур, чем описано в спецификации, и даже гораздо больше, чем dmidecode. Многое пришлось реверс-инжинирить руками, зато теперь декодируются даже таблицы Intel vPro, FVI, AMT, MEI, SVT и так далее - даже если они перенесены на другие ID
  • Умеет определять таблицы не только по коду, но и по сигнатурам, есть платформно-зависимые модули (Acer, Dell, HP, Lenovo, AMI и так далее), auto-probing и т.п.
  • Умеет в string properties у таблиц, vendor-specific релокацию ID типов таблиц и даже бинарные оверлеи (additional information из SMBIOS specification)
  • Умеет проверять дампы своим линтером с кучей правил
  • Умеет экспортировать дампы в XML, JSON и YAML и даже анонимизировать их при сохранении
  • Имеет большой задел под компилятор прошивок SMBIOS (из YAML, JSON или XML), который может пригодиться OEM
  • Работает на Linux, FreeBSD, NetBSD, macOS и Windows

Ну и сайт и документацию как на библиотеку, так и на CLI наконец сделал. В ближайших релизах после некоторой стабилизации хочу прикрутить нативное API для C++, модуль ядра, который бы вытаскивал всё это добро на SysFS для удобства использования из скриптов, потом - API для Python, Go и Rust.

Собственно, вопрос: сейчас это всё собирается CMake с исходников на GitHub. Как лучше сделать пакеты для Linux, чтобы это можно было устанавливать без плясок с бубном, куда их лучше класть (в стандартные репы фиг прорвёшься) и вообще чего ещё хотелось бы от user experience такой штуки? Как лучше проводить тестирование, т.к. очевидно, что у реальных пользователей будут вылезать баги, где их брать в мире open-source?

Простите, если вопрос тупой, за 27 лет опыта ни разу не приходилось заниматься размещением бинарей в публичных репозиториях, это вообще мой первый крупный open-source проект и я нахожусь по этому поводу в лёгком ступоре.

Собственно, вот: https://opendmi.org/

Заранее спасибо!


Ну, если есть какая-то билд-система, то есть и возможность опакетить программу. Многие держат в репе не сами готовые пакеты, а сборочные скрипты, например. Они заводят в репе каталог packaging и туда кидают EBUILD-ы, PKGBUILD-ы, SlackBuild-ы и так далее. А майнтайнеры пакетов в дистрибутивах уже адаптируют это добро под реалии дистрибутивов. Главное, чтобы пути к файлам не были захардкожены, иначе майнтайнерам придётся патчить исходники. В последнее время ещё AppImage, snap и Docker добавились.

yars068 ★★★★★
()
Последнее исправление: yars068 (всего исправлений: 1)
Ответ на: комментарий от yars068

Там CMake и я без проблем могу сделать при помощи его CPack базовые DEB и RPM как минимум. Вопрос в том, что с ними делать дальше и как, например, обычно решается проблема с разными версиями зависимостей на разных версиях дистрибутивах. Поддерживать это самому в одно рыло кажется проблематичным.

sdnvx
() автор топика

> куда их лучше класть (в стандартные репы фиг прорвёшься)

Скачиваемые deb и rpm пакеты покроют большую часть современных дистров.

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

Учитывай, что у всех разные shared библиотеки. Используй musl или glibc минимальной целевой версии.

Общая площадка в каждом дистре своя. В арче такой является aur.archlinux.org.

> где [баги реальных пользователей] брать в мире open-source?

Добавь в man секцию BUGS с ссылкой на заведение багов.

Проси в README проекта заводить баги. Добавь секцию с благодарностью за помощь.

Заведи шаблон GitHub issue.

Некоторые при запуске утилиты пишут сообщение с просьбой о поддержке. Сообщение можно убрать через env-флаг или не выводить его при повторном запуске. Самое главное здесь не быть навязчивым.

kaldeon ★★
()
Последнее исправление: kaldeon (всего исправлений: 4)
Ответ на: комментарий от sdnvx

Ну, например, на Github можно постить пакеты из тегов – держать базовые RPM и Deb, а для всех прочих – тарболы *.tar.*z? (и в бинарниках, и в виде сырцов), и например, PKGBUILD в AUR. Этого более чем достаточно, а остальные сваяют себе пакеты сами (естественно, инструкцию по сборке приложить понадобится).

yars068 ★★★★★
()
Последнее исправление: yars068 (всего исправлений: 1)
Ответ на: комментарий от sdnvx

Про deb:

Разные версии зависимостей проблема только если у них имена файлов сменились или почему-то обратная совместимость сломана, а так в списке указывается не точная версия а минимальная или диапазон. Если речь про библиотеки, то слом совместимости случается при смене мажорной версии (libc.so.5 vs libc.so.6) - надо выпускать пакеты для каждого из вариантов который хочешь поддерживать. Компилировать в chroot-ах соответствующих например дебианов. Я например сделал chroot-ы для дебианов с 8 по 12, каждый в i386 и amd64 варианте, и скрипт с помощью которого можно выполнить в них нужные команды по списку. Но реально (именно в моём случае, у тебя может быть по-другому) для совместимых пакетов понадобились debian 8 и debian 10, т.к. скомпилированное в deb8 успешно работает и в 9, а скомпилированное в deb10 - в 11 и 12.

Сами .deb пакеты можно либо выложить на сайт для ручной установки, либо сделать с ними репозиторий.

firkax ★★★★★
()
Ответ на: комментарий от sdnvx

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

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

Разделяемые библиотеки можно положить прям в свой deb/rpm и зависеть от них. За исключением glibc.

kaldeon ★★
()
Ответ на: комментарий от kaldeon

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

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

firkax ★★★★★
()
Ответ на: комментарий от kaldeon

Да там по сути кроме glibc ничего в самой либе и не используется. ICU4C (опционально), и мелкие либы для XML/JSON/YAML, используемые CLI-тулом и тоже отключаемые. Но при этом, например, версию CMake пришлось прямо подбирать, чтобы проект собирался одновременно на всех системах хотя бы на один релиз минус от текущего актуального, и это оказалась нетривиальная задача. Вот подобные неочевидные эффекты меня больше всего и беспокоят, но вероятно стоит просто попробовать и посмотреть, на что жаловаться начнут

sdnvx
() автор топика
Ответ на: комментарий от sdnvx

> кроме glibc ничего в самой либе и не используется

Собирай со старым glibc. Он обратно-совместим (старый код будет работать на новой версии), но не прямо-совместим (новый код не будет работать на старых версиях).

kaldeon ★★
()
Ответ на: комментарий от kaldeon

От glibc там не требуется ничего особенного, а для части удобств уже есть обёртки (делались для Windows), так что это не должно быть проблемой. Насколько старую версию имеет смысл выбирать - просто посмотреть версии в основных дистрибутивах минус один-два стабильных релиза и выбрать наименьшую?

sdnvx
() автор топика
Ответ на: комментарий от sdnvx

Ну, как минимум, можно ориентироваться на oldstable и даже oldoldstable релизы Debian, но при этом поддерживать сборку на testing (но не на unstable). И вообще, в целом, обратную совместимость ломают чаще в ядре, чем в юзерспейсе.

yars068 ★★★★★
()

Там CMake и я без проблем могу сделать при помощи его CPack базовые DEB и RPM

Ты не с того конца заходишь. Тебе не надо делать бинарные дистрибутивы. Тебе надо докинуть в исходники минимум для создания пакетов из исходников.

Как лучше сделать пакеты для Linux

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

https://www.debian.org/doc/manuals/maint-guide/index.ru.html
https://wiki.debian.org/HowToPackageForDebian

Но проще поискать похожий проект на CMake и скопировать из него директорию debian. Есть утилиты типа dh_make, которые создадут готовый шаблон пакета под debian, но я не уверен, что это облегчит задачу - там тонны не нужны файлов.

Прожиточный минимум всего несколько файлов:

changelog
control
copyright
rules

Проще скопировать из похожего на твой и подправить под свой проект.

куда их лучше класть

С такой директорией тебе бинарники можно вообще не класть - есть хороший шанс, что пакет включат сами разрабы дистра. Можешь кинуть объявление в подходящий список рассылки.

Но если очень хочется именно бинарники - то лучше прогуглить их создание с помощью CI. В твоём случае - на github actions, пакты будут в релизах на самом гитхаб.

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

Не решай. Сделай одну рабочую конфигурацию под текущий стабильный релиз и ничего не делай больше. Если у тебя нет требований по минорным версиям - тебе это не надо этим заморачиваться.

Да, если с github actions есть сложности, то у SUSE есть открытый сервис по сборке пакетов в т.ч. под дебьян:

https://en.opensuse.org/openSUSE:Build_Service_Debian_builds

С этого же сервиса идёт раздача готовых бинарников.

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от LamerOk

О, спасибо огромное за ссылки на мануалы!

Но если очень хочется именно бинарники - то лучше прогуглить их создание с помощью CI. В твоём случае - на github actions, пакты будут в релизах на самом гитхаб.

Да, у меня уже стоит эта задачка в планах.

Не решай. Сделай одну рабочую конфигурацию под текущий стабильный релиз и ничего не делай больше. Если у тебя нет требований по минорным версиям - тебе это не надо этим заморачиваться.

Не, там реально совершенно базовый glibc и ничего больше не нужно. По зависимостям тулзы посмотрю, но тоже особых сюрпризов быть не должно.

Можешь кинуть объявление в подходящий список рассылки.

А что, так можно было?

sdnvx
() автор топика
Ответ на: комментарий от sdnvx

Можешь кинуть объявление в подходящий список рассылки.

А что, так можно было?

Есть списочек https://lists.debian.org/debian-devel/ , где как раз решают, какие пакеты добавить / удалить в дистрибутиве. Если у тебя есть рабочее ПО под debian, ты заинтересован в том, чтобы программа работала и готов в случае чего помочь разрабам дебьяна, а сама программа достаточно интересна - то шансы высоки, что её могут включить в дистрибутив.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Звучит отлично! Я в основном Debian и использую, любимый дистрибутив :)

sdnvx
() автор топика
Ответ на: комментарий от sdnvx

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

Не кажется.

Именно поэтому придумали флатпак. Но он только для графических утилит, т.е. не подходит. Есть снап, но он популярности не снискал. Остается AppImage в качестве универсального источника.

Дальше надо смотреть, сколько и каких зависимостей. Но в целом все уже сказали: базовый deb и rpm пакеты - должно быть достаточно. (И Арч, и Арч). Ракеты лежат на сайте, в гите.

Дальше можно смотреть в сторону своего репозитория, но это то, чего хотелось бы избежать, как я понимаю.

bbc69
()

Умеет экспортировать дампы в XML, JSON и YAML и даже анонимизировать их при сохранении

Звучит круто! Мне нравится!

bbc69
()
Последнее исправление: bbc69 (всего исправлений: 1)
Ответ на: комментарий от bbc69

Спасибо! Я к 0.6.0 ещё немного баги постабилизирую, должно хорошо выйти. А заодно и модуль ядра прикручу для sysfs. Ну это типа неделя-две, я сейчас без работы сижу, поэтому всё равно заняться больше нечем :)

sdnvx
() автор топика
Ответ на: комментарий от bbc69

Дальше надо смотреть, сколько и каких зависимостей. Но в целом все уже сказали: базовый deb и rpm пакеты - должно быть достаточно. (И Арч, и Арч). Ракеты лежат на сайте, в гите.

Зависимостей там 4 штуки - icu4c, libxml, libyaml и libyajl, все отключаемые билд-флагами - но, правда, вместе с локализацией и поддержкой соответствующих форматов.

sdnvx
() автор топика
Ответ на: комментарий от sdnvx

Оговорюсь сразу, что сам пакеты не собирал, так что к моим словам надо относиться с некоторым скептицизмом.

libxml, libyaml, libyajl

Тут проблемы быть не должно. Вряд ли там ломали обратную совместимость. Так что можно будет указать весьма широкий диапазон версий.

icu4c

Впервые слышу. Ничего не скажу.

все отключаемые билд-флагами

КМК убирать точно не стоит.

bbc69
()
Последнее исправление: bbc69 (всего исправлений: 1)

Модуль ядра в этой истории выглядит избыточным. Делай userland либу, а к ней уже биндинги к прикладным языкам (python, go, rust). А для shell-скриптов можно в cli сделать вывод в машиночитаемый формат типа xml или json

cobold ★★★★★
()
Ответ на: комментарий от cobold

Модуль ядра удобен, если нужно из скриптов что-то вытаскивать, у меня есть реальные кейсы из прода, где это нужно. Userland-либа уже есть, биндинги будут - к Python уже начал делать, Go/Rust будут позже. Машиночитаемый формат конечно хорошо, но там портянка на сервере может быть и сотня килобайт так-то, ради одно параметра на каждом вызове скрипта её дёргать и парсить через условный jq - тупит будет всё.

sdnvx
() автор топика
Ответ на: комментарий от cobold

А в чём проблема в случае опционального модуля, если он нужен для конкретной задачи? Тем более Парсинг там декларативный, описывается как набор правил для state machine поверх универсального движка. Не говоря уже о том, что даже в основном коде ядра из-за особенностей железа (а SMBIOS по сути прямо из них следует) ничуть не меньше чуднОго.

sdnvx
() автор топика

Я сделал вот так: https://gitlab.com/pekmop1024/nvme-wear

Все работает на бесплатном тарифе гитлаба, CI собирает docker image и пакеты для альмы, дебиана и арчика, хранится соответственно в регистри гитлаба и пакетном сторадже гитлаба. Уверен, то же самое можно сделать и на гитхабе. Я использую гитлаб, потому что эта репа - публичное зеркало внутреннего моего гитлаба, а писать и Gitlab CI и Github Actions мне лень.

pekmop1024 ★★★★★
()

Для Ubuntu, Debian делать релизы пакетов. Для всяких арчей сами разберутся, на aur зальют

xDShot ★★★★★
()
Ответ на: комментарий от yars068

естественно, инструкцию по сборке приложить понадобится

Там CMake, у него "инструкция" — две команды.


@sdnvx, можешь зайти в IRC/Matrix/whatever самых популярных дистров (Ubuntu, Arch, вот это всё) и "отрекламироваться", только смотри чтобы за спамера не приняли.
Когда оно будет в популярных дистрах, остальные растащат себе уже без твоего непосредственного участия.

Если у тебя CI/CD прикручено, можешь собранные бинари/пакеты в релизах выкладывать аттачами.

mord0d ★★★★★
()

Если соберёшь под FreeBSD, готов хоть сейчас потыкать.

Когда будет больше свободного времени (и если не забуду), сделаю "порт".

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Там CMake, у него «инструкция» — две команды

Там еще скрипт внутре, а вроде в дистрах способ сборки через запуск скрипта не приветствуется.
И еще этот скрипт требует git, и не собирается на релизных тарболах. Но это мелочи уже.

Khnazile ★★★★★
()
Ответ на: комментарий от mord0d

CI/CD прикручено, оно автоматом в GitHub собирается на Linux/FreeBSD/NetBSD/macOS/Windows с тестами, санитайзерами и коверейджем. Прикрутить сборку базовых deb/rpm/exe пакетов туда - в целом не проблема.

sdnvx
() автор топика
Ответ на: комментарий от Khnazile

скрипт внутре

Ну вот скрипт меня немного смутил, но его ж не обязательно юзать как он есть, просто берёшь логику из него и натягиваешь на реалии дистрибутива.

Мне, например, его на pmake придётся переписывать (потому я и не кинулся "портировать" сразу).

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Ну я собрал просто чтобы утилиту посмотреть. Мне не понравилось то что в утилиту встроена прокрутка, и нельзя просто пльзоваться скроллом в терминале.Наверное, не буду это пакетить.

Khnazile ★★★★★
()
Последнее исправление: Khnazile (всего исправлений: 1)
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария