【问题标题】:How to get Hudson CI to execute a Powershell script?如何让 Hudson CI 执行 Powershell 脚本?
【发布时间】:2010-12-01 03:54:22
【问题描述】:

我正在为 CI 使用 Hudson 版本 1.324,但有几个问题:

环境:

  • Windows Server 2008
  • Powershell 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 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,函数 ion、可运行的程序或脚本文件。验证术语并重试。 在行:1 字符:2 + &

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

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

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

谁能帮我解决这个问题?

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

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

谢谢,德里克

【问题讨论】:

  • 我遇到了完全相同的问题。老实说,这个 powershell 东西是如何与 bash 相媲美的,这超出了我的理解。太安全了!
  • 经历签署脚本 (hanselman.com/blog/SigningPowerShellScripts.aspx) 的痛苦过程并没有帮助。仅供参考。
  • 确保您没有以某种方式为 -Scope CurrentUser 而不是 -Scope LocalMachine 设置执行策略 ...并确保 Hudson 没有尝试在另一个客户端上运行您的构建;)

标签: powershell hudson policy execution


【解决方案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(或不受限制)。

【讨论】:

  • 基思,我已经尝试了#1 的建议。同样的问题。对于 #2,是的,我已确保为 Hudson 运行的帐户设置了 ExecutionPolicy。当我手动登录以检查 ExecutionPolicy 时,它是不受限制的。哈德森仍然说脚本被禁用。我们即将使用 Powershell 并尝试使用 Hudson 进行 Rake。看来 PS 还没有为黄金时段做好准备,或者至少表现得不够一致,以至于我们无法依赖。感谢基思的投入!
  • 在放弃之前,请尝试使用 -ExecutionPolicy Unrestricted 参数。我已经修改了上面的例子来展示这一点。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    1. 指定 -ExecutionPolicy 参数(在您的情况下为:-Ex Unrestricted
    2. 使用 either -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 的值可以是“-”,一个字符串。或一个 脚本块。

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

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

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

    【讨论】:

      【解决方案4】:

      我刚刚解决了这个确切的问题。好痛!

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

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

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

      【讨论】:

        【解决方案5】:

        我刚刚遇到了在 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

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

        【讨论】:

        • 谢谢!我的问题与原始海报略有不同,但在 x86 中设置执行策略也解决了我的问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-24
        • 2011-03-26
        • 2018-03-03
        • 1970-01-01
        • 1970-01-01
        • 2020-08-12
        • 1970-01-01
        相关资源
        最近更新 更多