Desenvolvimento de temas no estilo CI/CD

Oi,

Vocês têm alguma sugestão sobre como abordar a implantação de temas no estilo CI/CD? O cliente espera novas versões do tema a cada duas semanas, e gostaríamos de fazer o deploy do tema em um processo automatizado. Estamos usando o Discourse Docker.

Gostaríamos de evitar a instalação manual para cada versão.

Observação lateral: não sei se isso é um bug, mas parece que a branch não é salva na primeira instalação do tema. (Preciso verificar isso para confirmar)

Obrigado.

Já está disponível. Se você instalar um tema via repositório Git, pode atualizá-lo para o último commit com um único clique.

Eu sei disso, mas não é assim que queremos fazer.

Queremos ter um processo dinâmico sem precisar acessar o admin do Discourse. Estava pensando em usar o comando de temas discourse/lib/tasks/themes.rake at main · discourse/discourse · GitHub

docker exec -it app rails themes:install -- # dados do tema

Não sei se esse comando consegue ler arquivos. Por exemplo, um arquivo theme.yaml que contería as informações do tema para instalação.
Esse arquivo poderia ser implantado em uma pasta compartilhada e o comando docker poderia lê-lo de lá e instalar o tema ou fazer atualizações.

@markvanlan recentemente fez algum trabalho que pode ser útil para você

Há algumas informações de uso nos comentários aqui:

@david obrigado, mas não parece claro para mim se posso colocar o caminho do arquivo como um argumento. Isso funcionaria?

bin/rake themes:install -- theme.yaml 

Talvez eu possa tentar.

Acho que você deve redirecionar para o STDIN, algo como

cat theme_config.yml | bin/rake themes:install

Mas eu não testei isso. Nos avise se funcionar para você :slight_smile:

Sua abordagem funciona perfeitamente. Obrigado! A minha não. :smiley:

Fiz algumas experimentações modificando themes.rake ao adicionar

rake themes:install themeFile="theme.yml"

E isto:

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 " Atualizados:   #{counts[:updated]}"
  puts " Erros:    #{counts[:errors]}"

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

Funciona bem. :sweat_smile:

Como executar o spec para este arquivo?

Você deve ser capaz de fazer o seguinte:

bin/rake themes:install theme.yml

Adicionei suporte para passar JSON, mas este código foi originalmente projetado para receber um arquivo yml como argumento.

Ele informa que não é um JSON válido

Entrada JSON inválida.
theme.yml

Meu theme.yml

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

Acredito que deveria funcionar! Vou investigar por que não está mais funcionando.

Certo, o formato correto é bin/rake themes:install < theme.yml. Vou documentar isso melhor no código :slight_smile:

Legal! Obrigado! Feliz por ter podido ajudar um pouco :sweat_smile: