我正在使用 Hudson版本1.324 进行CI并遇到一些问题:
环境:
我有一个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-ExecutionPolicy
到Unrestricted
。它在PS控制台中显示Unrestricted
,但是Hudson说它没有执行PS脚本的权限。我重新打开了一个新的PS控制台并确认ExecutionPolicy
仍然是Unrestriced
- 确实如此。但是哈德森显然不知道这种变化。再次重新启动Hudson服务并不会改变Hudson对策略的看法。
有谁知道这里发生了什么?
谢谢,德里克
答案 0 :(得分:7)
我刚遇到了在hudson中运行powershell脚本的问题。问题是你正在运行一个32位的Java进程,你已经将Hudson配置为64位而不是32位。请参阅我们在microsoft上创建的以下主题。
如果你懒惰。 1.以管理员身份从开始菜单启动PowerShell(x86) 2.将执行策略设置为remotesigned
运行一次和你的家庭免费。
答案 1 :(得分:2)
从计划任务或Hudson运行PowerShell时,您需要:
-Ex Unrestricted
)-Command { ... }
或-File
NOT BOTH 指定该命令,而不指定您的意思。试试这个(除了我不建议使用相对路径):
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环境完全不同,因此将执行策略设置为一个对另一个没有影响。