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
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
我对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。
| 归档时间: |
|
| 查看次数: |
6238 次 |
| 最近记录: |