Константин рассказал про новый подход в структурировании и поставке приложений в Tarantool:
как управлять зависимостями (rockspec + друзья);
как писать и запускать юнит- и интеграционные тесты;
покажу превью нового тестового фреймворка для приложений;
как паковать приложения вместе с зависимостями (и почему мы выбрали статическую линковку);
как задеплоить в продакшн с systemd.
11. Проблема: rpm
• Не для всего есть rpm spec
• Или оно не up to date
• Или не для вашего дистрибутива
• Или протухло
• Нужно зеркало
12. В итоге с rpm
• В целом повторяемо
• Но нужен yum repo под каждый проект
• Нужно писать rpm спеки
• Сложновато
13. Зависимости с luarocks
• это такой pip/gem для Lua
• описание пакета - текстовый файл rockspec
• CLI для установки/апгрейда
• Может собирать из сорцов во время установки
14. Установка в систему
• sudo luarocks install (глобально)
• Либо в rockspec
...
dependencies = {
'lua >= 5.1',
'expirationd',
'checks >= 2.0.0',
}
...
15. Установка в проект
• tarantoolctl rocks install
• ставится в папку .rocks
• типа virtualenv/bundler
17. Хитрость с tarantoolctl rocks
• Наберем tarantoolctl rocks make
• Зависимости из rockspec поставятся в .rocks
• Проект соберется так как сказано в rockspec
• В текущей папке - все необходимое!
• Легко повторять
18. Ставим без rpm
• ansible-playbook
• Деплоим сорцы
• Компилим при деплое
• Просто и понятно
• Можно делать форки
19. Ставим в rpm
• rpm spec: tarantoolctl rocks make
• Собираем
• Упаковываем все в один пакет
20. Загрузка из .rocks
• Обычно работает относительно $CWD
• Не работает с tarantoolctl
• Не работает когда мы не в "корне приложения"
• Выход - новый package.setsearchroot()
21. Точка входа
• Вместо myapp.lua -> ./init.lua
• package.setsearchroot() в самом начале файла
• Приложение похоже на библиотеку
22. Тестирование
• Есть куча способов
• Много отличий между проектами
• Не всегда понятно как запускать
24. Новый тестовый фреймворк luatest
• Полностью на lua, без внешних зависимостей
• Встроенный harness
• Репортинг
• Работает с luarocks 3
• Раннер для тарантула
• Юнит тесты/интеграционные тесты
25. local t = require('luatest')
local g = t.group('server')
local Server = t.Server
g.test_start_stop = function()
local workdir = fio.pathjoin(datadir, 'start_stop')
fio.mktree(workdir)
local s = Server:new({command = command, workdir = workdir})
s:start()
fiber.sleep(0.1)
t.assertEquals(os.execute('ps -p ' .. s.process.pid .. ' > /dev/null'), 0)
s:stop()
fiber.sleep(0.1)
end
Пример теста
32. Линковка
• Всегда приходится ставить компилятор
• Даже если вы просто хотите http сервер
• А бинарные пакеты зависят от ОС
• luarocks в основном удобен для сорцов
34. Модули luarocks без зависимостей
• пример - kafka
• tarantoolctl rocks STATIC_BUILD=ON install kafka
• или сорцы - из git submodule
35. Статическая сборка tarantool
• см. Dockerfile.staticbuild
• собираем статический бинарник
• зависимости - libc, pthread
• кладем бинарник tarantool в папку приложения
• упаковываем все вместе
36. Плюсы статической сборки
• приложение самодостаточное
• принеси на любой linux и запусти
• разработка и тестирование только средствами tarantool
• один артефакт и один пакет на все приложение