Themenentwicklung im CI/CD-Stil

Hallo,
habt ihr Vorschläge, wie man das Theme-Deployment im CI/CD-Stil angehen kann? Der Kunde erwartet alle zwei Wochen neue Theme-Releases, und wir möchten das Theme in einem automatisierten Prozess ausliefern. Wir nutzen Discourse Docker.

Wir möchten eine manuelle Installation für jedes Release vermeiden.

Nebenbemerkung: Ich weiß nicht, ob dies ein Fehler ist, aber es scheint, als würde der Branch bei der ersten Theme-Installation nicht gespeichert. (Das muss ich noch einmal überprüfen, um es zu bestätigen.)

Vielen Dank

Das ist bereits vorhanden. Wenn du ein Theme über ein Git-Repository installierst, kannst du das Theme mit einem einzigen Klick auf den neuesten Commit aktualisieren.

Das weiß ich, aber so möchten wir es nicht machen.

Wir wollen einen dynamischen Prozess haben, ohne das Discourse-Admin zu berühren. Ich dachte daran, den Themes-Befehl zu verwenden: discourse/lib/tasks/themes.rake at main · discourse/discourse · GitHub

docker exec -it app rails themes:install -- # theme data

Ich weiß nicht, ob dieser Befehl Dateien lesen kann. Zum Beispiel eine theme.yaml-Datei, die Informationen zum Thema für die Installation enthält.
Diese Datei könnte in einen freigegebenen Ordner bereitgestellt werden, und der Docker-Befehl könnte sie von dort lesen und das Thema installieren oder Updates vornehmen.

@markvanlan hat kürzlich einige Arbeiten durchgeführt, die für dich nützlich sein könnten

Es gibt einige Nutzungsinformationen in den Kommentaren hier:

@david danke, aber mir ist nicht ganz klar, ob ich einen Dateipfad als Argument angeben kann. Würde das funktionieren?

bin/rake themes:install -- theme.yaml 

Vielleicht kann ich es einfach ausprobieren.

Ich denke, du würdest es an STDIN weiterleiten, also so etwas wie

cat theme_config.yml | bin/rake themes:install

Aber ich habe das noch nicht getestet. Lass uns wissen, ob es bei dir funktioniert :slight_smile:

Dein Ansatz funktioniert einwandfrei. Danke! Bei mir funktioniert es nicht. :smiley:

Ich habe ein bisschen mit der Modifikation von themes.rake experimentiert, indem ich folgendes hinzugefügt habe:

rake themes:install themeFile="theme.yml"

Und dies:

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 ? "Ungültige JSON-Eingabe. \n#{ARGV.last}" : "Ungültiges YML: \n#{theme_args}"
        exit 1
      end
    end

  log, counts = ThemesInstallTask.install(theme_args)

  puts log

  puts
  puts "Ergebnisse:"
  puts " Installiert: #{counts[:installed]}"
  puts " Aktualisiert:   #{counts[:updated]}"
  puts " Fehler:    #{counts[:errors]}"

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

Funktioniert einwandfrei. :sweat_smile:

Wie führt man Tests für diese Datei aus?

Du solltest dies tun können:

bin/rake themes:install theme.yml

Ich habe Unterstützung für die Übergabe von JSON hinzugefügt, aber dieser Code wurde ursprünglich dafür entwickelt, eine YAML-Datei als Argument entgegenzunehmen.

Es wird gemeldet, dass es kein gültiges JSON ist

Ungültige JSON-Eingabe.
theme.yml

Meine theme.yml

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

Ich glaube, das sollte funktionieren! Ich werde mir ansehen, warum es nicht mehr funktioniert.

Alles klar, das richtige Format ist bin/rake themes:install < theme.yml. Ich werde dies im Code besser dokumentieren :slight_smile:

Super! Danke! Schön, dass ich ein bisschen helfen konnte :sweat_smile: