【问题标题】:getting error while copying file to remote location using powershell scripts in gitlab runner在 gitlab runner 中使用 powershell 脚本将文件复制到远程位置时出错
【发布时间】:2019-04-11 11:17:25
【问题描述】:

我正在设置 GitLab CI/CD 管道以使用 PowerShell 复制项功能复制战争文件。我在管道中遇到错误。用户已经是 gitlab runner 计算机上的管理员。

[servername] Connecting to remote server name failed with the
following error message: Access is denied. For more information, see
the  about_Remote_Troubleshooting Help topic.
    + CategoryInfo          : OpenError: (servername:String) [], PSRemotingT     ransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionStateBroken ERROR: Job failed: exit status 1

这是我在 .yml 文件中的脚本。

GitLab Runner 在 windows 服务器中注册。

这是我在 .yml 文件中的脚本。

envvariable_username - Environment variable configured in gitlab CI/CD settings page
$envvariable_password - Environment variable configured in gitlab CI/CD settings page

- powershell Invoke-Command -ComputerName computer_name -argumentlist $envvariable_username,$envvariable_password -ScriptBlock {
            $password = convertto-securestring -String $envvariable_password -AsPlainText -Force
            $mycred = new-object -typename System.Management.Automation.PSCredential $envvariable_username, $password
            New-PSDrive -Name "s" -PSProvider FileSystem -root "\\\\computer_name\\share" -Credential $mycred
            New-PSDrive -Name "z" -PSProvider FileSystem -root "\\\\computer_name\\backup" -Credential $mycred
            Copy-Item -Path "s:\\sample.war" -Destination "z:\\sample.war"
            }

预计将 .war 文件从一个服务器位置复制到另一个服务器位置

【问题讨论】:

  • Welcome to SO.. 错误消息中清楚地提到您收到拒绝访问。因此,请检查远程系统中路径的权限。以提升模式运行并检查
  • 权限完好,用户是远程计算机上的管理员。如果我以管理员用户身份在命令提示符下运行,则相同的脚本可以工作文件。我们是否可以在我的 yml 文件中设置以管理员身份运行?
  • 您正在调用 powershell.exe,然后是您的调用命令,并且您正在访问网络驱动器。您正在登陆DOUBLE HOP Issue。另外,您仍然可以使用-RunAs
  • 感谢您的快速回复。我试过没有 powershell.exe 但没有用。低于errorbash:第52行:Invoke-Command:找不到命令
  • 我在 gitlab CI 管道中运行 powershell 脚本。

标签: powershell gitlab


【解决方案1】:

查看您的脚本,您尝试在没有指定凭据的情况下在远程服务器上执行脚本块。这意味着要么服务器没有限制,要么您假设两个服务器属于同一个域,因此将使用 kerberos。 以我的经验,当第二种情况出现时,大多数人忘记评估代表谁正在执行脚本。请记住,除非另有说明,否则进程会继承父进程的用户上下文。

这意味着运行您的脚本的用户没有对远程服务器的必要访问权限。你总是可以先这样做$env:USERDOMAIN + "\" + $env:USERNAME

例如你的 yaml 中的一行

- powershell $env:USERDOMAIN + "\" + $env:USERNAME

因此,当您从与用户一起启动的控制台中调试某些内容时,您不会 100% 复制条件,因为您忘记了任何流程中最重要的方面,即登录用户。

然后,如果这可行,我注意到您正在尝试从远程服务器访问另一个远程位置。我注意到您正在为此部分指定凭据,如果请注意,如果从远程会话中尝试访问任何远程资源,那么您需要注意一些警告。请阅读更多关于它们的信息here,尤其是双跳的特定内容。

作为建议,对利用远程执行的脚本进行故障排除的最佳方法是使用与运行脚本的服务相同的用户登录服务器,从而 100% 复制条件。也可以仅使用其他用户的凭据启动控制台。

【讨论】:

  • 感谢您的建议。在 yaml 文件中执行 userdoamin 变量时出现错误。这是错误
  • 感谢您的建议。在 yaml 文件中执行 userdoamin 变量时出现错误。解决了我的问题,我已将我的 PowerShell 脚本移动到一个文件并在运行器中的 yml 文件中执行。我的直接问题解决了,但这不是一个干净的解决方案。即使脚本文件中存在执行错误,构建文件也始终报告成功。看起来 gitlab CI 管道在执行 powershell 脚本方面没有很好的支持。谢谢你的帮助。 - powershell -File DeployScripts.ps1 $daiusername $devsourcepath
  • 我没有使用过 gitlab ci,但你应该认为进程之间的绝对最小成功/失败通信是退出代码。更高级的场景包括错误流,但退出代码是最可靠的。假设 PowerShell 确实正确地引发了错误,请在脚本中的包装器周围放置一个 try/catch,并在错误退出时使用非零值。
  • 谢谢。我添加了 try/catch 和退出代码,以在每次失败时返回错误。
  • 请随时为正确答案投票。
猜你喜欢
  • 2016-09-25
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2012-10-25
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多