Teamcity powershell runner可在服务器上远程运行命令

时间:2013-04-03 13:19:58

标签: powershell teamcity remote-server

我有一个奇怪的问题,每当我尝试远程调用我们的测试服务器时,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实际运行命令?或找出是什么导致它无限期地处理这一步骤?

3 个答案:

答案 0 :(得分:7)

这是一个小问题的混合,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

要记住的一件事是用户名包含上面列出的域,还需要魔术引号以允许脚本块分布在行和分号上以指示任务应该一起运行。< / p>

答案 1 :(得分:0)

如果您必须在服务器上运行的脚本很短并且您必须等待它完成执行,那么

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

确保有一个teamcity Build步骤将这些文件部署到Web服务器。

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应用程序的文件夹(在远程服务器上)的绝对路径。

关于它。这样,您甚至可以执行服务,并且不会终止远程进程并让您继续构建链。

答案 2 :(得分:0)

只是已接受答案的补充

$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步骤中编写样板代码