如何让Hudson CI执行Powershell脚本?

时间:2009-09-24 16:27:33

标签: powershell hudson policy execution

我正在使用 Hudson版本1.324 进行CI并遇到一些问题:

环境:

  • Windows Server 2008
  • Powershell v1.0
  • Hudson 1.324作为服务运行
  • 安装了Hudson Powershell插件
  • Psake(又名。“Powershell Make / Rake”可从Github获得)0.23 (截至此初始帖子的所有当前/最新版本)

我有一个Powershell(PS)脚本,用于编译,运行NUnit测试,如果成功,则创建输出的7z文件。 PS脚本在我的本地开发盒以及安装了Hudson的CI服务器上从命令行运行。

1)使用Powershell执行政策。

我最初在服务器上运行了PS控制台,运行Set-ExecutionPolicy Unrestricted,允许运行任何脚本。 (是的,我在这里意识到了安全性问题,我正在努力使某些工作正常工作,Unrestricted应该删除安全问题,以便我可以专注于其他问题。)

[这很有效,并允许我昨天从Hudson开始发布PS构建脚本。然后我遇到了另一个问题,但我们将在第2项中讨论更多问题。]

一旦Hudson发射PS脚本,它就会抱怨以下错误:

  

“C:\ Windows \ system32 \ WindowsPowerShell \ v1.0 \ powershell”&   'OzSystems.Tools \ psake \ psake.ps1''。\ oz-build.ps1'“这个词   'OzSystems.Tools \ psake \ psake.ps1'无法识别为cmdlet,功能   离子,可操作程序或脚本文件。验证该术语,然后重试。   在行:1 char:2   +& <<<< 'OzSystems.Tools \ psake \ psake.ps1''。\ oz-build.ps1'“

使用相同的命令行,我可以手动从命令行成功执行PS脚本。但是Hudson无法让PS做同样的事情。在查看其他PS文档后,我也尝试了这个:

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

并得到了类似的错误。似乎没有任何关于Hudson的Powershell插件的文档。我已经浏览了所有的Powershell插件文件,看不到任何可配置的内容。我找不到Hudson的日志文件来获取更多信息。

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

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

有谁知道这里发生了什么?

谢谢,德里克

5 个答案:

答案 0 :(得分:7)

我刚遇到了在hudson中运行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

运行一次和你的家庭免费。

答案 1 :(得分:2)

从计划任务或Hudson运行PowerShell时,您需要:

  1. 指定-ExecutionPolicy参数(在您的情况下为-Ex Unrestricted
  2. 使用 -Command { ... }-File NOT BOTH 指定该命令,而不指定您的意思。
  3. 试试这个(除了我不建议使用相对路径):

    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

         

    执行指定的命令(和任何参数),就像它们一样       在Windows PowerShell命令提示符下键入,然后退出,除非       指定了NoExit。 Command的值可以是“ - ”,一个字符串。或者a       脚本块。

         

    如果Command的值为“ - ”,则从标准读取命令文本       输入

         

    如果Command的值是脚本块,则必须附上脚本块       在大括号({})中。只有运行PowerShell.exe时,才能指定脚本块       在Windows PowerShell中。返回脚本块的结果       作为反序列化的XML对象而不是活动对象的父shell。

         

    如果Command的值是字符串,则Command必须是最后一个参数       在命令中,因为在命令后输入的任何字符都是       解释为命令参数。

答案 2 :(得分:1)

对于问题#1,请尝试此操作(假设您使用的是PowerShell 2.0):

“C:\ Windows \ system32 \ WindowsPowerShell \ v1.0 \ powershell -executionPolicy Unrestricted -file 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(或不受限制)。

答案 3 :(得分:1)

我遇到了和你一样的问题(正如你从我的评论中看到的那样)。我已经放弃了powershell启动程序,并使用批处理文件启动程序运行。尽管我已经将系统设置为不受限制,但设置似乎对哈德森的发射器并不重要。我不知道它是否在某些其他环境中运行,甚至在全局profile.ps1中添加内容似乎没有帮助。我最终做的是运行

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

尽管它不理想,它可以满足我的需要。我已通过电子邮件向插件作者发送了相关信息并将进行更新。

答案 4 :(得分:1)

我刚刚解决了这个问题。太痛苦了!

如果在64位Windows上运行32位JVM,请确保为32位Powershell接口设置执行策略。我在这里找到了32位可执行文件:

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

32位和64位Powershell环境完全不同,因此将执行策略设置为一个对另一个没有影响。