web-dev-qa-db-ja.com

TeamCityビルドステップを条件付きで実行する

「ルートプロジェクト」レベルに配置したすべてのプロジェクトの汎用ビルドテンプレートの定義に取り組んでいます(TeamCity 8のこの新しい機能のおかげです)。一部のプロジェクトではインストーラーを作成します。インストーラーは、powershellスクリプトを実行する別の「ビルドステップ」で生成する必要があります。ただし、一部のプロジェクトではこのインストーラーを作成しないため、この追加のビルド手順は必要ありません。

ビルドパラメーターに基づいて、ビルドステップを条件付きで実行する方法はありますか?ここではおそらく「ビルドステップの無効化」機能を活用できると思いましたが、パラメータを介してステップの有効化/無効化ステータスを定義する方法がわかりません。

もちろん、この条件をインストーラー生成を実行するビルドステップに組み込むこともできますが、teamcity自体から処理できる場合はよりクリーンになります。

47
Stuart Lange

何度も条件付きビルドステップが必要でしたが、残念ながら、現時点ではこの機能は存在しません。 http://youtrack.jetbrains.com/issue/TW-17939

多くのビルド構成でテンプレートを使用できず、インストーラーを作成する必要のないビルド構成/プロジェクトのビルド手順を無効にするだけの理由はありません。個々のビルド構成でステップを無効にしても、ベースとなる親テンプレートには影響しません。

TCにランタイム/動的メソッドが組み込まれているほど整頓されていませんが、ときどき使用します。 iwoも提案しました。

17
fwise

TCは、実行ポリシー以外のレベルでは条件付きランナーステップの実行をサポートしていないようです(ビルドステータスが成功した場合、以前のすべてのステップが正常に終了した場合、前のステップが常に失敗した場合でも、常に)、それはあなたが望むものではありません。

だから、システムのようなインストーラジェネレータのpowershellビルドステップにカスタムシステムビルドパラメータを提供する必要があるようです.boolにする必要があるものを生成します(非表示にする、プロンプトする、設定パラメータに基づいて値を取得するなど)、そして、あなたのPowerShellランナーで、これを追加します:

param([int]$Generate)
if ($Generate) {
  Write-Host "generating installer..."
   # call your func()
} else {
   Write-Host "skip installer"
}

ランナー構成で、-Generate%system.Generate%をスクリプト引数として追加します(追加のコマンド引数ではなく、注意してください!)。 %system.Generate%は、ランタイム値に基づいて1または0に展開する必要があります。

10
iwo

私は解決すべき非常に類似した問題があるので、このユースケースを研究してきました。私がこれまでに見つけた最良の解決策は、fwiseの答えに記載されているものです-テンプレートに必要なすべての可能なステップを含めることですが、場合によっては、各プロジェクトの不要なステップを無効にします。

そのため、ルートレベルで「インストーラー」ビルドステップを含めますが、このテンプレートを継承し、インストーラーを持たないプロジェクトでは無効にします。

単一のオプションのステップでは、これは良いアプローチのように感じますが、多くのオプションのステップを含む大規模で複雑なテンプレートにはあまりうまく拡張できません。

これを TeamCityのドキュメントはこちら から選択しました:

  • 必要に応じてビルド手順を並べ替えることができます。テンプレートから継承されたビルド構成がある場合、継承されたビルド手順を並べ替えることはできません。ただし、カスタムビルドステップ(継承されない)は、継承されたビルドステップの前または間にも、任意の場所に任意の順序で挿入できます。継承されたビルドステップは、元のテンプレートでのみ並べ替えることができます。
  • ビルド構成テンプレートから継承されている場合でも、ビルドステップを一時的または永続的に無効にできます。
0
Matt