通过PowerShell插件的詹金斯复制项目

问题描述 投票:1回答:1

问题

编辑(2017年8月31日):为更好的澄清

因此,我正在处理一个脚本,该脚本需要从Jenkins Workspace内部复制文件,并将副本放置在用户指定的目标服务器上。这些服务器还要求用户输入其DomainUserName和Password,以便可以访问这些服务器。因此,我发现自己很难在这两个(或多个)点之间进行简单的复制/粘贴。

我已尝试使用PowerShell插件进行许多尝试,希望能够完成此任务,但都没有结果。

我已经尝试开始与目标服务器的Invoke-Command会话;但是,一旦进入本会话,它就不再了解Jenkins环境是什么,因此失去了Jenkins的范围,使我无法以任何简单的方式(我能想到的)来调用它。

我试图传递-ArgumentList个项目,以希望保持文件位置的完整性;但是,一旦进入会话,它就会尝试将该位置应用于与之建立会话的服务器。示例:我将文件位置作为参数传递给Invoke-Command,并使用该参数作为Copy-Item编写-Path语句;但是,当在运行时翻译代码时,它将路径视为C:\file\to\be\copied,并尝试在服务器上而不是从Jenkins工作区中找到该位置。

我已经尝试执行以下操作:

Copy-Item -Path "\\JenkinsServerIP\C$\Expected\Path" -Destination C:\Targeted\Path
# or reverse of above
Copy-Item -Path "$env:Workspace\Expected\Path" -Destination "\\$serverAddress\C$\targeted\Path"

也失败了。

[我发现PowerShell v5和更高版本具有Copy-Item的功能,可让您复制-FromSession-ToSession。不幸的是……我还发现,到目前为止,Jenkins的PS插件还不支持此功能。

# Thus, this following 'easy' example will not work
$session = New-PSSession -ComputerName $targetComputer -Credentials $cred
Copy-Item -Path "C:\Original\Path\" -Destination "C:\Target\Path\" -ToSession $session

我的想法已经用光了,我无法以很多方式研究这个问题...

问题

没有人知道如何在Jenkins PowerShell插件中设置Copy-Item,这将允许我复制Jenkins Workspace的特定内容并将其粘贴到目标服务器/机器上。

请注意:新软件需要批准,并且也不可以选择存档

powershell session jenkins jenkins-plugins
1个回答
0
投票

由于我没有直接答案,所以我假设您也使用pipeline插件,并告诉我该如何做。也许我可以给你一个主意...

对于复制文件,我放弃了PowerShell,现在使用以下两个选项之一:

用于在节点之间交换文件:使用stash / unstash,对于小文件来说这是简单可靠的。要从某个远程计算机复制:使用批处理脚本映射网络,如下所示:

withCredentials([usernamePassword(credentialsId: yourCredential, usernameVariable: 'REMOTE_USERNAME', passwordVariable: 'REMOTE_PASSWORD')]) {

  def source = 'XX.XX.10.2\\Expected\\File\\Path'
  def destination = 'C:\\direct\\path'
  # Some arbitrary drive letter not currently in use...
  def netDrive = 'n:'

  try {
    bat "net use $netDrive \"$source\" ${env.REMOTE_PASSWORD} /u:${env.REMOTE_USERNAME}"

    # Run your script here. You can either write it directly or use readFile to load it into a variable
    powerShell 'Your-Script'
  }
  catch (e) {
    print e.getMessage()
    print e.getStackTrace()
  }
  finally {
    bat "net use /d $netDrive"
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.