【问题标题】:Teamcity powershell runner to remotely run commands on serverTeamcity powershell runner 在服务器上远程运行命令
【发布时间】:2019-09-16 21:59:12
【问题描述】:

我有一个奇怪的问题,每当我尝试远程调用我们的一个测试服务器时,TeamCity 就会挂起。

目前的构建步骤是:

  • 的模板文件
  • 中编译代码
  • 打包项目
  • 将包发送到测试服务器
  • 在测试服务器上解压包

现在一切正常,直到最后一个阶段,在远程服务器上解压缩包。现在我只想运行一个powershell命令来连接并运行命令然后退出。如果我从远程桌面使用 powershell,这一切都可以正常工作,并且提供的用户凭据是正确的。

正在运行的示例如下:

$password = ConvertTo-SecureString "%PasswordVar%" -AsPlainText -Force
$credentials = New-Object System.Manager.Automation.PsCredential("%UsernameVar%", $password)
etsn -computername %TestServer1Var% -Credential $credentials

当这被称为 TeamCity 只是挂起时,它必须手动停止,否则它将永远停留在代理上的这一步。我试过不使用凭据,我试过不使用 etsn 并使用完整的命令名称,还尝试了其他远程命令方法,似乎没有任何效果。

那么有没有办法让 TeamCity 实际运行命令?或者找出是什么导致它不确定地处理这一步?

【问题讨论】:

  • 你试过AllowRedirection参数设置吗?这将使您的脚本记录您将在交互式控制台中看到的命令运行的详细信息。
  • 不,现在将这个参数添加到命令中,看看它是否提供更多信息
  • 将该参数添加到调用中,但它仍然挂起,它已经在最后一步进行了 10 分钟,没有给我任何反馈。
  • 嗯 - 我不确定,但这可能是权限问题吗?我认为 estn 不需要管理员权限,但我可能是错的(目前不在 Windows 上)。

标签: powershell teamcity remote-server


【解决方案1】:

这是小问题的混合,因为 1 用户在通过团队城市查询时没有正确解析域,因此需要将其添加到用户名 some-user@some-domain。还有一个问题是,在进行 PSSESSION 连接时会遇到某种连接限制,但是如果我使用脚本块切换到 Invoke-Command,它就可以正常工作。

如果它对这里的任何人有帮助的话,我最终得到的命令是解压缩远程文件,使用 7zip 命令行作为本机解决方案似乎从来没有工作过。

$password = ConvertTo-SecureString "%TestServer.Password%" -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PsCredential("%TestServer.Username%",$password)

$scriptBlock1 = {`
`
    $sevenZip = "%TestServer.ReleasePath%\7za.exe"; `
    &$sevenZip x %TestServer.ReleasePath%\web-package.zip -o%TestServer.WebPath% * -aoa; `
}
Invoke-Command -computername %TestServer.Server% -Credential $credentials -scriptblock $scriptBlock1

要记住的一点是,用户名包含上面列出的域,还需要魔术引号以允许脚本块跨行分布,以及分号表示任务应该一起运行。

【讨论】:

    【解决方案2】:

    Invoke-Command 如果您必须在服务器上运行的脚本很短并且您必须等待它完成执行,则效果很好。

    我的问题是我想在远程服务器上启动一项服务,然后只记录服务器中的内容,然后让 teamcity 构建以继续执行。 使用Invoke-Command,teamcity 确实远程执行了该流程,但一直在等待该流程完成 n 返回。如果您正在寻找只是调用服务器上长时间运行的进程而忘记它的东西,试试这个:

    这个解决方案最适合我:

    1) 将要远程执行的脚本放在服务器内的一个文件中.. 比如说 startup.bat

    call Powershell.exe -executionpolicy remotesigned -File %1\bin\startup.ps1 
    

    这基本上执行了另一个位于 web 服务器中的 powershell 脚本。

    Start-Process -WindowStyle hidden java -ArgumentList '-jar', "$APP_HOME\bin\test-api.jar" -PassThru
    

    确保有将这些文件部署到 Web 服务器的 teamcity 构建步骤。

    2) 创建一个 teamcity Build Step 来执行一个 powershell 脚本文件

    Teamcity 执行的示例 Powershell 命令:

    $SERVER = (Get-Item env:SERVER_NAME).Value
    $APP_HOME = (Get-Item env:APP_HOME).Value
    $STARTUP_SCRIPT_PATH = "$APP_HOME\bin\startup.bat"
    
    Function Remote-Process {
      param(
        [string]$ComputerName,
        [string]$Cmd
      )
    
      echo "Invoking Remote Script.."
      $RETURNVAL = ([WMICLASS]"\\$ComputerName\ROOT\CIMV2:win32_process").Create($Cmd)
      echo $RETURNVAL
    }
    
    $COMMAND = "$STARTUP_SCRIPT_PATH $APP_HOME"
    $output = Remote-Process $SERVER $COMMAND
    
    echo $OUTPUT
    

    其中 APP_HOME 是部署 Web 应用程序的文件夹(在远程服务器上)的绝对路径。

    就是这样。这样,您甚至可以执行服务,并且远程进程不会被杀死并让您继续构建链。

    【讨论】:

      【解决方案3】:

      只是对已接受答案的补充

      $scriptBlock = [Scriptblock]::Create(@'
        echo 'before'
        ipconfig /all
        echo 'after'
      '@)
      
      Invoke-Command -ComputerName AD01 -ScriptBlock $scriptBlock
      

      source
      don't use backquote

      以前可以定义%PowerShell.header%%PowerShell.footer% 参数而不是在TC 步骤中编写样板代码

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-09
        • 1970-01-01
        • 2021-01-03
        • 2022-08-22
        • 1970-01-01
        • 1970-01-01
        • 2014-08-17
        • 2020-10-30
        相关资源
        最近更新 更多