Wie bekomme ich Hudson CI, um ein Powershell-Skript auszuführen?

8

Ich verwende Hudson Version 1.324 für CI und habe ein paar Probleme:

Umgebung:

  • Windows Server 2008
  • Powershell v1.0
  • Hudson 1.324 läuft als Dienst
  • Hudson PowerShell Plugin installiert
  • Psake (aka. "Powershell Make / Rake" erhältlich von Github) 0.23 (Alle aktuellen / neuesten Versionen ab diesem ersten Post)

Ich habe ein Powershell (PS) -Skript, das kompiliert, NUnit-Tests ausführt und bei Erfolg eine 7z-Datei der Ausgabe erstellt. Das PS-Skript funktioniert über die Befehlszeile sowohl in meiner lokalen Entwicklungsumgebung als auch auf dem CI-Server, auf dem Hudson installiert ist.

1) Ausführungsrichtlinie mit Powershell.

Ich habe anfänglich eine PS-Konsole auf dem Server ausgeführt, die Set-ExecutionPolicy Unrestricted ausgeführt hat, wodurch jedes Skript ausgeführt werden kann. (Ja, ich verstehe die Sicherheitsbedenken hier, ich versuche, etwas zum Laufen zu bringen und Unrestricted sollte die Sicherheitsprobleme entfernen, damit ich mich auf andere Probleme konzentrieren kann.)

[Das hat funktioniert und mir erlaubt, gestern das PS-Build-Skript von Hudson abzufeuern. Ich bin dann auf ein anderes Problem gestoßen, aber wir werden das mehr in Punkt # 2 besprechen.]

Sobald Hudson ein PS-Skript auslösen konnte, klagte es mit dem folgenden Fehler:

  

"C: \ Windows \ system32 \ WindowsPowerShell \ v1.0 \ powershell" & amp;   'OzSystems.Tools \ psake \ psake.ps1' '. \ Oz-build.ps1' "Der Begriff   'OzSystems.Tools \ psake \ psake.ps1' wird nicht als Cmdlet, funct erkannt   ion, ausführbares Programm oder Skriptdatei. Überprüfen Sie den Begriff und versuchen Sie es erneut.   Bei Zeile: 1 Zeichen: 2   + & amp; & lt; & lt; & lt; & lt; 'OzSystems.Tools \ psake \ psake.ps1' '. \ Oz-build.ps1' "

Mit derselben Befehlszeile kann ich das PS-Skript manuell von der Befehlszeile aus ausführen. Hudson kann PS jedoch nicht dazu bringen, dasselbe zu tun. Nachdem ich zusätzliche PS-Dokumentation angeschaut habe, habe ich das auch versucht:

%Vor%

und bekam einen ähnlichen Fehler. Es scheint keine Dokumentation für das Powershell-Plugin für Hudson zu geben. Ich habe alle Powershell-Plugin-Dateien durchgesehen und sehe nichts, was konfigurierbar ist. Ich kann keine Protokolldatei für Hudson finden, um zusätzliche Informationen zu erhalten.

Kann mir jemand hinterher helfen?

2) Ich habe gestern mit # 1 gekämpft. Ich kam in diesem AM und versuchte, nach dem Neustart des Hudson-Servers / Dienstes erneut zu graben, und jetzt scheint es, dass die ExecutionPolicy auf Restricted zurückgesetzt wurde. Ich habe getan was gestern funktioniert hat, eine PS Konsole geöffnet und Set-ExecutionPolicy bis Unrestricted . Es zeigt Unrestricted in der PS-Konsole an, aber Hudson sagt, dass es keine Rechte für die Ausführung von PS-Skripten hat. Ich habe eine neue PS-Konsole wieder geöffnet und bestätigt, dass das ExecutionPolicy immer noch Unrestriced ist - das ist es. Aber Hudson ist sich dieser Veränderung offensichtlich nicht bewusst. Wenn Sie den Hudson-Dienst erneut starten, ändert sich Hudsons Ansicht der Richtlinie nicht.

Weiß jemand, was hier vor sich geht?

Danke, Derek

    
user178557 24.09.2009, 16:27
quelle

5 Antworten

7

Ich bin gerade auf das Problem mit dem Ausführen von Powershell-Skripten in Hudson gestoßen. Die Sache ist, dass Sie einen 32-Bit-Prozess von Java ausführen, und Sie haben Hudson für 64-Bit konfiguriert, aber nicht für 32-Bit. Sehen Sie sich den folgenden Thread an, den wir bei Microsoft erstellt haben.

Ссылка

Wenn du faul bist. 1. Starten Sie Powershell (x86) aus dem Startmenü als Administrator 2. Setzen Sie die Ausführungsrichtlinie auf remotesigned

Führen Sie dies einmal und Ihre Homefree.

    
Morten 07.02.2011 15:17
quelle
2

Beim Ausführen von PowerShell von einer geplanten Aufgabe oder Hudson möchten Sie:

  1. Geben Sie den Parameter -ExecutionPolicy (in Ihrem Fall -Ex Unrestricted )
  2. an
  3. Spezifizieren Sie diesen Befehl mit entweder -Command { ... } oder -File NICHT BEIDE und nicht ohne zu spezifizieren, was Sie meinen.

