2009-09-24 10 views
8

Ich verwende Hudson Version 1.324 für CI und ein paar Probleme haben:Wie bekomme ich Hudson CI, um ein PowerShell-Skript auszuführen?

Umwelt:

  • Windows Server 2008
  • Powershell v1.0
  • Hudson 1.324 als ein Laufen Service
  • Hudson Powershell Plugin installiert
  • Psake (aka. "Powershell Make/Rake" erhältlich von Github) 0.23 (Alle aktuellen/neuesten Versionen ab diesem ersten Beitrag)

Ich habe ein Skript, Powershell (PS), die, laufen NUnit Tests, und wenn sie erfolgreich sind, erstellen Sie eine 7z-Datei der Ausgabe zu kompilieren funktioniert. 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 startete zunächst eine PS-Konsole auf dem Server, lief Set-ExecutionPolicy Unrestricted, die jedes Skript ausgeführt werden kann. (Ja, ich verstehe die Sicherheitsbedenken hier, ich versuche, etwas zur Arbeit zu bringen, und Unrestricted sollte die Sicherheitsprobleme entfernen, damit ich mich auf andere Probleme konzentrieren kann.)

[Das funktionierte, und erlaubte mir, das abzufeuern PS Build-Skript von Hudson gestern. . Ich habe dann ein weiteres Problem gestoßen, aber wir werden in Artikeln # 2, dass mehr diskutieren]

Sobald Hudson eine PS-Skript abfeuern konnte, beschwerte es mit dem folgenden Fehler:

"C:\Windows\system32\WindowsPowerShell\v1.0\powershell "& 'OzSystems.Tools\psake\psake.ps1' '.\oz-build.ps1'" The term 'OzSystems.Tools\psake\psake.ps1' is not recognized as a cmdlet, funct ion, operable program, or script file. Verify the term and try again. At line:1 char:2 + & <<<< 'OzSystems.Tools\psake\psake.ps1' '.\oz-build.ps1'"

den gleichen Befehl verwenden Ich bin in der Lage, das PS-Skript von der Kommandozeile aus erfolgreich auszuführen. Hudson kann PS jedoch nicht dazu bringen, dasselbe zu tun. Nach dem Blick auf zusätzliche PS-Dokumentation habe ich auch versucht, diese:

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 dabei helfen?

2) Ich verbrachte gestern Wrestling mit # 1. 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 und Set-ExecutionPolicy zu Unrestricted geöffnet. Es zeigt Unrestricted in der PS-Konsole, aber Hudson sagt, dass es keine Rechte für die Ausführung von PS-Skripten hat. Ich öffnete eine neue PS-Konsole und bestätigte, dass die ExecutionPolicy immer noch Unrestriced ist - es ist. Aber Hudson ist sich dieser Veränderung offensichtlich nicht bewusst. Wenn Sie den Hudson-Dienst erneut starten, ändert dies nichts an Hudsons Ansicht der Richtlinie.

Weiß jemand, was hier vor sich geht?

Danke, Derek

+0

Ich laufe auf genau das gleiche Problem. Ehrlich, wie diese Powershell-Sache mit bash vergleichbar sein soll, ist mir ein Rätsel. Zu viel Sicherheit! – stimms

+0

Es hat nicht geholfen, den schmerzhaften Prozess zu durchlaufen, der das Skript signiert (http://www.hanselman.com/blog/SigningPowerShellScripts.aspx). FYI. – stimms

+0

Stellen Sie sicher, dass Sie die Ausführungspolicy für den Scope CurrentUser nicht anstelle von Scope LocalMachine festgelegt haben und stellen Sie sicher, dass Hudson nicht versucht, Ihre Builds auf einem anderen Client auszuführen;) – Jaykul

Antwort

1

Zu Frage # 1, versuchen, diese (vorausgesetzt, Sie Powershell 2.0 verwenden):

„C: \ Windows \ system32 \ Windows \ v1.0 \ Powershell -ExecutionPolicy Unrestricted - 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 gleichzeitigen Szenario nicht.

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

