6

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

4

3 回答 3

8

这是小问题的混合,因为 1 用户在通过团队城市查询时没有正确解析域,因此需要将其添加到 username 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

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

于 2013-04-05T11:48:19.717 回答
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 应用程序的文件夹(在远程服务器上)的绝对路径。

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

于 2016-01-28T03:56:27.070 回答
0

只是对已接受答案的补充

$scriptBlock = [Scriptblock]::Create(@'
  echo 'before'
  ipconfig /all
  echo 'after'
'@)

Invoke-Command -ComputerName AD01 -ScriptBlock $scriptBlock

来源
不要使用反引号

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

于 2019-09-16T13:28:16.260 回答