2010-09-25 5 views
51

Nachdem richtig ein Entwicklung Server und einen Produktion Server konfiguriert einzurichten, würde Ich mag eine Staging Umgebung auf Google App Engine nützlich zu testen neu entwickelte Versionen einzurichten lebe, bevor du sie in Produktion bringst.Wie eine Staging-Umgebung auf Google App Engine

Ich kenne zwei verschiedene Ansätze:

A. Die erste Option, die app.yamlVersion ist Parameter durch Modifizierung.

version: app-staging 

Was ich nicht wie dieses Ansatzes ist, dass Produktionsdaten werden mit meiner Inszenierung Tests verschmutzt, weil (korrigiert mich wenn ich falsch liege):

  1. Staging-Version und Fertigungsversion Anteil der gleiche Datastor
  2. Staging-Version und Produktion Version teilt die gleichen Protokolle

In Bezug auf t Der erste Punkt, ich weiß nicht, ob es mit dem neuen namespaces python API "repariert" werden könnte.

B. Die zweite Option besteht darin, die app.yamlAnwendung Parameter

application: foonamestaging 

mit diesem Ansatz zu modifizieren, würde ich eine zweite Anwendung völlig unabhängig von der Fertigungsversion erstellen.
Der einzige Nachteil, den ich sehe, ist, dass ich gezwungen bin, eine zweite Anwendung zu konfigurieren (Administratoren eingerichtet).
Mit einem Backup \ Restore-Tool wie Gaebar funktioniert diese Lösung auch gut.

Welchen Ansatz verwenden Sie, um eine Staging-Umgebung für Ihre Webanwendung einzurichten?
Verfügen Sie auch über ein automatisiertes Skript, um den YAML vor der Bereitstellung zu ändern?

+0

Beachten Sie, dass Option B kann eine Verletzung der Google App Engine TOS sein. – bdonlan

+1

@bdolan Haben Sie irgendwelche Hinweise darüber? – systempuntoout

+0

http://code.google.com/appengine/terms.html 4.4. Sie dürfen nicht mehrere Anwendungen entwickeln, um eine einzelne Anwendung zu simulieren oder als eine einzelne Anwendung zu verwenden oder anderweitig auf den Dienst zuzugreifen, um Gebühren zu vermeiden. – bdonlan

Antwort

12

Ich wählte die zweite Option in meiner Einrichtung, weil es die schnellste Lösung war, und ich habe kein Skript erstellt, um den Anwendungsparameter bei der Bereitstellung zu ändern.

Aber wie ich es jetzt sehe, ist Option A eine sauberere Lösung. Sie können mit ein paar Codezeilen schalten Sie den Datenspeicher-Namespace basiert auf der Version, die Sie dynamisch aus der Umgebungsvariable CURRENT_VERSION_ID wie hier dokumentiert bekommen: http://code.google.com/appengine/docs/python/runtime.html#The_Environment

+0

Ich ging auch mit der 2. Option in der Frage, aber ich begann, bevor separate Namespaces verfügbar waren. – Cuga

+1

@systempuntoout Ich denke, es ist möglich: "Der Massenlader unterstützt ein --namespace = NAMESPACE-Flag, mit dem Sie den Namespace angeben können. Jeder Namespace wird separat behandelt, und wenn Sie auf alle Namespaces zugreifen möchten, müssen Sie iterieren durch sie." von http://code.google.com/appengine/docs/python/multenancy/multimenancy.html#Using_Namespaces_with_the_Bulkloader – Franck

+0

@ Franck klingt interessant, so scheint Option A machbar und sauber – systempuntoout

15

Wenn separaten Datenspeicher erforderlich ist, Option B für mich sieht sauberere Lösung weil:

  1. Sie können Versionen für echte Versionierung von Produktionsanwendungen behalten.
  2. Sie können die Versionsfunktion für die Verkehrsaufteilung beibehalten.
  3. Sie können die Namespaces-Funktion für die Mandantenfähigkeit beibehalten.
  4. Sie können Entitäten einfach von einer App in eine andere kopieren. Es ist nicht so einfach zwischen Namespaces.
  5. Einige APIs unterstützen Namespaces immer noch nicht.
  6. Für Teams mit mehreren Entwicklern können Sie den Upload zur Produktionsgenehmigung für eine einzelne Person erteilen.
+1

+1 für "Sie können die Namespaces-Funktion für die Mandantenfähigkeit beibehalten." – systempuntoout

+2

+1 für 6, z.B. Ich speichere auth für meine persönlichen Zugangsdaten, die ich für den Entwickler bereitstellen kann. Ich muss das Live-Konto und das Passwort jedes Mal eingeben. – Campey

+0

Ich benutze auch Option B. Allerdings, während ich versuche Push-to-deploy zu verwenden, finde ich es schwierig, diesen Ansatz zu verwenden, da ich eine app.yaml pro Umgebung (vor Push-to-deploy, ich einfach hatte ein Skript, das den Anwendungsparameter vor der Bereitstellung änderte und dann zurücksetzte) oder verschiedene Zweige mit jeweils (möglicherweise in Konflikt stehenden) app.yamls verwendete – marianosimone

4

Wir verwenden Option B.

Zusätzlich Vorschläge über die Vorteile Zygmantas Entwickler von prod auf Anwendungsebene der Trennung, die wir verwenden unsere dev Anwendung auch die Leistung zu testen.

Normalerweise läuft die dev-Instanz ohne viel verfügbare Ressourcen, dies hilft zu erkennen, wo sich die Anwendung langsam anfühlt. Wir können dann auch unabhängig die Leistungseinstellungen anpassen, um zu sehen, was den Unterschied ausmacht (z. B. Front-End-Instanzklasse).

Natürlich müssen wir manchmal in den sauren Apfel beißen und zwicken & Uhr auf Live. Aber es ist schön, die andere Anwendung zum Spielen zu haben.

Noch Namespaces und Versionen verwenden, nur Dev ist schmutzig und experimentell.

5

Wir sind mit der Option B. ging zu verarbeiten Und ich denke, es ist besser, im Allgemeinen ist, wie es die Projekte vollständig isoliert. Wenn Sie also zum Beispiel mit einigen Konfigurationen auf dem Staging-Server herumspielen, wird die Sicherheit nicht beeinträchtigt und beeinträchtigt auch keinen anderen Schmetterlingseffekt in Ihrer Produktionsumgebung.

Wie für das Bereitstellungsskript können Sie einen beliebigen Anwendungsnamen in Ihrer app.yaml haben. Einige Dummy/dev Namen und wenn Sie bereitstellen, verwenden Sie einfach einen -A Parameter:

appcfg.py -A your-app-name update . 

Das Ihr deploy Skript vereinfachen wird ziemlich viel, keine Notwendigkeit zu Zeichenfolge ersetzen oder etwas ähnliches in Ihrer app.yaml