2009-09-24 97 views
8

我使用哈德森版本1.324的CI,并有几个问题:如何让Hudson CI执行Powershell脚本?

环境:

  • 的Windows Server 2008
  • PowerShell的1.0
  • 哈德森1.324作为运行服务
  • 已安装Hudson PowerShell插件
  • Psake(又名“Powershell Make/Rake”,可从Github获得)0.23 (全电流/最新版本,因为这最初的职位)

我有一个PowerShell(PS)脚本的作品来编译,运行NUnit的测试,如果成功,创造的产值的的7z文件。 PS脚本可以在我的本地开发框以及安装了Hudson的CI服务器的命令行上运行。

1)使用Powershell执行策略。

我最初在服务器上运行PS控制台,运行Set-ExecutionPolicy Unrestricted,它允许任何脚本运行。 (是的,我意识到这里的安全问题,我试图让一些工作,无限制应该删除安全问题,所以我可以专注于其他问题。)

[这工作,并允许我开火PS昨天从Hudson建立脚本。然后我遇到的另外一个问题,但我们会讨论更多的项目#2]

一旦哈德森也火了一个PS脚本,它与下面的错误抱怨:

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

使用相同的命令行,我能够从命令行手动成功执行PS脚本。然而哈德森无法让PS做同样的事情。在看了附加的PS文档之后,我也试过了这个:

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

并且得到了类似的错误。似乎没有任何针对Hudson的Powershell插件的文档。我浏览了所有的Powershell插件文件,没有看到任何可配置的东西。我找不到Hudson的日志文件以获取更多信息。

任何人都可以帮我过去吗?

2)我昨天和#1一起摔跤。我进入这个AM并尝试在重新启动Hudson服务器/服务后重新进入,现在看起来ExecutionPolicy已经重置为Restricted。我做了昨天的工作,打开了一个PS控制台和Set-ExecutionPolicyUnrestricted。它在PS控制台中显示Unrestricted,但Hudson说它没有执行PS脚本的权限。我重新打开了一个新的PS控制台,并确认ExecutionPolicy仍然是Unrestriced - 是的。但哈德森显然没有意识到这种变化。再次重启Hudson服务并没有改变哈德森对该政策的看法。

有人知道这里发生了什么吗?

谢谢,德里克

+0

我遇到了完全相同的问题。老实说,这个powershell的东西是如何与bash相媲美的。太多的安全! – stimms

+0

通过签署脚本的痛苦过程(http://www.hanselman.com/blog/SigningPowerShellScripts.aspx)没有帮助。仅供参考。 – stimms

+0

确保你没有以某种方式为-Scope CurrentUser设置执行策略而不是-Scope LocalMachine ...并确保Hudson不尝试在另一个客户端上运行你的构建;) – Jaykul

回答

1

对于问题#1,试试这个(假设你正在使用PowerShell的2.0):

“C:\ WINDOWS \ SYSTEM32 \ WindowsPowerShell \ V1.0 \ PowerShell的-ExecutionPolicy无限制 - 文件OzSystems.Tools \ psake \ psake.ps1 C:\ {path} \ oz-build.ps1“

您正在使用”。“通往oz-build.ps1的路径。我怀疑你需要提供oz-build.ps1文件的完整路径才能完成这项工作。除非执行上述命令的基础架构碰巧具有正确设置的当前目录。即使它为“进程”设置正确,只对.NET/Win32 API调用而言,而不适用于PowerShell cmdlet。 PowerShell中的当前目录跟踪的过程与当前目录不同,因为PowerShell可以同时运行多个运行空间。这种全局的可变值在这种并发情况下不起作用。

至于问题2,Hudson服务在哪个帐户下运行?确保该帐户已执行Set-ExecutionPolicy RemoteSigned(或不受限制)。

+0

Keith, I'我已经尝试了#1的建议。同样的问题。 对于#2,是的,我确定为Hudson运行的帐户设置了ExecutionPolicy。当我手动登录以检查ExecutionPolicy时,它是无限制的。哈德森仍然在说脚本被禁用。 我们即将在Powershell上踢球,并尝试用哈德森耙子。看来PS在黄金时段还没有做好准备,或者至少没有足够让我们依赖的表现。 感谢您输入Keith! – user178557

+0

放弃之前,请尝试使用-ExecutionPolicy Unrestricted参数。我修改了上面的例子来显示这个。 –

1

我一直有和你一样的问题(正如你从我的评论中看到的那样)。我已经放弃了PowerShell启动器,并转而使用批处理文件启动器来运行。尽管我已经将系统设置为不受限制,但对于哈德逊的发射器来说,这个设置似乎并不重要。我不知道它是否运行在其他上下文中,甚至是将其他内容添加到全局配置文件中.ps1似乎没有帮助。我最终做的是运行

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

尽管它不是很理想,但它能做我所需要的。我已经通过电子邮件发送了关于此的插件作者,并且会进行更新。

2

当从计划任务或哈德森运行PowerShell的要:

  1. 指定-ExecutionPolicy参数(在你的情况:-Ex Unrestricted
  2. 使用要么-Command { ... }-File不能指定命令两者都是而不是没有指定你的意思。

试试这个(只是我不建议使用相对路径):

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

需要明确的是,这将工作太:

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

-Command后的第一个字符串被解释为命令的名称,并且之后的每个参数都只是作为参数传递给该命令。该字符串不是脚本,它是命令的名称(在本例中为脚本文件)...您不能请输入"&'OzSystems.Tools\psake\psake.ps1'",但即使它有空格也可以放"OzSystems.Tools\psake\psake.ps1"

从帮助引用(运行PowerShell -?)重点煤矿:

-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

我只是通过这个确切的问题了。多么痛苦!

如果您在64位Windows上运行32位JVM,请确保您为32位Powershell界面设置执行策略。我发现我在这里的32位可执行文件:

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

的32位和64位Powershell的环境是完全不同所以设置执行策略在一个对其他没有任何影响。

7

我刚碰到在哈德森运行PowerShell脚本的问题。问题是你正在运行一个32位的Java进程,并且你已经将Hudson配置为64位而不是32位。请参阅我们在Microsoft上创建的以下线程。

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

如果你的懒惰。 1.以管理员身份从开始菜单启动powershell(x86) 2.将执行策略设置为remotesigned

运行此操作一次,并且您的homefree。

+0

谢谢!我有一个比原来的海报稍微不同的问题,但在x86中设置执行策略也解决了我的问题。 –