Im versuchen, Schnappschüsse von meiner eigenen Website mit phantomjs - im Grunde genommen, ist dies, um ein Vorschaubild von Benutzer-eingereichten Inhalt zu erstellen. Ive installiert phantomjs auf dem Server und haben bestätigt, dass das Ausführen von der Befehlszeile gegen die entsprechenden Seiten funktioniert gut. Allerdings, wenn ich versuche, läuft es von der Website, es scheint nicht, etwas zu tun. Ich habe bestätigt, dass der Code aufgerufen wird, dass Phantom tatsächlich läuft (Ive überwacht die Prozesse und kann sehen, dass es in der Prozessliste erscheint, wenn ich es anrufe) - allerdings wird kein Bild erzeugt. Ich bin nicht sicher, wo ich suchen sollte, um herauszufinden, warum es nicht die Bilder erstellen - irgendwelche Vorschläge Der relevante Codeblock ist unten: Dec 27 12 at 3: 07 Ich verwende grunt (Javascript Task Runner) für meine Web-Entwicklung Build-Prozess. Eingeschlossen sind Dinge wie Tests mit Jasmin, Code-Checking mit Plato, Dokumentation (YUIdoc) und so weiter. Ich habe versucht, eine einfache. net (C) - Anwendung zu erstellen, die die grunt-Befehle ausführen kann und dann die Ergebnisse in ein Textfeld ausgibt. Da ich immer die grunt Befehle leicht über das cmd-Fenster ausführen kann, habe ich versucht using System. Diagnostics. Process mit cmd. exe zu tun. Hier ist, was ich versucht (für die Erstellung der Code-Dokumentation): Erste, was ist verstreut: Ich erhalte diese Ausgabe: Ja, ich benutze require. js in meinem Projekt, aber das hat nichts mit Dokumentation zu tun. Dies ist die Ausgabe, die ich normalerweise bekomme und ich erwarten würde: Und die Dokumentation wird natürlich nicht erzeugt. Aber es gibt eine Datei data. json, die im korrekten Ordner erzeugt wird, aber sie ist leer. So zumindest scheint es, dass es richtig gestartet, aber konnte nicht fortgesetzt werden () Ich habe auch versucht mit anderen Aufgaben, aber keiner von ihnen Arbeit mit einem Prozess in C. bat 13 Aug. 14 um 15: 41So bald ein Software-Entwicklungsprojekt erfordert mehr als ein Einzelne Entwickler, eine ganze Reihe von neuen Themen und Anliegen werden eingeführt, wie Teammitglieder zusammenarbeiten. Solche Dinge, wie die Kommunikation Methoden zu nutzen, wie man Fortschritte teilen und wie Konflikte zu minimieren. Teams sind im Allgemeinen in der Lage, diese Bedenken zu bearbeiten und zu bevorzugten Arbeitsweisen ohne externe Eingaben zu gelangen, wenn sie autonom und emporgegeben sind, d. H. Sie können sich selbst organisieren. Zu oft habe ich Teammitglieder, die Angst haben, Entscheidungen selbst als ihre nicht ihre Arbeit, das ist für die Manager zu sehen Leider für unsere Industrie, hat Management zu oft mit dem Regieren gleichgesetzt. Manager, die Arbeit zuweisen, sind die Klassiker dieses Denkens. Die meisten Einzelpersonen mögen nicht erzählt werden, was zu tun, besonders wenn sie wissen, dass es falsch ist, und Manager, die Aufgaben auf der Grundlage ihrer eigenen Vorurteile oft produziert das falsche Ergebnis. Auch, wenn Manager für die Verfolgung von Arbeit und Termintreue verantwortlich sind, finden viele es schwer, Mikro-Management zu widerstehen ist ein Mörder, wie Mikro-Management ist ein Moral-Abfluss. Ich habe oft gesagt, wenn die Manager versucht haben, Mikro-Management mich (wahrscheinlich weniger direkt): Ich weiß, was ich tun und wie es zu tun. Wenn ich Hilfe brauche, werde ich es finden oder mich bekannt machen. Nun, einige Leute brauchen Hilfe bei der Entwicklung von Initiative und immer zu einem Punkt, wo sie bereit sind, sich selbst bekannt zu machen oder zu identifizieren, wenn sie dies tun sollten. Manche davon sind die schlechte Verwaltung in erster Linie, dass, wenn die Menschen sich bekannt machen, erhalten sie micro-managed oder sind nicht ausreichend unterstützt (lesen Sie sich erzählt), so dass sie ruhig bleiben und verschärfen das Problem. Es ist eine gemeinsame Verantwortung der Mannschaft und des Managements, zum der Mannschaftwirksamkeit beizubehalten, also sollten beide Einzelpersonen helfen, diese Sachkenntnisse zu entwickeln. Wikipedia definiert Management als: den Akt der immer Menschen zusammen, um gewünschte Ziele und Ziele mit verfügbaren Ressourcen effizient und effektiv zu erreichen Meiner Meinung nach ist das Software-Management über die Festlegung der Ziele und Ziele, wenn theyre nicht definiert und unterstützen das Team. Dies ist in erster Linie über die Gewährleistung einer Umgebung, wo sie effizient arbeiten können und entfernen alles, was in die Quere kommt. Das, was in den Weg kommt, könnte alles sein, von der Klimaanlage, die zu kalt ist, um Problemleute vom Team zu lösen, aber es sollte sicherlich nicht der Manager sein, der in den Weg kommt (wie es der Fall wäre, wenn sie darauf bestanden hätten, jeden zu machen Entscheidung). Agile Methoden sind in der Akzeptanz so schnell gewachsen, zum Teil, weil sie es Entwicklern erlauben, gegen schlechte Management-Praktiken zurückzuweisen, die die Produktivität ersticken. Lustig genug, sie neigen auch dazu, in mehr überschaubare Projekte mit besseren Ergebnissen führen. Vielleicht ist der größte Vorteil, dass agile Methoden zu helfen, die Auswirkungen der schlechten Verwaltung zu reduzieren hilft. Bei den letzten Projekten, an denen ich gearbeitet habe, ist die Notwendigkeit für JavaScript-Tests gewachsen, da sich das Clientverhalten erhöht hat. Jüngste Verbesserungen in JavaScript-Komponenten und Bibliotheken haben es einfacher gemacht, mehr Anzeigeverhalten auf den Client zu verschieben und umfangreichere und reaktionsfähigere Benutzeroberflächen zu erstellen. Um Tests zu schreiben, um diesen Code abzudecken, habe ich die QUnit - und Jasmine-Test-Frameworks evaluiert. Jasmine besser auf die BDD Weise, die ich wollte meine Tests (insbesondere Nesting-Tests in Spezifikationen und Sub-Spezifikationen) strukturiert. Wir führen derzeit alle unsere Unit - und Integrationstests als Teil unseres TeamCity-Buildprozesses durch, aber wie integrieren wir JavaScript-Tests, die idealerweise in einer Instanz von einem oder mehreren Ziel-Browsern laufen müssen Die Lösung ist relativ einfach, aber mit einer Einschränkung (die Ich hoffe, ist vorübergehend). Geben Sie JsTestDriver ein. Dieses fantastische Projekt erlaubt es uns, JavaScript-Dateien in einen Browser zu laden und auszuführen, der vom Serverprozess erfasst wird. Einzelheiten dazu finden Sie auf der Projektseite. Grundsätzlich für einen CI-Build dieser erfasste Browser und Server-Prozess existiert auf einem Remote-Server. Die Einschränkung ist, dass dies eine interaktive Sitzung sein und derzeit Ive nur gelungen, diese Arbeit unter meiner Sitzung, die ich aktiv zu lassen und die viele fehlgeschlagene Builds verursacht, wenn die Server versehentlich neu starten. Ein Problem für einen anderen Tag. Sobald dieser Remote-Server konfiguriert ist, ist es wirklich nur eine Frage der Einrichtung der yaml-Konfigurationsdatei (jsTestDriver. conf hier): Und Ausführung etwas wie das folgende Skript: Der Server-Wert ist der Endpunkt, der auf dem Remote-Server konfiguriert ist. Die Lastwerte sind die Javascript-Dateien, die geladen und ausgeführt werden. Jasmine. js ist die Jasmine Framework-Datei und JasmineAdapter. js ist ein großer JsTestDriver Adapter, um Jasmine zu unterstützen. Sobald diese geladen sind, werden alle Jasmine-Tests in nachfolgenden Dateien ausgeführt. Im obigen Beispiel enthält fileundertest. js den Code, den wir testen möchten, und fileundertest. specs. js enthält die Jasmine-Tests. Offensichtlich können Sie so viele Dateien wie erforderlich hinzufügen und sogar enthalten Abhängigkeiten wie jQuery, aber das beginnt, ein wenig ropey zu bekommen. Es gibt ein Jasmine-Plugin, das jQuery und DOM-Manipulation für den interessierten Leser unterstützt. Die Ergebnisse werden an OutJsTestDriverResults in einem JUnit-kompatiblen Format ausgegeben, das von TeamCity gelesen werden kann, wenn dieses Skript als Teil eines Builds ausgeführt wird. Diese Ergebnisse erscheinen dann in TeamCity und alle fehlenden Tests werden leicht zu erkennen. Disclaimer: Diese Ergebnisse basieren auf mir spielen herum mit MongoDB. Ich habe sehr wenig Erfahrung / Verständnis davon so dont übernehmen etwas unten als die Wahrheit. Wie wir alle wissen, YMMV. Wurden mulling über mit MongoDB bei der Arbeit zu teilen Staat zwischen den Mitgliedern unseres Systems. Einer der Gründe, warum ich es mag ist, dass es (vor kurzem) einfach, Replik-Sets zu schaffen, um Redundanz zu schaffen. Wenn Sie jedoch sicherstellen möchten, dass Änderungen auf ein Quorum von Computern repliziert wurden oder ob tatsächlich ein MongoDB-Server erreicht wurde, müssen Sie getLastError aufrufen. Dies ist alles in MongoDB-Treiber von SafeMode transparent behandelt. Dies ist in Ordnung, aber wir müssen verstehen, die Auswirkungen der Leistung, die für die Replikation hält, da unsere Anwendung wird blockiert warten, während es auftritt. Ich setze eine virtuelle Testumgebung für diese (ich sogar Einrichtung eines Domänencontrollers, aber das ist eine andere Geschichte). Ich installierte MongoDB auf zwei Bedienern und konfigurierte sie, um ein Teil des gleichen Replikasatzes zu sein. Mein Testprogramm benutzte den offiziellen Fahrer und stellte 1000 Personen-Datensätze in eine Sammlung. Die Sammlung wurde fallengelassen, bevor jeder Modus getestet wurde. Die Testnummern waren unabhängig von der Reihenfolge der Modi konsistent. Ich habe 5 Modi getestet: kein Aufruf von getLastError (wir können nicht bestätigen, dass das Schreiben empfangen wurde) Dies zeigt deutlich, dass es einen steifen Preis für das Warten auf die Replikation zu zahlen. Sicherstellen, dass das Schreiben auf Festplatte geschrieben wurde, ist viel billiger und kann für unsere Zwecke ausreichend sein. Diese Tests wurden auf virtuellen Maschinen gehostet auf meinem Arbeitsplatz ausgeführt, so wäre es interessant, die Ergebnisse auf dedizierten Servern zu sehen. Ich liebe Bauautomation. Es fühlt sich warm an. Ich habe mit TeamCity in den letzten Wochen für die Einrichtung baut Automatisierung für viele unserer aktuellen Projekte und seine Arbeit wirklich gut. Was ist gut mit TeamCity Einfache Einrichtung mit großartigen Ergebnissen out of the box Gibt Ihnen Tonnen von Informationen und Grafiken über Ihre Builds Hohe Flexibilität Integration mit Bugtrackern Plug-in für VS für vorgetestete commit Windows-Tray-Notifier Wir wollten psake als unser verwenden Build-Scripting-Tool, weil XML ist zu ausführlich für diese Aufgabe und PowerShell gibt uns so viel Skripting-Power, wie wir jemals brauchen könnten. Die Einrichtung von psake, um unsere Lösungen zu erstellen, ist relativ trivial: Das Ergebnis des Aufrufs von invoke-psake build. ps1 Build: Ok, so können wir unsere Anwendung mit psake erstellen und testen und visuelles Feedback erhalten. Groß. Jetzt wollen wir diesen Build in TeamCity ausführen. Erste Schritte in TeamCity Dies ist kein Stück Kuchen. Direkt dorthin gibt es ein dokumentiertes Problem mit PowerShell, das verhindert, dass es ausgeführt wird, indem Sie einfach PowerShell in das Feld Befehl ausführbare Datei: Dies verursacht nur TeamCity hängen unbegrenzt wie PowerShell scheint für Eingabe warten. Es didnt sogar scheinen, um die hanged Build-Erkennung auslösen. Die Problemumgehung besteht darin, eine Batchdatei (ich nenne sie Build. bat) zu verwenden, um PowerShell aufzurufen und etwas Passwortsprache an PowerShell zu übergeben, wenn es aufgerufen wird: run-psake. ps1 ist ein PowerShell-Skript, das die Umgebung konfiguriert, dh das psake-Modul gewährleistet Wird geladen, dann führt es invoke-psake aus: So können wir nun die Command executable einfach auf Build. bat setzen: Jetzt wird TeamCity das Build ausführen, aber es berichtet nicht über Build-Fehler, Testfehler oder Build-Metriken. Sie könnten einige Kudos von Ihrem Chef, wenn jeder einzelne Berichte als Erfolg unabhängig davon, ob es kompiliert oder die Tests passieren, aber es wird nicht helfen, tatsächlich liefern Ihr Projekt. Es gibt wahrscheinlich mehrere Möglichkeiten, dies zu beheben und ich werde die Methode, die ich in meinem nächsten Beitrag. Ich nehme es als gegeben, dass jeder Leser dieser denkt, Source-Code ist wichtig. Nicht jeder fühlt sich das gleiche über Datenbank-Quellcodeverwaltung, oder vielleicht tun sie, aber sie wissen nicht, wie es zu tun. Was ist das Problem Auch in meiner kurzen Karriere hatte Ive mehr als genug Exposition in die gemeinsame Datenbank Hölle. Mit mehr als einem Entwickler auf einem Projekt, ist das Management von Datenbank-Änderungen unglaublich zeitaufwendig und fehleranfällig, wenn es von Hand gemacht wird, auch mit einem dedizierten Wächter verantwortlich für das Schema. Mit Single-Entwickler auf ein Projekt, nicht mit einem einfachen Weg zu verwalten und verfolgen Änderungen ist noch umständlich. Das Problem kommt von der Tatsache, dass, wenn ein System entwickelt, die Datenbank ändert. Es ist wichtig, dass diese Änderungen unter den Teammitgliedern kommuniziert werden, so dass, wenn sie ihre lokale Build oder weniger wahrscheinlich ihre Integrationstests laufen, dass die Anwendung nicht wegen einer fehlenden Spalte oder Tabelle brechen. Einige helle Person könnte die Idee haben, eine einzige Datenbank, die jeder arbeitet, so gibt es nur eine Version der Datenbank. Groß, Problem gelöst. Das ist, bis jemand eine Änderung vornehmen will. Nicht mit viel Alternative, bearbeiten sie die gemeinsame Datenbank, und plötzlich allones lokalen bricht Pausen. Oder mehrere Personen debuggen gleichzeitig mit der freigegebenen Datenbank. Auf diese Weise können Sie seltsame Verhalten oder Deadlocks zu garantieren. Noch schlimmer, wenn Sie einen Vormund haben, können Sie warten, bis nächsten Dienstag, um Ihre dringende Änderung anwenden, lähmende Ihre Produktivität. Shared-Datenbank-Befürworter haben Sie glauben, dass es Daten in der Datenbank, die für die Ausführung der Anwendung benötigt wird. Diese Menschen sind Narren und müssen ihre Augen für die Wunder der Einheit Tests und Integrationstests zu öffnen. Es ist die Anwendungslogik wurden entwickelt, nicht die Daten. Es gibt wahrscheinlich einige Daten, die für die Ausführung einer Anwendung erforderlich sind (statische AKA-Daten). Dies kann auf andere Weise behandelt werden. Wenn Sie für den gemeinsamen Datenbankansatz gehen, wie wissen Sie, welche Version des Schemas Sie sind, wie sicher Sie sind, dass Johnny nicht gegangen und den Datentyp auf dieser Spalte geändert oder einige kritische Nachschlagedaten gelöscht hat Es gibt wenige Garantien, die innen arbeiten dieser Weg. Schließlich, wie Sie mühelos Bereitstellung der Datenbank auf eine Vielzahl von verschiedenen Umgebungen Das erste Mal ist einfach, nur eine Sicherung und Wiederherstellung (barf, dont dies als Ratschlag). Aber was dann Die verschiedenen Umgebungen haben Daten in ihnen, so dass Sie nicht mehr Backup / Restore. So verlassen Sie mit einem Änderungsskript, entweder manuell geschrieben oder von einem Tool generiert. Letzteres ist wahrscheinlich ok für einige Leute und könnte für Sie arbeiten, aber es ist immer noch ein ziemlich manueller Prozess. Es immer noch nicht die vorherigen Probleme aber. Zusammenfassend ist es Grenzkriminellen, eine gemeinsame Datenbank für die Entwicklung zu verwenden. Durch gemeinte Datenbank Ich meine nichts anderes als eine lokale, für mich, Datenbank. Es ist ebenso kriminell, nicht Quelle Kontrolle Ihrer Datenbank. Was ist die Lösung Es gibt ein paar wichtige Anforderungen, die ich glaube, müssen angesprochen werden lösen diese Probleme. Die Lösung muss einfach zu implementieren, um mehrere Umgebungen in der Lage, entweder neu erstellen oder aktualisieren Sie die Datenbank Command-line runnable (für Builds, Scripting und Integrationstests etc.) Ive gegeben VSTS Database Edition ein gutes Gehen und während es eine anständige Lösung Im Allgemeinen, Ich mag wirklich den Einsatz Mechanismus. Es ist schwierig, die Datenbank außerhalb der IDE bereitzustellen, weshalb der Rest dieser Post nicht darum geht. Meine Lösung folgt K. Scott Allens Anleitung auf Versionierung von Datenbanken. Es ist eine benutzerdefinierte Implementierung, die viele Ideen aus dem Tarantino-Projekt leiht. Das erforderliche Setup für den Tarantino-Deployer ist weniger als elegant und scheint eine Abhängigkeit von Nant und Redgate SQL Compare zu haben, von denen wir beide intern nicht verwenden. Wie es funktioniert Jeder Satz von Änderungen an unserem Datenbankschema wird in einer separaten Datei skriptiert. Wenn ein Entwickler zwei Tabellen hinzufügen und eine Spalte löschen möchte, können sie ein SQL-Skript dieser Befehle erstellen. Das Skript muss in einem bestimmten Ordner vorhanden sein und der Namenskonvention XXXSomeDescription. sql folgen, wobei XXX eine manuell erhöhte Zahl ist. Dieses Skript wird auf die gleiche Weise wie jede andere Datei in die Quellcodeverwaltung eingecheckt. Gespeicherte Prozeduren, Aufrufe und Trigger werden getrennt in ein anderes Verzeichnis gescriptet. Statische Daten werden als einfache bedingte Insert - / Update-Anweisungen in einem dritten Verzeichnis skriptiert. Das Tool selbst ist eine Befehlszeile ausführbare Datei, die zwei Modi der Operation zurücksetzen und aktualisieren. Reset setzt die Datenbank vollständig zurück und baut sie aus den Änderungsskripts wieder auf. Es fügt auch eine Protokolltabelle der Datenbank hinzu, um zu verfolgen, was die gegenwärtige Version ist. Upgrade betrachtet diese Protokolltabelle und führt nur die Änderungsskripts aus, die nicht ausgeführt wurden. Alle Skripts werden transaktionally ausgeführt, wenn irgendwelche fehlschlagen, rollen sie zurück und weitere Ausführung hält an. Eine Regel dieses Systems ist, dass Entwickler nie ein Skript bearbeiten, sobald es eingecheckt ist. So unterstützt diese Lösung mehrere Umgebungskonfigurationen Nun ist jede Umgebung in einer Konfigurationsdatei mit dem Namen MyConfiguration. deploy konfiguriert. Diese Dateien sehen ungefähr so aus: Das Tool ausführen Beim Ausführen des Tools geben Sie eine zu implementierende Konfiguration an und es sieht in der entsprechenden. deploy-Datei für die Einstellungen aus. Die Standardkonfiguration wird in der Datei deployer. exe. config für das Tool angegeben, was bedeutet, dass die häufigste Bereitstellung (vermutlich die lokale) nur durch Ausführen der exe ausgeführt werden kann. Die Befehlszeilenoptionen sind unten. Dies kann sehr einfach von überall ausgeführt werden. Der Vorgang zum Ändern der Datenbank besteht darin, ein neues Änderungsskript hinzuzufügen und die ausführbare Datei auszuführen. Einfach. Dies ist eine typische Session für das Tool. Sein nicht besonders fantastisch, aber es erhält die Arbeit erledigt. Mit dem ersten Befehl wird die Entwicklungsdatenbank auf Version 3 heruntergefahren und neu erstellt. Der zweite Befehl aktualisiert die Datenbank von dort aus. Beachten Sie, wie die Ansichten und gespeicherten Prozeduren beide Mal neu erstellt werden. Dies ist die Migrationstabelle in der Datenbank, die alle erforderlichen Informationen für die Versionierung bereitstellt. Integrationstests und CI-Builds Für Integrationstests führen wir in der Assembly-SetUp-Methode einfach etwas ähnliches aus. Daher erhalten wir jedes Mal, wenn wir unsere Integrationstests durchführen, eine neue Datenbank zum Testen. Dies könnte auch für automatisierte Bereitstellungen von dem CI-Server verwendet werden, aber ich bevorzuge es, Datenbankänderungen an Nicht-Entwicklungsumgebungen manuell auszuführen, da sie häufig mehr beteiligt sind. Dies ist eindeutig ein Bereich zur Verbesserung aber. Das Schreiben eines Implementierungsmechanismus wie dieser ist wirklich einfach. Wenn Sie eine anständige Kenntnis von ADO. NET haben und folgen Sie Konvention über die Konfiguration sollte es nicht mehr als ein Tag oder zwei zu schreiben. Wenn Sie nicht über eine Lösung für die Datenbank-Quellcodeverwaltung verfügen, betrachten Sie zur Zeit die vorhandenen Lösungen wie VSTS Database Edition, Tarantino oder Migrator. Net, um nur einige zu nennen oder, wenn Sie Lust haben, Ihre Fähigkeiten auszudehnen, so etwas zusammen zu werfen. Ich genoss die Herausforderung. Post navigation
Comments
Post a Comment