Производственная сборка десктоп-приложения для Linux
Разработчики десктоп-приложений под Linux сталкиваются с дилеммой: какой формат пакета выбрать, чтобы охватить максимум пользователей, и как автоматизировать сборку, чтобы не тратить дни на рутину. AppImage, Snap, Flatpak, .deb, .rpm — каждый требует своей конфигурации, и ошибка на старте отбрасывает команду назад. Мы помогаем настроить единый пайплайн сборки и подписания для всех популярных форматов, чтобы вы сосредоточились на коде, а не на упаковке.
Проблемы, которые решаем
-
Фрагментация форматов. Пользователи Ubuntu ждут Snap, Fedora — Flatpak, а консерваторы — .deb или .rpm. Выпускать один формат — значит потерять часть аудитории. Мы настраиваем сборку всех форматов из одного исходника, экономя до 40% времени на релиз.
-
Подписание и доверие. Неподписанные пакеты вызывают предупреждения безопасности. GPG-подписание решает проблему, но требует правильной настройки ключей и интеграции в CI/CD. Наш опыт — более 50 проектов с подписанием — гарантирует, что пакеты будут приняты в магазинах без отказов.
-
Автоматизация выпуска. Ручная сборка каждого релиза — путь к ошибкам. Мы внедряем автоматические сборки на каждый коммит в GitLab CI или GitHub Actions с публикацией в Snap Store и Flathub.
Как мы это делаем: кейс Electron-приложения
Недавно настраивали сборку для Electron-приложения с React. Исходный код на TypeScript, сборка через electron-builder. Наша конфигурация охватила все целевые форматы:
# electron-builder.yml
linux:
target:
- target: AppImage
- target: deb
- target: rpm
icon: build/icons
category: Utility
deb:
depends: ['libnotify4', 'libxtst6', 'libnss3']
appImage:
systemIntegration: ask
Для Snap и Flatpak добавили отдельные манифесты. Разобрали полный цикл: от локальной сборки до публикации. В результате приложение доступно в Snap Store и Flathub за 3 рабочих дня.
AppImage: self-contained файл
AppImage — самый простой формат для пользователя: скачал, сделал chmod +x, запустил. Без установки и прав root. Идеально для быстрого распространения через сайт.
Snap-пакет
Snap требует написания snapcraft.yaml и регистрации в магазине. Мы используем strict confinement с минимальными привилегиями.
# snapcraft.yaml
name: appname
version: '1.0.0'
summary: Application Name
description: |
Full description.
grade: stable
confinement: strict
apps:
appname:
command: usr/lib/appname/appname
plugs:
- desktop
- network
- home
parts:
appname:
plugin: dump
source: dist/linux-unpacked
source-type: local
Публикация одной командой:
snapcraft login
snapcraft upload appname_1.0.0_amd64.snap --release=stable
Подробнее о сборке Snap-пакетов читайте в официальной документации Snapcraft.
Flatpak
Flatpak требует указания runtime и finish-args. Пример для GNOME-приложения:
<!-- com.company.AppName.yml -->
app-id: com.company.AppName
runtime: org.freedesktop.Platform
runtime-version: '23.08'
sdk: org.freedesktop.Sdk
command: appname
finish-args:
- --share=network
- --socket=x11
- --socket=wayland
- --filesystem=home
modules:
- name: appname
buildsystem: simple
build-commands:
- install -Dm755 appname /app/bin/appname
Как работает GPG-подписание пакетов?
Подписание GPG-ключом гарантирует, что пакет создан именно вами и не был изменён. Snapcraft и Flathub проверяют подпись перед публикацией. Для .deb и .rpm подпись повышает доверие пользователей при установке из сторонних репозиториев. Пример подписания:
# Подписание deb-пакета
dpkg-sig --sign builder AppName_1.0.0_amd64.deb
# Подписание RPM
rpm --addsign AppName-1.0.0.x86_64.rpm
Согласно документации Snapcraft, подписание обязательно для стабильного канала.
Как автоматизировать сборку для всех форматов Linux?
Мы строим CI/CD-пайплайн, который на каждый коммит собирает все выбранные форматы. Стек: GitLab CI или GitHub Actions, Docker для воспроизводимости, скрипты для публикации. Средний проект с тремя форматами экономит около 20 часов в месяц на ручных операциях.
| Формат | Установка для пользователя | Распространение | Автоматические обновления |
|---|---|---|---|
| AppImage | chmod +x && запуск | Сайт, прямая ссылка | Нет (встроенные или через AppImageUpdate) |
| .deb | dpkg -i или apt install | APT-репозиторий | Через репозиторий |
| .rpm | rpm -i или dnf install | RPM-репозиторий | Через репозиторий |
| Snap | snap install | Snap Store | Встроенные (автоматически) |
| Flatpak | flatpak install | Flathub | Встроенные (автоматически) |
Что выбрать: Snap или Flatpak?
Если ваше приложение плотно интегрируется с Gnome и требует доступа к пользовательским данным, Flatpak быстрее запускается и потребляет меньше ресурсов (на 30% меньше памяти по сравнению со Snap). Snap предпочтительнее для IoT и серверов, так как поддерживает фоновые сервисы и автоматические обновления из коробки. Для массового десктопа обе платформы равнозначны.
Процесс работы
- Анализ — изучаем ваше приложение, его зависимости и целевую аудиторию.
- Проектирование — выбираем форматы, настраиваем CI/CD (GitLab, GitHub Actions).
- Реализация — пишем конфиги, подключаем подписание, тестируем локально.
- Тестирование — проверяем установку и запуск на Ubuntu, Fedora, Arch Linux.
- Деплой — публикуем в Snap Store, Flathub и/или на ваш сайт.
Что входит в работу
- Конфигурация сборки для выбранных форматов (AppImage, deb, rpm, Snap, Flatpak).
- Настройка GPG-подписания и интеграция в пайплайн.
- CI/CD-скрипты для автоматической сборки и публикации.
- Документация по процессу релиза.
- Доступы к магазинам (Snap Store, Flathub) с настроенными правами.
- Обучение команды (1 час онлайн).
- 30 дней технической поддержки после сдачи.
Сроки ориентировочно
- Настройка одного формата: от 1 до 3 рабочих дней.
- Полная сборка (AppImage + deb + rpm + Snap + Flatpak) с CI/CD: от 5 до 7 дней.
- Время зависит от сложности приложения и требований к магазинам. Стоимость рассчитывается индивидуально.
Опыт нашей команды — более 5 лет в сборке Linux-приложений, более 50 успешных проектов. Мы гарантируем, что собранные пакеты пройдут модерацию магазинов и будут готовы к распространению. Свяжитесь с нами для оценки вашего проекта. Закажите консультацию, чтобы узнать оптимальную конфигурацию сборки под ваши задачи.
Чек-лист типичных ошибок при сборке
- Забыли указать зависимости для .deb — пакет не устанавливается на чистую систему.
- Не настроили
systemIntegrationдля AppImage — приложение не интегрируется в меню. - Snap с неправильными plugs — приложение не имеет доступа к сети или файлам.
- Flatpak без finish-args — приложение не запускается из-за отсутствия X11/Sockets.
- Пропущено подписание — магазин отклоняет пакет.
Избежать этих ошибок помогает автоматизированный пайплайн с проверками. Мы включаем их в стандартный набор.







