Dies kommt von Zeit zu Zeit in mehreren unserer Entwicklerteams vor, ohne dass wir den "richtigen" Weg gefunden haben:
Wir verwenden viele reaktionsbasierte Webanwendungen, die zu statischen Websites "kompiliert" werden, bei denen es sich nur um wenige HTML-, JS- und CSS-Dateien handelt.
Das "Erstellen" dieser Apps erfordert jedoch eine Reihe von Variablen, die Feature-Flags aktivieren / deaktivieren, Backend-URLs konfigurieren usw. Dies bedeutet, dass wir keine Binärdatei im herkömmlichen Sinne "erstellen" und beim Bereitstellen nur eine Konfigurationsdatei anwenden können. Zeit - Für den "Build" selbst müssen diese umgebungsspezifischen Variablen festgelegt sein. Daher können wir nur zur Bereitstellungszeit "erstellen".
Im Moment lösen wir dies, indem wir die erforderlichen Umgebungsvariablen in den Docker-Container einfügen und einen Start-Cmd nach dem Vorbild von ausführen
npm build && nginx run
Dies hat einige Nachteile:
- Der Erstellungsprozess benötigt im Verhältnis zu den Laufzeitanforderungen des Containers viel CPU / Speicher. Das heißt, wir müssen den Container für den Erstellungsprozess skalieren, anstatt die Laufzeitanforderungen - was sich falsch anfühlt
- Build-Fehler sind schwer zu "verfolgen". Wir können Healthchecks in Kubernetes verwenden, aber wenn ein Build 2 Minuten dauert, müssen wir noch 3 Minuten warten (1 extra für die Sicherheit), bevor wir den Healthcheck-Endpunkt des Containers testen können, um festzustellen, ob er aktiv ist.
- Bereitstellungen können lange dauern: Wenn wir Kubernetes für eine "serielle" Bereitstellung konfigurieren, wird jeder Pod gestartet und auf die "initialDelay" -Periode von 2-3 Minuten gewartet, bevor mit der nächsten begonnen wird. Dies bedeutet, dass wir uns leicht eine Bereitstellungszeit von 10 Minuten ansehen können, wenn die Bereitstellung auf 3-4 Pods skaliert wird.
Das alles fühlt sich für mich sehr suboptimal an. Es würde mich sehr interessieren zu hören, wie die Community das Rätsel "Build at Deployment Time" mit modernen Javascript-Webapps löst.
Mir ist klar, dass wir für Kubernetes "Init-Container" verwenden könnten, die den Build ausführen, die Artikel in einen dauerhaften Speicher stellen und die App-Container dann beim Start einfach aus dem dauerhaften Speicher ziehen lassen, aber dies fühlt sich immer noch eher so an, als würde man das Problem "umgehen" als Lösen des Grundproblems.
quelle
npm build
zur Laufzeit anstatt während des Container-Builds?npm build
ist nur ein beliebiger Befehl. Könnte seinreact build
odersanity build
oder was auch immer das JS-Framework erwartet. Wir sind gezwungen, dies bei der Containerbereitstellung zu tun, da wir dann die Umgebung kennenbuild
.Antworten:
Aus meiner Sicht wäre der beste Ansatz:
Mit Jenkins können Sie ein kontinuierliches Liefersystem basierend auf generischen Pipelines konfigurieren. Möglicher Fluss wäre:
Dieser Vorgang kann mit Rancher visualisiert werden. Ich kann Ihre Fragen im Chat beantworten.
quelle
profiles
. Wenn Sie dies beispielsweise anfordern, erhaltenhttps://config/backend.yml
Sie die Konfiguration vonapplication.yml
und zusätzliche Eigenschaften vonbackend.yml
. Dennhttps://config/backend-stage.yml
es wird mit Eigenschaften antworten, die vonapplication.yml
<-backend.yml
<- angewendet werdenbackend-stage.yml
.