+0

Keith, I ' Ich habe die Vorschläge für # 1 ausprobiert. Gleiche Probleme. Für # 2, ja, ich habe sichergestellt, dass die ExecutionPolicy für das Konto festgelegt ist, unter dem Hudson läuft. Es ist uneingeschränkt, wenn ich mich manuell anmelde, um die ExecutionPolicy zu überprüfen. Hudson sagt immer noch, dass Skripte deaktiviert sind. Wir sind dabei, Powershell zu stürzen und Rake mit Hudson zu versuchen. Es scheint, PS ist nicht ganz bereit für die Prime Time, oder zumindest nicht so konsequent, dass wir uns darauf verlassen können. Danke für den Eingang Keith! – user178557

+0

Bevor Sie aufgeben, versuchen Sie es mit dem Parameter -ExecutionPolicy Unrestricted. Ich habe das obige Beispiel geändert, um dies zu zeigen. –

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. Was ich am Ende getan habe, war

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.

2

Wenn Powershell aus einer geplanten Aufgabe oder Hudson Laufen Sie wollen:

  1. den -ExecutionPolicy Parameter angeben (in Ihrem Fall: -Ex Unrestricted)
  2. diesen Befehl NICHT entweder-Command { ... } oder -File mit angeben BEIDE und nicht ohne Angabe, was Sie meinen.

die Sie interessieren (außer, dass ich nicht empfehlen relative Pfade verwenden):

PowerShell.exe -Ex Unrestricted -Command "C:\Path\To\OzSystems.Tools\psake\psake.ps1" ".\oz-build.ps1" 

Um klar zu sein, wird dies auch funktionieren:

PowerShell.exe -Ex Unrestricted -Command "&{&'OzSystems.Tools\psake\psake.ps1' '.\oz-build.ps1'}" 

Die erste Zeichenkette 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, es ist der Name eines Befehls (in diesem Fall eine Skriptdatei) ... Sie kann nicht setzen "&'OzSystems.Tools\psake\psake.ps1'", aber Sie können "OzSystems.Tools\psake\psake.ps1" setzen, auch wenn es Leerzeichen hat.

von Hilfe (run PowerShell -?) Hervorhebung von mir zu zitieren:

-Command

Executes the specified commands (and any parameters) as though they were typed at the Windows PowerShell command prompt, and then exits, unless NoExit is specified. The value of Command can be "-", a string. or a script block.

If the value of Command is "-", the command text is read from standard input.

If the value of Command is a script block, the script block must be enclosed in braces ({}). You can specify a script block only when running PowerShell.exe in Windows PowerShell. The results of the script block are returned to the parent shell as deserialized XML objects, not live objects.

If the value of Command is a string, Command must be the last parameter in the command , because any characters typed after the command are interpreted as the command arguments.

1

ich durch dieses genaue Problem nur bekam. 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 fand meine 32-Bit ausführbare hier:

C:\Windows\syswow64\Windowspowershell\v1.0\powerhsell.exe 

Die 32- und 64-Bit-Powershell-Umgebungen sind so völlig verschieden die Ausführungsrichtlinie in einer Einstellung hat keine Auswirkungen auf die anderen.

7

Ich stieß gerade auf das Problem der Ausführung von Powershell-Skripten in Hudson. 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.

http://social.technet.microsoft.com/Forums/en/winserverpowershell/thread/a9c08f7e-c557-46eb-b8a6-a19ba457e26d

Wenn Ihr faul. 1. Starten Sie Powershell (x86) aus dem Startmenü als Administrator 2. Legen Sie die Ausführungsrichtlinie zu remotesigned

Führen Sie diese einmal und Ihre homefree.

+0

Danke! Ich hatte ein etwas anderes Problem als das ursprüngliche Poster, aber das Festlegen der Ausführungsrichtlinie in x86 behebt auch mein Problem. –

Verwandte Themen