Desarrollo de temas en estilo CI/CD

Hola,
¿Tienen alguna sugerencia sobre cómo abordar la implementación de temas de manera CI/CD? El cliente espera nuevas versiones del tema cada dos semanas y nos gustaría lanzar el tema en un proceso automatizado. Estamos utilizando Discourse Docker.

Nos gustaría evitar la instalación manual para cada lanzamiento.

Nota al margen: no sé si esto es un error, pero parece que la rama no se guarda en la primera instalación del tema. (Necesito verificarlo para confirmarlo)

Gracias

2 Me gusta

Ya está disponible. Si instalas un tema a través de un repositorio Git, puedes actualizar el tema a la última confirmación con un solo clic.

Lo sé, pero no es así como queremos hacerlo.

Queremos tener un proceso dinámico sin tocar el administrador de Discourse. Estaba pensando en usar el comando de temas discourse/lib/tasks/themes.rake at main · discourse/discourse · GitHub

docker exec -it app rails themes:install -- # datos del tema

No sé si este comando puede leer archivos. Por ejemplo, un archivo theme.yaml que contenga la información del tema para la instalación.
Ese archivo podría desplegarse en una carpeta compartida y el comando de docker podría leerlo desde allí e instalar el tema o realizar actualizaciones.

@markvanlan recientemente realizó algunos trabajos que podrían serle útiles

Hay información sobre su uso en los comentarios aquí:

8 Me gusta

@david gracias, pero no me queda claro si puedo pasar la ruta del archivo como argumento. ¿Funcionaría esto?

bin/rake themes:install -- theme.yaml

Quizás pueda intentarlo.

Creo que deberías redirigirlo a STDIN, algo así como

cat theme_config.yml | bin/rake themes:install

Pero no lo he probado. Avísanos si funciona para ti :slight_smile:

6 Me gusta

Tu enfoque funciona perfectamente. ¡Gracias! El mío no. :smiley:

Hice algunas pruebas modificando themes.rake añadiendo

rake themes:install themeFile="theme.yml"

Y esto:

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 ? "Entrada JSON inválida. \n#{ARGV.last}" : "YML inválido: \n#{theme_args}"
        exit 1
      end
    end

  log, counts = ThemesInstallTask.install(theme_args)

  puts log

  puts
  puts "Resultados:"
  puts " Instalados: #{counts[:installed]}"
  puts " Actualizados:   #{counts[:updated]}"
  puts " Errores:    #{counts[:errors]}"

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

Funciona bien. :sweat_smile:

¿Cómo se ejecutan las pruebas para este archivo?

1 me gusta

Deberías poder hacer esto:

bin/rake themes:install theme.yml

Añadí soporte para pasar JSON, pero este código fue diseñado originalmente para recibir un archivo yml como argumento.

2 Me gusta

Lanza que no es un JSON válido

Entrada JSON no válida.
theme.yml

Mi theme.yml

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

¡Creo que debería funcionar! Investigaré por qué ya no funciona.

2 Me gusta

Está bien, el formato correcto es bin/rake themes:install < theme.yml. Documentaré esto mejor en el código :slight_smile:

15 Me gusta

¡Genial! ¡Gracias! Me alegra haber podido ayudar un poco :sweat_smile:

4 Me gusta