Jenkins Copy-Item通过PowerShell插件

时间:2017-08-30 16:24:46

标签: powershell session jenkins jenkins-plugins

问题

编辑(8/31/2017):为了更好的澄清

所以我正在开发一个需要从Jenkins工作区内复制文件的脚本,并将副本放在用户指定的目标服务器上。这些服务器还要求用户输入其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工作区的特定内容并将其传递到目标服务器/机器上?

请注意:新软件需要批准,存档也不是一个选项

1 个答案:

答案 0 :(得分: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"
  }
}