2009-09-24 11 views
8

Używam Hudson wersji 1.324 dla CI i mam kilka problemów:Jak zmusić system Hudson CI do wykonywania skryptu Powershell?

Środowisko:

  • Windows Server 2008
  • PowerShell v1.0
  • Hudson 1.324 działa jako usługa
  • Zainstalowana wtyczka Hudson Powershell
  • Psake (znana również jako "Powershell Make/Rake" dostępna od Githuba) 0.23 (Wszystkie bieżące/najnowsze wersje poczynając od tej początkowej post)

Mam PowerShell (PS) skrypt, który działa skompilować, uruchomić testy NUnit, i jeśli się powiedzie, utwórz plik 7z wyjścia. Skrypt PS działa z poziomu wiersza poleceń, zarówno w moim lokalnym środowisku programistycznym, jak i na serwerze CI, na którym jest zainstalowany Hudson.

1) Zasady realizacji z Powershell.

Najpierw uruchomiłem konsolę PS na serwerze, uruchomiłem Set-ExecutionPolicy Unrestricted, co pozwala na uruchomienie dowolnego skryptu. (Tak, zdaję sobie sprawę z obaw związanych z bezpieczeństwem, próbuję uzyskać coś do roboty, a Nieograniczony powinien usunąć problemy bezpieczeństwa, aby móc skupić się na innych problemach.)

[To zadziałało i pozwoliło mi wystrzelić Scenariusz PS build od Hudsona wczoraj. . Wtedy napotkał inny problem, ale omówimy, że więcej w punkcie # 2]

Po Hudson mogła wystrzelić skrypt PS, to skarżył się z powodu następującego błędu:

"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'"

Stosując tę ​​samą komendę line, jestem w stanie ręcznie wykonać skrypt PS z linii poleceń ręcznie. Jednak Hudson nie jest w stanie zmusić PS do tego samego. Po zapoznaniu się z dodatkową dokumentacją PS próbowałem również:

"& 'OzSystems.Tools\psake\psake.ps1' '.\oz-build.ps1'" 

i otrzymałem podobny błąd. Wydaje się, że nie ma żadnej dokumentacji wtyczki Powershell dla Hudsona. Przejrzałem wszystkie pliki wtyczek Powershell i nie widzę niczego konfigurowalnego. Nie mogę znaleźć pliku dziennika dla Hudsona, aby uzyskać dodatkowe informacje.

Czy ktoś może mi pomóc po tym?

2) Spędziłem wczoraj wrestling z # 1. Przyszedłem w to AM i próbowałem zagłębić się ponownie, po ponownym uruchomieniu serwera/usługi Hudson, a teraz wygląda na to, że ExecutionPolicy został zresetowany do Restricted. Zrobiłem to, co działało wczoraj, otworzyłem konsolę PS i Set-ExecutionPolicy na Unrestricted. Pokazuje on Unrestricted w konsoli PS, ale Hudson twierdzi, że nie ma uprawnień do wykonywania skryptów PS. Ponownie otworzyłem nową konsolę PS i potwierdziłem, że ExecutionPolicy nadal jest Unrestriced - to jest. Ale Hudson najwyraźniej nie jest świadomy tej zmiany. Ponowne uruchomienie usługi Hudson ponownie nie zmienia poglądu Hudsona na politykę.

Czy ktoś wie, co się tutaj dzieje?

Dzięki, Derek

+0

Występuje dokładnie ten sam problem. Szczerze mówiąc, to, jak ta moc jest podobna do basha, jest poza mną. Za dużo bezpieczeństwa! – stimms

+0

Przechodzenie przez bolesny proces podpisywania skryptu (http://www.hanselman.com/blog/SigningPowerShellScripts.aspx) nie pomogło. FYI. – stimms

+0

Upewnij się, że nie ustawiłeś opcji -polecenia dla narzędzia -Scope CurrentUser zamiast -Scope LocalMachine ... i upewnij się, że Hudson nie próbuje uruchomić twoich kompilacji na innym kliencie;) – Jaykul

Odpowiedz

1

Na pytania nr 1, spróbuj tego (zakładając używasz PowerShell 2.0):

„C: \ Windows \ system32 \ WindowsPowerShell \ v1.0 \ PowerShell -executionPolicy Nieograniczony - plik OzSystems.Tools \ psake \ psake.ps1 C: \ {ścieżka} \ oz-build.ps1 "

