Jenkins powershell插件运行32位Powershell,我需要64位

And*_* G. 9 powershell jenkins

我对Jenkins中的PowerShell集成很新,我的脚本不会运行,因为(我相信)我需要PowerShell以64位执行.运行:

[Environment]::Is64BitProcess
Run Code Online (Sandbox Code Playgroud)

在我的执行序列中产生false一个cmdlet然后我使用(Get-WindowsFeature)显示为不被识别为cmdlet等.任何方式执行64位PowerShell脚本?谢谢!

sta*_*cke 14

环境

  • Windows上的Jenkins(我的服务器正在运行)
  • 加上Powershell插件(用于运行Powershell脚本作为"构建步骤")

Jenkins通常会调用正确的版本powershell.exe.但是,执行程序/从属进程必须运行64位JRE,以便PowerShell也可以在64位模式下运行.

使用以下Powershell脚本的简单测试器项目可以显示上述32位与64位性质:

$env:Path               # Path will have the right Powershell available
[intptr]::size          # outputs: 4 = 32-bit, 8 = 64-bit
Stop-WebAppPool FOOBAR  # fails when 32-bit, succeeds when 64-bit
Run Code Online (Sandbox Code Playgroud)

控制台输出示例(为清晰起见,额外的空行):

[Powershell Test] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Windows\TEMP\hudson123456789.ps1'"

C:\Windows\system32;C:\Windows;C:\Windows\System32\WindowsPowerShell\v1.0\

4

Stop-WebAppPool : Retrieving the COM class factory for component with CLSID 
{688EEEE5-6A7E-422F-B2E1-6AF00DC944A6} failed due to the following error: 
80040154 Class not registered (Exception from HRESULT: 0x80040154 
(REGDB_E_CLASSNOTREG)).

At C:\Windows\TEMP\hudson123456789.ps1:7 char:1
Run Code Online (Sandbox Code Playgroud)

tl; dr ... 安装64位JRE,并将Jenkins配置为64位.

我使用chocolatey通过"管理员"PowerShell安装了一个相当新的JRE:

首先,安装巧克力:

iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
Run Code Online (Sandbox Code Playgroud)

寻找可用的最新版本https://chocolatey.org/packages?q=java(colicy有相同的多个包,通常不完全保持最新).

然后,安装JRE(使用具有更高JRE编号的JRE):

choco install -y javaruntime
Run Code Online (Sandbox Code Playgroud)

要么:

choco install -y jre8
Run Code Online (Sandbox Code Playgroud)

最后,我编辑了我的jenkins.xml配置,以便它可以使用64位JRE而不是内置JRE运行.

更改:

<executable>%BASE%\jre\bin\java</executable>
Run Code Online (Sandbox Code Playgroud)

要(根据您的实例设置路径):

<executable>C:\Program Files\Java\jre1.8.0_66\bin\java</executable>
Run Code Online (Sandbox Code Playgroud)

这个应该是一个"永远新鲜"的符号链接(由系统更新处理),它应该允许你的Jenkins实例在Restart和Update事件中存活:

<executable>C:\ProgramData\Oracle\Java\javapath\java.exe</executable>
Run Code Online (Sandbox Code Playgroud)

然后我重新启动了詹金斯.Powershell执行唤醒了64位的威力.注意:我正在使用单个Jenkins实例,它同时作为"服务器"和"执行从属"执行双重任务.对于完全自治的从站,我认为做任何事情来获得64位模式的从属代理进程都会取得类似的成功.

完全自动化?根据巧克力"jre8"软件包文档,使用命令行开关,甚至可以强制JRE的固定目标路径,并且如果需要完全自动化的非交互式步骤,则排除32位和/或64位版本. https://chocolatey.org/packages/jre8


bri*_*ist 5

我对Jenkins并不熟悉,但似乎它本身是一个32位进程。

您可以指定PowerShell可执行文件的位置吗?如果是这样,请尝试使用以下路径: C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe

如果您无法执行此操作,则可以使用“执行序列”中的代码执行以下操作Invoke-Command

Invoke-Command -ComputerName . -ScriptBlock { [Environment]::Is64BitProcess }
Run Code Online (Sandbox Code Playgroud)

脚本块中的所有代码将在单独的64位进程中运行,结果将被序列化并返回。

说明

路径

在32位Windows操作系统上,系统文件夹为C:\Windows\System32。在64位Windows操作系统上,64位系统文件夹也为C:\Windows\System32。但是实际上是在64位Windows安装上的32位进程的系统文件夹C:\Windows\SysWOW64

为了兼容,在64位OS上的32位进程将C:\Windows\System32 透明地重定向C:\Windows\SysWOW64,而该进程不知道该调用。

要使32位进程能够在64位OS上引用实数 System32,可以使用C:\Windows\SysNative

由于PowerShell具有32位和64位版本,并且位于系统文件夹中,因此您需要使用上述规则来引用正确的可执行文件,具体取决于您是从64位还是32位进程中调用它。

典型场景(您想要调用相同位数的版本)最简单(只需powershell.exe通过调用或引用它System32),但是如果您要引用其他版本,则变得很麻烦。

Invoke-Command 方法

Invoke-Commandcmdlet允许您通常在另一台计算机上运行代码,但也可以在同一台计算机上运行它。这将产生一个完全独立的进程,所有输出都将被序列化并发送回调用进程。

需要注意的是,您必须通过Enable-PSRemoting组策略(无耻的自我插入)在计算机上启用PowerShell远程处理。

Microsoft.PowerShell无论调用方的操作系统如何,在64位计算机上连接的默认配置文件()将是PowerShell的64位版本。

顺便说一句,如果您想用来Invoke-Command连接到32位版本,则可以通过显式指定profile来实现Microsoft.PowerShell32