Versuchen Sie es (abgesehen davon, dass ich die Verwendung relativer Pfade nicht empfehle):

%Vor%

Um klar zu sein, das funktioniert auch:

%Vor%

Die erste Zeichenfolge nach -Command wird als DER NAME EINES BEFEHLS interpretiert, und jeder nachfolgende Parameter wird als Parameter an diesen Befehl übergeben. Die Zeichenfolge ist KEIN Skript, sondern der Name eines Befehls (in diesem Fall eine Skriptdatei) ... Sie können% /%> "&'OzSystems.Tools\psake\psake.ps1'" nicht setzen, aber Sie können "OzSystems.Tools\psake\psake.ps1" auch setzen, wenn Leerzeichen vorhanden sind .

Um aus der Hilfe zu zitieren (run PowerShell -? ) betone meine:

  

-Command

     

Führt die angegebenen Befehle (und alle Parameter) so aus, als ob sie es wären       an der Windows PowerShell-Eingabeaufforderung eingegeben und dann beendet, sofern nicht       NoExit ist angegeben. Der Wert von Command kann "-", eine Zeichenkette sein. oder ein       Skriptblock.

     

Wenn der Wert von "-" lautet, wird der Befehlstext vom Standard gelesen       Eingabe.

     

Wenn der Wert von Befehl ein Skriptblock ist, muss der Skriptblock beigefügt werden       in geschweiften Klammern ({}). Sie können einen Skriptblock nur angeben, wenn Sie PowerShell.exe ausführen       in Windows PowerShell . Die Ergebnisse des Skriptblocks werden zurückgegeben       in der Parent-Shell als deserialisierte XML-Objekte, nicht als Live-Objekte.

     

Wenn der Wert von Command eine Zeichenfolge ist, muss Command der letzte Parameter sein       im Befehl, weil alle nach dem Befehl eingegebenen Zeichen sind       interpretiert als die Befehlsargumente.

    
Jaykul 14.12.2009 19:32
quelle
1

Ich habe die gleichen Probleme wie Sie (wie Sie aus meinen Kommentaren gesehen haben). Ich habe den Powershell-Launcher aufgegeben und bin mit dem Batch-Datei-Launcher zum Ausführen von Dingen übergegangen. Obwohl ich das System auf uneingeschränkt eingestellt hatte, schien diese Einstellung für Hudsons Launcher keine Rolle zu spielen. Ich weiß nicht, ob es in einem anderen Kontext oder etwas läuft, sogar Dinge zum globalen Profil hinzuzufügen. PS1 schien nicht zu helfen. Am Ende habe ich

ausgeführt %Vor%

was tut, was ich brauche, obwohl es nicht ideal ist. Ich habe den Plugin-Autor darüber per E-Mail informiert und werde ihn aktualisieren.

    
stimms 25.09.2009 16:43
quelle
1

Bei Frage 1 versuchen Sie dies (vorausgesetzt, Sie verwenden PowerShell 2.0):

"C: \ Windows \ system32 \ WindowsPowerShell \ v1.0 \ powershell -executionPolicy Unbeschränkte Datei OzSystems.Tools \ psake \ psake.ps1 C: \ {Pfad} \ oz-build.ps1"

Sie verwenden "." für den Pfad zu oz-build.ps1. Ich vermute, dass Sie den vollständigen Pfad zu Ihrer oz-build.ps1-Datei angeben müssen, damit dies funktioniert. Es sei denn, die Infrastruktur, die den obigen Befehl ausführt, hat das aktuelle Verzeichnis korrekt eingestellt. Und selbst wenn es für den "Prozess" korrekt eingestellt ist, ist dies nur für .NET / Win32-API-Aufrufe und nicht für PowerShell-Cmdlets von Bedeutung. Das aktuelle Verzeichnis in PowerShell wird anders als das aktuelle Verzeichnis des Prozesses verfolgt, da in PowerShell mehrere Runspaces gleichzeitig ausgeführt werden können. Diese Art von globalem, veränderbarem Wert funktioniert in diesem Szenario nicht gleichzeitig.

Wie für Frage # 2, unter welchem ​​Konto läuft der Hudson-Dienst? Stellen Sie sicher, dass das Konto Set-ExecutionPolicy RemoteSigned (oder uneingeschränkt) ausgeführt hat.

    
Keith Hill 24.09.2009 20:29
quelle
1

Ich habe gerade genau dieses Problem durchgemacht. Was für ein Schmerz!

Wenn Sie eine 32-Bit-JVM unter einem 64-Bit-Windows ausführen, stellen Sie sicher, dass Sie die Ausführungsrichtlinie für die 32-Bit-Powershell-Schnittstelle festlegen. Ich habe meine 32-Bit-Programmdatei hier gefunden:

%Vor%

Die 32- und 64-Bit-Powershell-Umgebungen sind vollständig voneinander getrennt, sodass das Festlegen der Ausführungsrichtlinie in der einen keine Auswirkungen auf die andere hat.

    
roufamatic 25.01.2011 19:35
quelle