编辑(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工作区的特定内容并将其传递到目标服务器/机器上?
请注意:新软件需要批准,存档也不是一个选项
答案 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"
}
}