8

我正在为 CI 使用Hudson 1.324 版并且有几个问题:

环境:

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

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

1) 使用 Powershell 的执行策略。

我最初在服务器上运行了一个 PS 控制台Set-ExecutionPolicy Unrestrictedrun ,它允许运行任何脚本。(是的,我意识到这里的安全问题,我正在尝试让某些东西起作用,而 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、函数、可运行程序或脚本文件。验证术语并重试。在 line: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 插件文件,但没有看到任何可配置的内容。我找不到哈德森的日志文件来获取更多信息。

谁能帮我解决这个问题?

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

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

谢谢,德里克

4

5 回答 5

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

运行一次,您就可以无家可归了。

于 2011-02-07T15:17:14.797 回答
2

从计划任务或 Hudson 运行 PowerShell 时,您希望:

  1. 指定 -ExecutionPolicy 参数(在您的情况下-Ex Unrestricted:)
  2. 使用或 NOT BOTH指定该命令-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

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

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

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

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

于 2009-12-14T19:32:20.563 回答
1

我遇到了和你一样的问题(正如你从我的评论中看到的那样)。我已经放弃了 powershell 启动器,转而使用批处理文件启动器来运行。尽管我已将系统设置为无限制,但该设置对 hudson 的启动器似乎并不重要。我不知道它是否在其他上下文中运行,甚至将内容添加到全局 profile.ps1 似乎也无济于事。我最终做的是跑步

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

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

于 2009-09-25T16:43:10.047 回答
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(或不受限制)。

于 2009-09-24T20:29:04.423 回答
1

我刚刚解决了这个确切的问题。多么痛苦!

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

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

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

于 2011-01-25T19:35:43.690 回答