Авторские статьи

Ускорение процесса упаковки snap.


Прикладной программист не против предоставить своё детище для пользователей Linux, но связываться с дичайшей фрагментацией линукс экосистемы, удовольствие сомнительное. Действовать через сопровождающих - это долго и медленно. Поднимать свой репозиторий - накладно. Snap действительно может быть отличным выходом для программиста, предложив ему свой Snap Store. От программиста требуется лишь создать snap пакет и залить его в хранилище. В данной статье от разработчика Canonical Кайла Фаззари (Kyle Fazzari aka kyrofa) речь пойдёт как сделать весь процесс быстрее!

Кайл ФаззариЛюбой кто делал первые шаги в упаковке софта с помощью инструмента snapcraft мог заметить, что в целом это всё долго и медленно. Snap пакет содержит все зависимости программы, которые на этапе сборки нужно стащить (fetch) и распаковать (unpack), а учитывая, что в файле snapcraft.yaml автором программы создаются различные части-кусочки (parts), каждую из которых нужно собрать и сделать частью будущего пакета snap. По завершению первой итерации сборки в snap, нужно установить получившийся snap пакет и протестировать работу. Как только вы заметите ошибку и поймёте что всё работает не так как вы задумали, то придётся внести изменения и снова пройти через этот длительный процесс.

Типичный процесс сборки

Часто процесс упаковки программы в snap формат выглядит так:

1) В папке сборочного процесса запускается инструмент snapcraft, который считывает ваши указания из файла snap/snapcraft.yaml и начинает обрабатывать кусочки (parts), скачивая (fetch) и собирая (build) все зависимости для создания итогового snap. Это может занять много времени.

2) Установка snap пакета для проверки.

3) Осознание что что-то пошло не так.

4) Исправление кода (стартового скрипта, конфигурационных параметров и т.д.)

5) Запуск snapcraft снова.

6) В зависимости от версии snapcraft происходит одно из двух: до версии 2.34 ваши изменения ничего не меняют и создаётся такой же не устраивающий вас snap пакет; более новые версии выдают ошибку - "Эй, исходный код изменён". Последний вариант может показаться вам не менее раздражающим, но, поверьте мне, такое развитие ситуации лучше! Чуть позже будет объяснено почему.

7) В результате п.п 6 разработчик запускает snapcraft clean и возвращается к п.п 1

Стоп. Есть способы лучше!

Тщательная очистка

Допустим вы только что закончили шаг 4. Если вы запустите snapcraft clean, то удалите всё что сделал snapcraft. Все зависимости, которые были распакованы для всех кусочков (parts), весь полученный исходный код, всё! Для обычного проекта такой метод "выстрел из дробовика" не нужен. Snapcraft поддерживает очистку отдельных частей и даже индивидуальный шаг конкретного кусочка.

Пример
snapcraft clean кусочек-что-вы-изменили

Другой пример показывает что вы очищаете шаг stage у кусочка с именем part1

snapcraft clean part1 --step=stage

Используя такой подход, вы очищаете только то что нужно вам очистить и ничего больше. Все остальные части-кусочки останутся такими, какими они были. Когда вы запустите снова snapcraft, то он оставит их в покое и обновит только то, что вы очистили.

Умный snapcraft CLI

Начиная с версии 3.0, snapcraft сделали умнее, но, по ряду причин, функция по умолчанию выключена. Создайте файл ~/.config/snapcraft/cli.cfg и вставьте строки

[Lifecycle]
outdated_step_action = clean

Теперь ваш рабочий процесс упаковки будет более интуитивен:

1) В папке сборочного процесса запускается snapcraft, который считывает ваши указания из файла snap/snapcraft.yaml и начинает обрабатывать кусочки (parts), скачивая (fetch) и собирая (build) все зависимости для создания итогового snap. Это может занять много времени.

2) Установка snap для проверки.

3) Осознание что что-то пошло не так.

4) Исправление кода (стартового скрипта, конфигурационных параметров и т.д.)

5) Запуск snapcraft снова.

6) Snapcraft видит что вы изменили и обновляет тот кусочек, который это затрагивает. Переходите к шагу 2.

Намного лучше? Но и в этот процесс можно внести улучшение.

Не ставим snap для теста

Snap пакет - это squashfs образ, который по определению доступен только-для-чтения. Создание образа занимает время, а также требуется снова устанавливать пакет при каждом изменении. Эти два этапа отбирают время у собственно кодирования-исправления. Есть малоизвестная возможность snap try

Когда вы запускаете snapcraft без аргументов, то просите его пройти весь жизненный цикл и создать пакет.

Для каждого кусочка будет сделано:

  • Pull. Вначале нужно скачать требуемое. Каждый parts будет стянут (checkout для git, простое скачивание для Java SDK, локальное копирование и т.д) и помещён в свой подкаталог parts/ в виде parts/part-name/src/
  • Build. Каждый кусочек будет собран в parts/part-name/build/ и "установлен" parts/part-name/install/
  • Stage. После предыдущего этапа каждый кусочек будет объединён с другими в одном каталоге stage/, образно называемым staging area.
  • Prime. Старое название этапа - Strip. Данный этап в каталоге prime/ создаст прообраз будущего пакета в виде папок и файлов, без каких-либо лишних файлов (к примеру заголовочные файлы).
  • Snap. Этап, который непосредственно оформляет готовый пакет snap.

На шаге prime snapcraft создаст каталог prime/ и положит туда всё что составляет финальный snap пакет. Получается что последний шаг snap просто пакует каталог prime/ в squashfs образ. snap try это возможность выполнения из каталога, а не из образа squashfs.

Другими словами, появляется возможность избежать тяжёлого шага упаковки snap и потерянного времени на установку, добавляя возможность чтения/записи, что разительно меняет ваш рабочий процесс.

1) Запустите snapcraft prime, который выполнит все предыдущие этапы pull -> build -> stage и вы получите готовый каталог prime/ с построенными зависимостями, метаданными для snapd и т.д.

2) Запустите snap try prime/ и тестируйте ваш софт в snap формате.

3) Осознание что что-то пошло не так.

4) Исправьте код.

5) Снова запустите snapcraft prime, чтобы внести изменения в prime/

6) Тестируйте снова. Ваши изменения уже доступны для использования, поскольку они находятся в каталоге prime/ и не нужны snap install или snap try. Вернитесь на п.п 3

Это уже довольно быстро и приятно! Вы даже можете пропустить шаги 4 и 5 и прямиком изменять файлы в каталоге prime/, чтобы быстрее понять что необходимо для работоспособности вашего софта в snap формате. Выяснив этим хитрым хаком, вы потом внесёте изменения уже в основной процесс и приблизите получения финального рабочего snap пакета.

Оригинал Develop your snaps faster


Решил перевести статью Кайла для будущих снапкрафтеров, чтобы они не тратили своё время, как я, перестраивая всё заново на каждую ошибку. С snap try, то всё стало действительно быстро и весело. Рекомендую вам присмотреться к snap пакетам, если есть мысли представить свою или стороннюю программу для пользователей Linux систем.

Мои snap пакеты.

Дата последней правки: 2020-11-24 20:32:04

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта