6

テストサーバーの 1 つにリモートコールをしようとすると、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 つは、チーム シティ経由でクエリを実行したときにユーザーがドメインを正しく解決していなかったため、これをユーザー名に追加する必要があったこと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

覚えておくべきことの 1 つは、ユーザー名には上記のドメインが含まれていることです。また、スクリプト ブロックを複数の行にまたがるためにはマジック クォーテーションと、タスクを一緒に実行する必要があることを示すセミコロンが必要です。

于 2013-04-05T11:48:19.717 に答える
0

Invoke-Commandサーバー上で実行する必要があるスクリプトが短く、実行が完了するまで待機する必要がある場合に適しています。

私の問題は、リモートサーバーでサービスを開始し、サーバー内のものをログに記録し、teamcity ビルドを実行して実行を継続させたいということでした。ではInvoke-Command、teamcity はプロセスをリモートで実行しましたが、そのプロセスが終了するのを待ち続けました。サーバー上で実行時間の長いプロセスを呼び出すだけで、それを忘れてしまうものを探している場合は、これを試してください。

この解決策は私にとって最もうまくいきました:

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 Build ステップがあることを確認してください。

2) powershell スクリプト ファイルを実行するための teamcity ビルド ステップを作成します。

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 に答える