28

.ps1さまざまな TeamCity パラメーターを使用したスクリプトの呼び出しにすぎない TeamCity 7 ビルド構成があります。

私はそれが設定の簡単な問題であることを望んでいました:

  • 脚本

    ファイル

  • スクリプト ファイル

    %system.teamcity.build.workingDir%/Script.ps1

  • スクリプト実行モード

    「-File」引数を指定して .ps1 スクリプトを実行する

  • スクリプト引数

    %system.teamcity.build.workingDir% -OptionB %BuildConfigArgument% %BuildConfigArg2%

そして、私は期待します:

  • 引数を台無しにしてスクリプトが開始されない場合、ビルドは失敗します
  • Script.ps1 スクリプトがスローされると、ビルドは失敗します
  • スクリプトexitが非0エラー レベルの場合、ビルドを失敗させたい (おそらく、これは慣用的な PS エラー管理ではない - .ps1 は、例外がない場合にのみ成功を報告する必要がありますか?)

質問: うまくいきません。どのように機能するはずですか?別のオプションを選択することで修正できる、大幅に間違っていることはありますか?

4

10 に答える 10

35

フレンドリーな TeamCity マニュアルに記載されているとおり:

エラー出力のError設定とビルド失敗条件の追加

構文エラーと例外が存在する場合、PowerShell はそれらを stderr に書き込みます。TeamCity をビルドに失敗させるには、[エラー出力] オプションを [エラー] に設定し、エラー出力でビルドが失敗するビルド失敗条件を追加します。

これを機能させるための鍵は、2 つのデフォルトを変更することです。

  1. Build Failure Conditionsの最上位で、エラー メッセージをオンにすると、ビルド ランナーによってログに記録されます。
  2. [PowerShell]ビルド ステップで、高度なオプションを表示し、エラー出力を設定します:エラー

9.1 では、次のように動作します (以前のバージョンでも動作しても驚かないでしょう)。

  1. 既定のオプションを使用して PowerShell ビルド ステップを作成する
  2. ドロップダウンをScript: Source codeと言うように変更します
  3. trap { Write-Error "Exception $_" ; exit 98 }スクリプトの先頭にa を追加します
  4. (オプションですが、TeamCity ビルド スクリプト内で適切な種類のスクリプト作成のためのより正確な IMO)

    詳細オプションを表示し、オプションをオンにします: -NoProfile 引数を追加します

  5. (オプションですが、@Jamal Mavadat によって提案されているように、より明確にレンダリングされるため、私にとってはこれがデフォルトである必要があります)

    詳細オプションを表示し、オンに切り替えますエラー出力:エラー

    (ASIDE @JetBrains: ラベルが「Format stderr output as」である場合、誤解を招く可能性は低くなります)

これには、次のケースが含まれます。

  1. エラーを解析する [例外としてバブルアップし、すぐに実行を停止する]
  2. 例外 [ throwPS コードで直接的または間接的に n を表示し、TC の終了コードをトリガーしてビルドを停止する]
  3. スクリプト内の明示的なexit nものはビルドに伝播します (ゼロ以外の場合は失敗します)
于 2015-07-03T12:30:01.493 に答える
5

あなたは物事を考えすぎています。これを試して:

  • 脚本

      File
    
  • スクリプト ファイル

      Script.ps1
    

    これにパスを指定する必要はありません。デフォルトでは、チェックアウト ディレクトリからの相対パスです。

  • スクリプト実行モード

      Put script into PowerShell stdin with "-Command -" arguments
    

これはまさに、Teamcity 内で一連の PowerShell スクリプトを実行するために使用するものです。

アップデート

PowerShell スクリプトでエラーが発生するとビルドが失敗するという元の投稿の一部を見逃していました。申し訳ありません!

パズルのその部分を 2 つの異なる方法で解決しました。

通常の PowerShell スクリプトの場合

メイン コード ブロックをtry...catch;で囲みます。例外が発生した場合は、ゼロ以外の整数値を返します。実行が成功した場合は、0 を返します。

成功した場合にゼロを返すというこの規則は、歴史的に非常に古いもので、Unix/Linux システム、DOS、CP/M などで使用されています。

PSakeビルド スクリプトの場合

ラッパー PowerShell スクリプトを使用して psake を呼び出し、応答メッセージを stdout に書き込むことで teamcity ビルドの結果を直接設定します。

スクリプトの開始時に、失敗を表すステータス メッセージを定義します。

$global:buildResult = "#teamcity[buildStatus status='FAILURE' text='It died.']

psake スクリプト内で、$global:buildResult最後に実行される専用タスクの成功を示すように更新します。