Używasz". " dla ścieżki do oz-build.ps1. Podejrzewam, że będziesz musiał podać pełną ścieżkę do pliku oz-build.ps1, aby to działało. O ile infrastruktura wykonująca powyższe polecenie nie ma prawidłowo ustawionego bieżącego katalogu. Nawet jeśli jest ustawiony poprawnie dla "procesu", ma to znaczenie tylko dla wywołań API .NET/Win32, a nie dla poleceń cmdlet PowerShell. Bieżący katalog w PowerShell jest śledzony inaczej niż bieżący katalog procesu, ponieważ PowerShell może mieć wiele obszarów uruchomionych jednocześnie. Tego rodzaju globalna, zmienna wartość nie działa w tym równoległym scenariuszu.

Co do pytania nr 2, na jakie konto działa usługa Hudson? Upewnij się, że konto wykonało Set-ExecutionPolicy RemoteSigned (lub bez ograniczeń).

+0

Keith, I ' ve wypróbował sugestie dla # 1. Te same problemy. Dla numeru 2, Tak, upewniłem się, że opcja ExecutionPolicy jest ustawiona dla konta, na którym działa Hudson. Jest nieograniczony, kiedy loguję się ręcznie, aby sprawdzić ExecutionPolicy. Hudson wciąż mówi, że skrypty są wyłączone. Za chwilę ruszymy na Powershell i wypróbujemy Rake z Hudsonem. Wygląda na to, że PS nie jest całkiem gotowy na prime time, a przynajmniej nie zachowuje się wystarczająco konsekwentnie, abyśmy mogli polegać. Dzięki za wejście Keith! – user178557

+0

Przed poddaniem się, spróbuj użyć parametru -ExecutionPolicy Unrestricted. Zmodyfikuję powyższy przykład, aby to pokazać. –

1

Mam takie same problemy jak ty (co widziałem z moich komentarzy). Porzuciłem program uruchamiający w programie Power Shell i zacząłem uruchamiać różne rzeczy za pomocą wywoływacza plików wsadowych. Chociaż ustawiłem system w taki sposób, że ustawienie nie miało znaczenia dla wyrzutni Hudsona. Nie wiem, czy działa w jakimś innym kontekście, czy coś w tym stylu, nawet dodając rzeczy do globalnego profilu. Ps1 nie pomagał. To, co w końcu robiłem, to działanie, które robi to, czego potrzebuję, chociaż nie jest idealne. Wysłałem e-maila do autora wtyczki o tym i zaktualizuję.

2

podczas uruchamiania PowerShell z zaplanowanego zadania lub Hudson chcesz:

  1. określić parametr -ExecutionPolicy (w Twoim przypadku: -Ex Unrestricted)
  2. określić, że polecenie używając albo-Command { ... } lub -FileNIE Zarówno i nie bez określenia, co masz na myśli.

Spróbuj tego (z wyjątkiem, że nie zaleca się używanie ścieżek względnych):

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

Żeby było jasne, to będzie działać zbyt:

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

Pierwszy ciąg po -polecenie jest interpretowane jako NAZWA POLECENIA, a każdy kolejny parametr jest przekazywany do tego polecenia jako parametr. Ciąg NIE jest skryptem, jest to nazwa polecenia (w tym przypadku plik skryptu) ... nie można nie można ustawić wstawić "&'OzSystems.Tools\psake\psake.ps1'", ale można umieścić "OzSystems.Tools\psake\psake.ps1", nawet jeśli ma spacje.

Cytując z pomocą (run PowerShell -?) podkr:

-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

Właśnie dzięki dokładnym tego problemu. Co za ból!

Jeśli używasz 32-bitowej maszyny JVM w 64-bitowym systemie Windows, upewnij się, że ustawiono zasady wykonywania dla 32-bitowego interfejsu Powershell. Uważam, że mój 32-bitowy wykonywalny tutaj:

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

W 32- i 64-bitowe środowisko PowerShell są całkowicie odrębne więc ustawienie polityki realizacji w jednej nie ma wpływu na innych.

7

Po prostu wpadłem na problem uruchamiania skryptów powłoki w hudson. Chodzi o to, że używasz 32-bitowego procesu Java i skonfigurowałeś Hudson na 64-bitowy, ale nie na 32-bitowy. Zobacz następujący wątek, który stworzyliśmy w Microsoft.

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

Jeśli leniwy. 1. Uruchom polecenie powershell (x86) z menu Start jako administrator 2. Ustaw strategię wykonywania na zdalną:

Uruchom to raz i swoje urządzenie główne.

+0

Dzięki! Miałem nieco inny problem niż oryginalny plakat, ale ustawienie polityki wykonawczej w x86 również naprawiło mój problem. –

Powiązane problemy