Упаковка приложения | Tarantool
Документация на русском языке
поддерживается сообществом
Tarantool Cartridge Cartridge CLI Команды Cartridge CLI Упаковка приложения

Упаковка приложения

Чтобы упаковать приложение, используйте команду pack:

cartridge pack TYPE [PATH] [параметры]

Передаваемые аргументы:

  • TYPE (обязательно) — тип дистрибутива. Поддерживаемые типы:

  • PATH (необязательно) — путь к директории приложения. Значение по умолчанию: . (текущая директория).

Перед упаковкой cartridge pack собирает приложение. Это процесс схож с тем, что происходит во время cartridge build. Итоговый артефакт сборки включает модули .rocks и исполняемые файлы, специфичные для системы, на которой вы собираете пакет приложения. Именно поэтому дистрибутив, собранный на одной ОС, невозможно использовать на другой: например, RPM-пакет, собранный на MacOS, не может быть установлен на машине с CentOS. Обойти это ограничение можно, выбрав сборку приложения внутри Docker-контейнера с помощью параметра --use-docker.

Примечание

Если вы используете версию Tarantool с открытым исходным кодом, tarantool будет среди зависимостей вашего артефакта. Версия Tarantool при этом будет совпадать с указанной в переменной PATH в вашей системе. Если же вы используете Tarantool Enterprise, ваш артефакт будет включать бинарные файлы tarantool и tarantoolctl из вашего SDK.

Следующие параметры управляют локальной упаковкой приложения в RPM- или DEB-дистрибутив, TGZ-архив или Docker-образ.

--name Имя приложения. Оно будет присвоено и пакету, и соответствующему сервису systemd. По умолчанию имя берется из поля package в файле .rockspec.
--version Application package version. By default, the version string is the output of git describe --tags --long, normalized to major.minor.patch.count. If the application is not a git repository, you have to set the --version flag explicitly. If you set --version flag, it will be used as provided.
--suffix Суффикс итогового имени файла или образа. Например, дистрибутив tar.gz именуется по следующему шаблону: <имя>-<версия>[.<суффикс>].<архитектура>.tar.gz.
--use-docker Принудительная сборка приложения на Cartridge в Docker. Параметр обязателен, если вы собираете Docker-образ.
--no-cache Отключение кэширования по путям. При использовании вместе с cartridge pack docker автоматически устанавливает параметр --no-cache для команды docker.

Ознакомьтесь с документацией по упаковке приложений на Cartridge в RPM/DEB-дистрибутивы и Docker-образы, чтобы узнать больше о параметрах, специфичных для этих способов упаковки.

По умолчанию пакет собирается внутри временной директории в ~/.cartridge/tmp/. Таким образом, процесс упаковки не влияет на содержимое директории вашего приложения.

Копируя файлы приложения, Cartridge игнорирует директорию .rocks.

В итоговом пакете сохраняются все права доступа к файлам, а в качестве владельца файлов кода устанавливается root:root.

Убедитесь, что для всех файлов приложения установлены права доступа не ниже a+r (a+rx для директорий). В противном случае cartridge pack выдаст ошибку.

Указать пользовательскую директорию для сборки приложения можно с помощью переменной окружения CARTRIDGE_TEMPDIR. Если такой директории не существует, она будет создана, использована для упаковки приложения, а затем удалена.

Если в переменной окружения CARTRIDGE_TEMPDIR указать существующую директорию, то приложение будет упаковано в директории CARTRIDGE_TEMPDIR/cartridge.tmp, которая затем будет удалена. Перед началом сборки пакета эта вложенная директория будет очищена.

Примечание

Это может быть актуально при сборке Docker-образов с помощью GitLab CI, так как в этом случае Docker-тома (Docker volumes) не работают должным образом с директорией tmp по умолчанию. Используйте для таких случаев CARTRIDGE_TEMPDIR=. cartridge pack ....

