Разработка тем в стиле CI/CD

Привет!
У вас есть предложения, как подойти к развертыванию тем в рамках CI/CD? Клиент ожидает новые выпуски тем каждые две недели, и мы хотели бы автоматизировать этот процесс. Мы используем Discourse в Docker.

Мы хотим избежать ручной установки при каждом выпуске.

Кстати, не уверен, что это баг, но кажется, что ветка не сохраняется при первой установке темы. (Нужно перепроверить, чтобы подтвердить).

Спасибо.

Это уже реализовано. Если вы установите тему через репозиторий Git, вы сможете обновить её до последней версии одним кликом.

Я знаю это, но мы не хотим делать это таким способом.

Мы хотим иметь динамический процесс без вмешательства в администрирование Discourse. Я думал использовать команду тем: discourse/lib/tasks/themes.rake at main · discourse/discourse · GitHub

docker exec -it app rails themes:install -- # данные темы

Не уверен, может ли эта команда читать файлы. Например, файл theme.yaml, который содержал бы информацию о теме для установки.
Этот файл можно было бы развернуть в общую папку, и команда docker могла бы читать его оттуда, устанавливая тему или внося обновления.

@markvanlan недавно выполнил работу, которая может быть вам полезна

Информация об использовании приведена в комментариях здесь:

@david спасибо, но мне не совсем понятно, можно ли указать путь к файлу как аргумент. Сработает ли это?

bin/rake themes:install -- theme.yaml

Может, стоит попробовать.

Я думаю, вам нужно передать это через STDIN, например:

cat theme_config.yml | bin/rake themes:install

Но я не проверял это. Дайте знать, если у вас получится :slight_smile:

Ваш подход работает отлично. Спасибо! У меня не работает. :smiley:

Я немного поэкспериментировал, изменив themes.rake, добавив

rake themes:install themeFile="theme.yml"

И это:

task "themes:install" => :environment do |task, args|
  if ENV['themeFile']
    theme_args = YAML.load_file(ENV['themeFile'])
  else
    theme_args = (STDIN.tty?) ? '' : STDIN.read
    use_json = theme_args == ''
    theme_args =
      begin
        use_json ? JSON.parse(ARGV.last.gsub('--', '')) : YAML::load(theme_args)
      rescue
        puts use_json ? "Неверный ввод JSON. \n#{ARGV.last}" : "Неверный YML: \n#{theme_args}"
        exit 1
      end
    end

  log, counts = ThemesInstallTask.install(theme_args)

  puts log

  puts
  puts "Результаты:"
  puts " Установлено: #{counts[:installed]}"
  puts " Обновлено:   #{counts[:updated]}"
  puts " Ошибки:    #{counts[:errors]}"

  if counts[:errors] > 0
    exit 1
  end
end

Работает отлично. :sweat_smile:

Как запустить тесты для этого файла?

Вы должны быть в состоянии сделать следующее:

bin/rake themes:install theme.yml

Я добавил поддержку передачи JSON, но этот код изначально был разработан для принятия файла yml в качестве аргумента.

Сообщается, что это некорректный JSON

Неверный ввод JSON.
theme.yml

Мой theme.yml

test:
  url: "https://github.com/discourse/discourse-faria-theme"

Я думаю, что это должно работать! Я разберусь, почему оно перестало работать.

Хорошо, правильный формат — bin/rake themes:install < theme.yml. Я лучше опишу это в коде :slight_smile:

Отлично! Спасибо! Рад, что смог хоть немного помочь :sweat_smile: