2009-09-24 24 views
8

estoy usando Hudson versión 1.324 de CI y tienen un par de cuestiones:¿Cómo hacer que Hudson CI ejecute un script de Powershell?

Medio Ambiente:

  • Windows Server 2008
  • Powershell v1.0
  • Hudson 1.324 ejecuta como un servicio
  • Hudson Powershell Plugin instalado
  • Psake (también conocido como "Powershell Make/Rake" disponible en Github) 0.23 (Todos los/las últimas versiones actuales de este post inicial)

que tienen una secuencia de comandos de PowerShell (PS) que funciona para compilar, ejecutar pruebas NUnit, y si tiene éxito, crear un archivo 7z de la salida. La secuencia de comandos de PS funciona desde la línea de comandos, tanto en mi cuadro de desarrollo local como en el servidor de CI donde está instalado Hudson.

1) Política de ejecución con Powershell.

Inicialmente ejecuté una consola PS en el servidor, ejecuté Set-ExecutionPolicy Unrestricted, lo que permite que se ejecute cualquier secuencia de comandos. (Sí, me doy cuenta de las preocupaciones de seguridad aquí, estoy tratando de hacer que algo funcione y sin restricciones debería eliminar los problemas de seguridad para poder concentrarme en otros problemas).

[Esto funcionó, y me permitió disparar Script de compilación PS de Hudson ayer. . Entonces me encontré con otro problema, pero vamos a discutir más que en el artículo # 2]

Una vez Hudson podría disparar una secuencia de comandos PS, se quejó con el siguiente error:

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

Usando el mismo comando línea, puedo ejecutar con éxito el script PS desde la línea de comando de forma manual. Sin embargo, Hudson no puede hacer que PS haga lo mismo. Después de buscar en la documentación adicional PS también probé esto:

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

y ha dado un error similar. No parece haber ninguna documentación para el complemento Powershell para Hudson. Revisé todos los archivos del complemento Powershell y no veo nada configurable. No puedo encontrar un archivo de registro para que Hudson obtenga información adicional.

¿Alguien puede ayudarme a superar esto?

2) Pasé ayer luchando con # 1. Vine en este AM y traté de volver a indagar, luego de reiniciar el servidor/servicio de Hudson, y ahora parece que ExecutionPolicy se ha restablecido a Restringido. Hice lo que funcionó ayer, abrí una consola PS y Set-ExecutionPolicy a Unrestricted. Muestra Unrestricted en la consola PS, pero Hudson dice que no tiene derechos para ejecutar scripts PS. Volví a abrir una nueva consola PS y confirmé que el ExecutionPolicy sigue siendo Unrestriced - lo es. Pero Hudson, evidentemente, no está al tanto de este cambio. Reiniciar nuevamente el servicio de Hudson no cambia la visión de la política de Hudson.

¿Alguien sabe lo que está pasando aquí?

Gracias, Derek

+0

Me encuentro con exactamente el mismo problema. Honestamente, cómo se supone que esta cosa de poder es comparable a bash está más allá de mí. Demasiada seguridad! – stimms

+0

Pasar por el doloroso proceso que está firmando el script (http://www.hanselman.com/blog/SigningPowerShellScripts.aspx) no ayudó. FYI. – stimms

+0

Asegúrese de que no estableció de alguna manera-executionpolicy para el -Scope CurrentUser en lugar de -Scope LocalMachine ... y asegúrese de que Hudson no está tratando de ejecutar sus compilaciones en otro cliente;) – Jaykul

Respuesta

1

Para la pregunta # 1, intente esto (suponiendo que está utilizando PowerShell 2.0):

"C: \ Windows \ system32 \ WindowsPowerShell \ v1.0 \ PowerShell -executionpolicy sin restricciones - archivo OzSystems.Tools \ psake \ psake.ps1 C: \ {path} \ oz-build.ps1 "

Usted está utilizando". " para el camino a oz-build.ps1. Sospecho que deberás proporcionar la ruta completa a tu archivo oz-build.ps1 para que esto funcione. A menos que la infraestructura que ejecuta el comando anterior tenga el directorio actual configurado correctamente. E incluso si está configurado correctamente para el "proceso", eso solo es importante para las llamadas API .NET/Win32 y no para los cmdlets de PowerShell. El directorio actual en PowerShell se rastrea de manera diferente que el directorio actual del proceso porque PowerShell puede tener varias áreas de ejecución ejecutándose simultáneamente. Ese tipo de valor mutable global no funciona en este escenario concurrente.

En cuanto a la pregunta 2, ¿en qué cuenta se ejecuta el servicio Hudson? Asegúrese de que la cuenta haya ejecutado Set-ExecutionPolicy RemoteSigned (o no restringido).

+0

Keith, I ' he probado las sugerencias para el # 1. Mismos problemas Para el n. ° 2, sí, me he asegurado de que ExecutionPolicy esté configurado para la cuenta con la que se está ejecutando Hudson. No tiene restricción cuando inicio sesión manualmente para verificar la Política de Ejecución. Hudson aún dice que los scripts están deshabilitados. Estamos a punto de aterrizar en Powershell y probar Rake con Hudson. Parece que PS no está listo para el horario de máxima audiencia, o al menos no se comporta lo suficiente para que podamos confiar. Gracias por la entrada Keith! – user178557

+0

Antes de darse por vencido, intente utilizar el parámetro -ExecutionPolicy Unrestricted. Modifiqué el ejemplo anterior para mostrar esto. –

1

He tenido los mismos problemas que usted (como ha visto en mis comentarios). He abandonado el iniciador de PowerShell y pasé a ejecutar cosas utilizando el iniciador de archivos por lotes. A pesar de que había configurado el sistema sin restricciones, esa configuración no parecía importar al lanzador de Hudson. No sé si se ejecuta en algún otro contexto o algo así, incluso agregando cosas al perfil global.ps1 no parece ayudar. Lo que terminé haciendo fue ejecutar

powershell " set-executionpolicy Unrestricted; & 'somefile.ps1'" 

que hace lo que necesito, aunque no es ideal. He enviado un correo electrónico al autor del complemento sobre esto y lo actualizaré.

2

al ejecutar PowerShell de una tarea programada o Hudson desea:

  1. especificar el parámetro -executionpolicy (en su caso: -Ex Unrestricted)
  2. especificar que el uso de comandos ya sea-Command { ... } o -FileNO AMBOS y no sin especificar a qué se refiere.

probar este (excepto que no recomiendo el uso de rutas relativas):

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

Para que quede claro, esto también funcionará:

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

La primera cadena después -Command se interpreta como EL NOMBRE DE UN COMANDO, y cada parámetro posterior se pasa a ese comando como parámetro. La cadena NO es un script, es el nombre de un comando (en este caso, un archivo de script) ... no puede poner "&'OzSystems.Tools\psake\psake.ps1'" pero puede poner "OzSystems.Tools\psake\psake.ps1" incluso si tiene espacios.

citar de la ayuda (pista PowerShell -?) el énfasis es mío:

-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

simplemente llegué a través de este problema exacto. ¡Que dolor!

Si está ejecutando una JVM de 32 bits en Windows de 64 bits, asegúrese de establecer la política de ejecución para la interfaz Powershell de 32 bits. He encontrado mi 32 bit de ejecución aquí:

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

Los entornos de Powershell de 32 y 64 bits son completamente distintos por lo que establecer la directiva de ejecución en un solo no tiene ningún efecto en el otro.

7

Acabo de encontrarme con el problema de ejecutar scripts de powershell en hudson. El problema es que está ejecutando un proceso de 32 bits de Java y ha configurado Hudson para 64 bits pero no para 32 bits. Vea el siguiente hilo que creamos en microsoft.

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

Si su perezoso. 1. Inicie powershell (x86) desde el menú de inicio como administrador 2. Establezca la política de ejecución en remotesigned

Ejecute esto una vez y su homefree.

+0

Gracias! Tuve un problema ligeramente diferente al del póster original, pero establecer la política de ejecución en x86 también solucionó mi problema. –

Cuestiones relacionadas