Этот раздел посвящен локальной сборке приложений на Cartridge. Чтобы узнать о сборке в Docker, ознакомьтесь с соответствующим разделом документации.

Независимо от того, собираете ли вы TGZ-архив, дистрибутив RPM/DEB или Docker-образ, сборка включает три этапа.

На этом этапе из директории приложения удаляется часть файлов.

  • В первую очередь с помощью git clean -X -d -f удаляются все неотслеживаемые и игнорируемые файлы, в том числе относящиеся к вложенным модулям.
  • После этого удаляется директория .git.

На этом этапе cartridge выполняет следующее:

  1. Скрипт ./cartridge.pre-build, если он есть в корневой директории приложения. Узнайте больше о скриптах pre-build и post-build. Вместо того, чтобы использовать этот скрипт, вы можете определить правила сборки, включив в файл .rockspec команды cmake, как это сделано в Cartridge.
  2. tarantoolctl rocks make. Чтобы выполнить эту команду, потребуется файл .rockspec в корневой директории приложения. Если вы создали приложение по шаблону, этот файл уже находится там. cartridge установит все зависимости, указанные в этом файле.

По завершении сборки приложение появится в директории .rocks. Его можно запустить локально из его корневой директории.

На этом этапе cartridge запускает cartridge.post-build, если такой скрипт существует. Скрипт post-build удаляет ненужные файлы, созданные во время сборки приложения — например, node_modules.

Подробную информацию вы найдете в описании скриптов pre-build и post-build.

При сборке будет автоматически создан файл VERSION.lua, в котором хранится текущая версия приложения. При подключении к экземпляру с помощью cartridge connect вы сможете проверить версию проекта, получив информацию из этого файла следующим образом:

require('VERSION')

VERSION.lua также используется при вызове cartridge.reload_roles():

-- Получение версии проекта
require('VERSION')
-- Перезапуск экземпляров после изменения файла VERSION.lua
require('cartridge').reload_roles()
-- Получение обновленной версии проекта
require('VERSION')

Примечание

Если в директории приложения уже есть файл VERSION.lua, при сборке пакета он будет перезаписан.

Вы можете кэшировать директории для упаковки приложений на Cartridge. Если вы собираете пакет для приложения несколько раз, одни и те же модули .rocks устанавливаются каждый раз заново. Чтобы ускорить процесс переупаковки, укажите пути для кэширования в файле pack-cache-config.yml, расположенном в корневой директории приложения.

Директория .rocks кэшируется по умолчанию. Путь к ней указан в стандартной конфигурации pack-cache-config.yml:

- path: '.rocks':
  key-path: 'myapp-scm-1.rockspec'
- path: 'node_modules':
  always-cache: true
- path: 'third_party/custom_module':
  key: 'simple-hash-key'

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

  • директория <путь_к_myapp>/.rocks будет кэширована в зависимости от содержания myapp-scm-1.rockspec;
  • директория <path-to-myapp>/node_modules всегда будет добавляться в кэш.
  • директория <путь_к_myapp>/third_party/custom_module будет кэширована в зависимости от значения simple-hash-key;

Эти параметры нельзя комбинировать: вы не можете одновременно указать и always-cache, и key-path.

У каждого пути в проекте может быть только один ключ кэширования. Предположим, вы кэшировали .rocks, указав файл .rockspec в качестве key-path. Затем вы изменили содержимое файла .rockspec и запустили cartridge pack. В этом случае старый кэш директории .rocks, связанный со старым ключом, будет удален. Новый кэш для .rocks будет сохранен с новым ключом после упаковки.

В кэше можно хранить не более 5 проектов с путями для кэширования. При добавлении шестого самый старый проект будет удален из директории кэша. Для каждого проекта при этом можно добавлять сколько угодно путей для кэширования.

Чтобы отключить кэширование, используйте параметр --no-cache или удалите пути из pack-cache-config.yml. Полностью сбросить кэш можно, удалив директорию ~/.cartridge/tmp/cache.