【问题标题】:Run powershell command on slave - Jenkins在奴隶上运行 powershell 命令 - 詹金斯
【发布时间】:2016-08-24 02:55:08
【问题描述】:

在从属设备上运行 Jenkins 作业时,我得到了这个控制台输出。该作业应创建一个文件并将其放入c:\foo\services.csv

这里是作业 powershell 命令:

Get-Service | Export-CSV c:\foo\service.csv

请注意此控制台输出中的“绕过”一词。我无法克服它。我认为是问题所在:

[AnonymousJWTApi] $ powershell.exe -NonInteractive -ExecutionPolicy 旁路 ”& 'C:\Users\xxx\AppData\Local\Temp\hudson1582303083838020200.ps1'"

我在网上发现,在主从服务器上运行脚本时会发生错误。

所以我在slave上手动创建了脚本,放到c:\foo\listServices.ps1。然后在 Jenkins (master) 中,此命令在从属设备上运行:“C:\foo\listServices.ps1” 以调用脚本直接从从属设备运行。

我仍然得到相同的控制台输出......关于“绕过”的东西似乎仍然导致它无法工作。 csv 文件没有放在 foo 文件夹中。是否是旁路阻止了它的工作,如果是,解决方案是什么?

以及完整的控制台输出:

Started by user anonymous
Building remotely on slave1 in workspace C:\Jenkins\Master\workspace\AnonymousJWTApi
 > git.exe rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git.exe config remote.origin.url C:\Users\xxx\Source\Repos\AnonymousJWTApi # timeout=10
Fetching upstream changes from C:\Users\xxx\Source\Repos\AnonymousJWTApi
 > git.exe --version # timeout=10
 > git.exe -c core.askpass=true fetch --tags --progress C:\Users\xxx\Source\Repos\AnonymousJWTApi +refs/heads/*:refs/remotes/origin/*
Seen branch in repository origin/master
Seen 1 remote branch
Checking out Revision a7087f81af855cc96b8763a5ec66b96c19a44a30 (origin/master)
 > git.exe config core.sparsecheckout # timeout=10
 > git.exe checkout -f a7087f81af855cc96b8763a5ec66b96c19a44a30
 > git.exe rev-list a7087f81af855cc96b8763a5ec66b96c19a44a30 # timeout=10
[AnonymousJWTApi] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\xxx\AppData\Local\Temp\hudson1582303083838020200.ps1'"
Finished: SUCCESS

编辑:文件正在保存到主文件中...:P

似乎从站不打算托管 PowerShell 脚本或它们的输出,这是我不知道的。

【问题讨论】:

  • 您是否已登录从服务器并尝试手动运行该命令?会发生什么?
  • @ChrisN 是的,这样做会起作用

标签: powershell jenkins master-slave


【解决方案1】:

-ExecutionPolicy Bypass 确保脚本文件可以运行,而不管计算机或用户的执行策略如何。这是正确的,这不是您的问题的原因。

问题可能出在权限上。

Jenkins slave agent 以某个用户身份运行;要么是你用来启动它的用户,要么是作为服务运行的,那么它将是服务帐户。

用户可能没有写信给C:\Foo的权限,所以你可以检查一下。

另一种测试方法是写入工作区目录,因此请执行以下操作:

Get-Service | Export-CSV $env:WORKSPACE\service.csv

应该可以。如果是,则更改C:\Foo目录的权限,或者以已有权限的账户运行slave。

您可以通过以下方法同时知道哪个用户正在运行该服务,以及工作区目录在哪里:

Get-ChildItem env:\ | Out-String | Set-Content -Path $env:USERPROFILE\env.txt

这会将名为env.txt 的文件写入运行脚本的用户的配置文件,其中包含所有环境变量(包括%WORKSPACE%)。您只需浏览每个用户个人资料以查看它的最终位置,然后您就会知道该用户。

【讨论】:

  • 如何找到 $env:WORKSPACE 的位置?在master上的powershell中运行它实际上是c驱动器并且权限被拒绝。但是在奴隶上它似乎已经工作了,我只是不知道在哪里寻找文件
  • 如何将slave作为账户运行?
  • @Beniamino_Baggins 您在主节点上定义从节点时指定了 FS 根; workspace 将比它低一级,然后我认为它会在那里创建一个带有作业名称的文件夹。见wiki.jenkins-ci.org/x/BAN-Ag
  • @Beniamino_Baggins 您是否将 slave 安装为 Windows 服务?如果是这样,请在服务属性中更改 services.msc(标准 Windows 服务管理控制台)中的帐户。如果不是,那我不完全确定。看看我上一条评论中的链接是否有帮助。
  • 它实际上按预期工作,我只是想输出文件会放在从站上。它继续主人。不过,从您的答案中学到了很多东西,并且在技术上是正确的,因为 -ExecutionPolicay Bypass 不是问题。干杯
猜你喜欢
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
相关资源
最近更新 更多