Версия пакета: `foreman-3.19.1-alt1` --- https://git.altlinux.org/gitoskop/#/gears/f/foreman.git/-/blob/sisyphus/.gear/alt.patch У нас имеется патч, который формирует группу плагинов `alt` для Foreman. Текущая схема упаковки плагинов имеет недостатки: 1. Для группы `alt` не выполняется `Bundler.require`. В текущей конфигурации дополнительно загружаются только группы: ``` /usr/lib/foreman/config/application.rb: optional_bundler_groups = %w[assets ec2 fog libvirt openstack vmware redis] ``` При этом Bundler саму группу видит: ``` cd /var/lib/foreman bundle exec ruby -rbundler -e ' Bundler.definition.dependencies .select { |d| d.name == "foreman_puppet" } .each { |d| puts "name=#{d.name} groups=#{d.groups.inspect}" } ' ``` Результат: ``` name=foreman_puppet groups=[:alt] ``` Но Foreman плагин не загружает: ``` RAILS_ENV=production bundle exec ruby -e ' require "./config/environment" puts "ForemanPuppet::Engine=#{defined?(ForemanPuppet::Engine).inspect}" ' ``` Результат: ``` ForemanPuppet::Engine=nil ``` Также: ``` RAILS_ENV=production bundle exec rake plugin:list ``` не показывает `foreman_puppet`. Из-за этого возникают проблемы в работе функциональности, предоставляемой плагинами. 2. Добавить в `optional_bundler_groups` группу `alt` — идея плохая, поскольку `Bundler.require(:alt)` начнёт загружать все gems этой группы (если не задан `require: false`). Ошибка при загрузке или инициализации одного из плагинов может привести к падению Foreman, как сейчас в Sisyphus: ``` foreman[3558]: => Booting Puma foreman[3558]: => Rails 7.1.5.1 application starting in production foreman[3558]: => Run `bin/rails server --help` for more startup options foreman[3558]: /usr/lib/ruby/gemie/gems/foreman_discovery-24.0.2/lib/foreman_discovery/engine.rb:300: warning: already initialized constant ForemanDiscovery::Engine::MANAGER foreman[3558]: /usr/lib/ruby/gemie/gems/foreman_discovery-24.0.2/lib/foreman_discovery/engine.rb:269: warning: previous definition of MANAGER was here foreman[3558]: Exiting foreman[3558]: /usr/lib/ruby/gemie/gems/foreman_discovery-24.0.2/lib/foreman_discovery/engine.rb:319:in `block (2 levels) in <class:Engine>': uninitialized constant ForemanDiscovery::Engine::Subnet (NameError) foreman[3558]: parameter_filter Subnet, :discovery_id foreman[3558]: ^^^^^^ foreman[3558]: from /usr/lib/foreman/app/registries/foreman/plugin.rb:93:in `instance_eval' foreman[3558]: from /usr/lib/foreman/app/registries/foreman/plugin.rb:93:in `register' ``` 3. Ограничивается гибкость пользователя. Вместе с `foreman` устанавливаются плагины, которые могут быть в принципе не нужны пользователю. --- Как предлагается делать: https://theforeman.org/plugins/#2.3AdvancedInstallationfromGems Текущую группу плагинов из `alt.patch` убираем. В пакет каждого плагина кладём `bundler.d/foreman_sample_plugin.rb` с содержимым: ``` gem 'foreman_sample_plugin' ``` Файл прописываем в `%files` SRPM пакета плагина. Таким образом, плагин будет подключаться или отключаться в зависимости от наличия соответствующего RPM-пакета. Практический пример для `gem-foreman-puppet`: ``` # cat /var/lib/foreman/bundler.d/foreman_puppet.rb gem 'foreman_puppet' ``` Для работы по такому принципу необходимо сохранять в runtime механизм загрузки `bundler.d`. В upstream `Gemfile` для этого имеется секция: ``` Dir["#{File.dirname(FOREMAN_GEMFILE)}/bundler.d/*.rb"].each do |bundle| instance_eval(Bundler.read_file(bundle)) end ``` Сейчас при сборке ALT через `setup-rb` исходный `Gemfile` обрабатывается и в установленный пакет попадает уже сгенерированный вариант без этой секции. Можно либо сохранить возможность обработки исходного `bundler.d/*.rb`, либо выделить для runtime-плагинов отдельную директорию `bundler.d/plugins/*.rb` и загружать её, например: ``` # ALT runtime Foreman plugin fragments Dir["#{File.dirname(FOREMAN_GEMFILE)}/bundler.d/plugins/*.rb"].sort.each do |bundle| instance_eval(Bundler.read_file(bundle)) end ``` Тогда каждый RPM-пакет плагина сможет самостоятельно добавлять и удалять свою декларацию, не требуя общей группы `alt`.