$global:buildResult = "#teamcity[buildStatus status='SUCCESS' text='It lives.']

ラッパー スクリプトの最後に、ステータス メッセージを出力します。

write-host $global:buildResult

ビルド スクリプトで何かが失敗すると、最後のタスクは実行されず、デフォルトのメッセージ (失敗を示す) が出力されます。

いずれにせよ、Teamcity はメッセージを受け取り、ビルド ステータスを適切に設定します。

于 2012-08-24T03:55:50.827 に答える
3

TeamCity 9で私のために働く受け入れられた答えの代替(すべてのビルドステップに影響するため、「ビルド失敗条件」オプションを変更するのは好きではありません):-

PowerShell エラーでビルド ステップが失敗するようにしたかったのですが、きれいなメッセージが表示されました。だから私はエラーメッセージをスローし、エラーコードを返したいと思っていました.... try / catch / 最終的に救助に。

わかりやすくするために編集: このスクリプトは失敗するはずです。例外をスローして終了コードを返すことが可能であることを示しています。したがって、TeamCity が処理する終了コードと、私の場合は、問題の場所を示す明確なデバッグ メッセージの両方が得られます。

私のデモスクリプト:

Try {
    Write-Host "Demoing the finally bit"
    # Make sure if anything goes wrong in the script we get an exception
    $ErrorActionPreference = "Stop"

    # This will fail and throw an exception (unless you add the file)
    Get-Content IDontExist.txt
}
Catch
{
    # Throwing like this gives a pretty error message in the build log
    throw $_
    # These give less pretty/helpful error messages
    # Write-Host $_
    # Write-Host $_.Exception.Message
}
Finally
{
    # 69 because it's more funny than 1
    exit(69)
}
于 2015-09-04T10:43:28.413 に答える
2

Jenkins を使用する必要がないことを称賛するだけです。同様の問題に PowerShell ステップを使用することはできません。代わりに、例外および終了コードでステップを失敗させる次のマジック ラッパーを呼び出す「cmd」ステップを使用する必要があります。

%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -Command "& { $ErrorActionPreference = 'Stop'; & 'path\to\script.ps1 -arg1 -arg2; EXIT $LASTEXITCODE }"
于 2015-07-03T12:50:21.677 に答える
2

新しい TeamCity バージョンが手の届く範囲にある場合は、PowerShell ビルド ランナーの改善点を確認する価値があります。

特に、Error Outputデフォルトwarningから への変更にerror興味があるかもしれません。

于 2014-12-15T04:53:12.840 に答える
1

これは9.xで提供されるオプションに取って代わられましたが、当時は間違いなく防弾であり、私が気に入った他の解決策が見つからなかったため、ここに残します。


あなたはうまくいく何かをすることができます。以下でテスト済み

  • スクリプト ビットのエラー
  • 不足しているファイル
  • スクリプトは非0ERRORLEVELで終了します

TeamCity Powershell ランナー オプションで、次のように設定します。

  • スクリプト ファイル

    ソースコード

  • スクリプト ソース

    $ErrorActionPreference='Stop'
    powershell -NoProfile "Invoke-Command -ScriptBlock { `$errorActionPreference='Stop'; %system.teamcity.build.workingDir%/Script.ps1 %system.teamcity.build.workingDir% --OptionB %BuildConfigArgument% %BuildConfigArg2%; exit `$LastExitCode }"

    (ラップされていないバージョン:powershell -NoProfile "Invoke-Command -ScriptBlock { $errorActionPreference='Stop'; %system.teamcity.build.workingDir%/Script.ps1 %system.teamcity.build.workingDir% --OptionB %BuildConfigArgument% %BuildConfigArg2%; exit$LastExitCode }"

  • スクリプト実行モード

    「-Command -」引数を使用してスクリプトを PowerShell stdin に入れます

  • 追加のコマンド ライン パラメータ

    -NoProfile

これが最良の答えではないことを願っています!

于 2012-07-25T10:44:43.380 に答える
-1

次のようなものを使用します。

 echo "##teamcity[buildStatus status='FAILURE' text='Something went wrong while executing the script...']";

参考までに、TeamcityのReporting Build Statusをご覧ください。

于 2014-04-28T10:05:40.597 に答える
-1

Powershell v2 には、少なくとも -File オプションがエラー コードを台無しにするという問題がありました。それがどのように台無しになるかなどについて、いくつかの詳細があります。

答えは、-Command オプションに切り替えるか、LastErrorCode をチェックして失敗すると思われる場合は 1+ を返すバッチ ファイルでラップすることです。

http://zduck.com/2012/powershell-batch-files-exit-codes/

于 2014-03-24T11:48:29.737 に答える