2016-10-19 5 views
-1

私はOctopus Deploy(3.4.12)をトライアルしており、NuGetパッケージ名としてMSビルド名からビルド番号を自動的に使用したいと考えています。例えば、私の最新のMSBuildは、名前を削除した場合「MyAppのBuild_20161019.2」で、私のアプリ名がMyAppをで、その後、私は私のパッケージはMyApp.20161019.2.0.nupkg呼ばれるようにしたいですOctoPackを使用してNuGetパッケージの名前でMSBuildビルド番号を取得するには?

理由は、アプリケーションのアセンブリバージョンは変更されません(歴史的な理由、非ネゲ)ので、ビルド番号を毎回OctoPackにビルドパラメータとして手動で渡さない限りパッケージIMO)、私はパッケージをOctopusライブラリにロードできません。

私は古い学校のTFS XAMLビルド定義btwを使用しています。

私はのparamsは

String.Format("/p:SkipInvalidConfigurations=true {0} /p:OctoPackPackageVersion={1}", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty), BuildDetail.BuildNumber.Split(CChar("_"))(1)) 

であり、手順を追ったが、ビルドとに失敗したように、カスタムビルドテンプレートを作成し、ファイル名を指定して実行MSBuildの項目を変更するとブログを見つけたことを指摘しなければなりません次のエラー得られます

Validation Error: The private implementation of activity '1: DynamicActivity' has the following validation error: Compiler error(s) encountered processing expression "String.Format("/p:SkipInvalidConfigurations=true {0} /p:OctoPackPackageVersion={1}", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty), BuildDetail.BuildNumber.Split(CChar("_"))(1))". 'Microsoft.TeamFoundation.Build.Client.BuildDetail' is not accessible in this context because it is 'Friend'.

答えて

1

OKを、私はGitのに関連した同様の質問の助けを借りてそれを行う方法を見つけたのビルド:Add BuildNumber in GitTemplate.12.xaml

WARNING!! AFAIK you're going to need VS2013 for this. You can't do it in VS2015.

完全性のために、炎のフープのステップをすべてリストアップしました。ジャンプを通過してください。

第一の試み:

私は、次のMSBuild引数に

/p:RunOctoPack=true /p:OctoPackPackageVersion=”$(TF_BUILD_BUILDNUMBER)”

を提供することにより、単にTF_BUILD環境変数TF_BUILD_BUILDNUMBERを使用してOctoPackパッケージ番号を設定しようとしましたが、TF_BUILD_BUILDNUMBERは、テキスト(の名前を含んでいます私は思う)と同様に数字、例えばCIBuild_20130613.6 NuGetエラーが発生したのは、NuGetが数字のみで動作するためです。また、私は本当に欲しいだけです20130613.6とにかく。

第二の試み:

研究は、私がカスタマイズされたビルドプロセステンプレートを作成しなければならなかったことが示されました。開始点として、既定のテンプレートのコピーをダウンロードして、既定のテンプレートを使用する既存のビルドプロセスの定義を編集し、ダウンロードリンクをクリックします。

enter image description here

次は私がOctoPackBuild.xamlにテンプレートを名前が変更され、TFSにこれを追加しました。私はビルドしたいプロジェクトとは別のBuildProcessTemplatesというフォルダに入れます。このテンプレートはどのプロジェクトにも使用できます。

技術的には、ワークフローアクティビティライブラリプロジェクトを作成してテンプレートをプロジェクトに追加し、プロジェクトをTFSにチェックする必要がありますが、これは不要であることがわかりました。あなたが豚全体に行きたい場合は、msdn articleを参照してください。

xamlファイルがTFS内にある場合は、Visual Studioでビルド番号への参照を取得するためにxamlファイルを編集する必要があります。以下の手順は、this msdn questionの回答から出てきました。

A)OctoPackBuild.xamlファイルをチェックアウトし、Visual Studioで2013

bはそれを開く)XAMLエディタの下部にあるインポート]タブをクリックし、Microsoft.TeamFoundation.Buildへの参照を追加します。 Activities.Extensions。

enter image description here

C)XAMLエディタでコンテナの全体のビルドプロセス」をクリックし、下部にある[変数]タブをクリックします。 BuildDetailという変数を追加し、ツールボックスからIBuildDetail

enter image description here

d)のように、そのタイプを設定し、直後更新番号活動を構築することGetEnvironmentVariableアクティビティをドラッグし、にタイプを設定be IBuildDetailです。アクティビティーのプロパティーを編集します。 < BuildDetail(またはあなたのボートを浮かぶものは何でも)「詳細ビルドを取得]をに表示名、 WellKnownEnvironmentVariables.BuildDetailにNameプロパティを設定し、そして結果 - これはの名前ですあなたが作成した変数。

enter image description here

e)は、今、あなたはBuildDetailオブジェクトへのアクセス権を持っていることを、あなたは、MSBuildのにBuildNumberをプロパティを渡すことができます。あなたはBuildDetailが今、あなたの変数を参照すると、しないように「Microsoft.TeamFoundationされていることに注意すべきである「ファイル名を指定して実行のMSBuildの活動のCommandLineArgumentsプロパティを編集し、

String.Format("/p:SkipInvalidConfigurations=true {0} /p:OctoPackPackageVersion={1}", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty), BuildDetail.BuildNumber.Split(CChar("_"))(1)) 

に値を設定することでこれを行います。 Build.Client.BuildDetail 'を呼び出します。

また、BuildNumberが[text] _ [numbers]の形式であることを前提としています。そのため、Split関数はテキスト部分を削除し、数字のみをOctoPackに渡します。あなたがビルドナンバーを分割しなかった場合は、私が1回目の試みで言及したNuGetの問題が発生します。つまり、ビルド名に余分なアンダースコアを付けると、#1ではなく要素#2を選択する必要があります。

f)カスタムビルドテンプレート(OctoPackBuild.xaml)をTFSに戻してください。

g)次に、既定のテンプレートの代わりにカスタムテンプレートを使用するようにビルドプロセスを編集する必要があります。

この練習にVS2015を使用できないのは、UIでTFSからxamlファイルを選択できないためです。 MSの予算がなくなり、UIの一部が破棄されたようです。

VS2010もTFS 2013テンプレートでは機能しないため、機能しません。

私が動作させる唯一の方法は、VS2013を使用してそこからビルドプロセスを編集することでした。 VS2013では、新しいテンプレートを指定し、TFS内をナビゲートしてOctoPackBuild.xamlファイルを見つけることができます。

h)ビルドプロセスで行う必要があるのは、MSBuildの引数にadd/p:RunOctoPack = trueとするだけで済みます。

enter image description here

が、これは誰かに役立ちます願っています!

+0

@ Cece-MSFTはい、私はそれをします。私は自分の質問に対する答えなので、2日間待たなければなりません。 – DeanOC

関連する問題