ちぐログ

メモ書きです

TFVC のラベル名をファイルのバージョンに埋め込んで、Nuget リリースまでする

Git 全盛の時代、TFVC を使っており、かつラベル運用をしているなんて珍しいかもしれませんが、
必要になりそうだったので、作ってみました。

Azure DevOps Service 使ってます。


やったこと

ラベル名を指定して、Build -> Nuget リリース を行う際に以下を実行。

  • 製品バージョンにはラベル名を埋め込む
  • ファイルバージョンは自動インクリメント方式 *1 を自前で設定(同一のビルドジョブはすべて同じとしたい)
  • Nuget バージョン に加工して反映する


例えば、以下のようになります。

内容 設定値
ラベル名 1.0.Lib.20200131
製品バージョン 1.0.0+1.0.Lib.20200131
ファイルバージョン 1.0.7355.22838
Nuget バージョン 1.0.20200131

ラベル名は任意の文字列を設定できます。
製品・Nugetバージョンは決められたバージョン記法があるため、ラベル名と同様にして Patch バージョン部分に文字を入れることができません。
ラベル名もそれらに合わせたらよいのですが、今回はあえてラベル名に文字を入れてます。


Build 設定

詳細な設定手順は省略します。設定後の Yaml ファイルは以下です。
TFVC の場合は Yaml を直接インポートできない?ので、UI からポチポチやっていきます。

TFVCのラベル名をファイルのバージョンに埋め込んで、Nugetリリースまでする

ポイントは、中盤当たりにある PowerShell です。
ソース取得からビルド前までに csproj ファイルを書き換えています。
加工すれば、csproj ファイルで設定できる他の情報も書き換え可能です。

余談ですが、PowerShellC# のコード書けるの便利ですね!


Release 設定

Yaml ファイルは以下です。Nuget に Push しているだけですが載せておきます。

TFVCのラベル名をファイルのバージョンに埋め込んで、Nugetリリースまでする(Release)


あと、Release 側のトリガー設定をするのをよく忘れるので、画面ショットを貼っておきます。

f:id:chiguniiita:20200131222241p:plain


実行

Build 画面よりキューを入れます。 ラベルを指定する場合は、Source version に L + ラベル名で設定します。

f:id:chiguniiita:20200131222806p:plain


実行中の画面にラベル名が表示されます。

f:id:chiguniiita:20200131222920p:plain


Nuget の Push まで成功すると、Artifacts 画面から指定した Nuget バージョンで作成されているのが確認できます。

f:id:chiguniiita:20200131223112p:plain

Nuget 参照する

適当にプロジェクトを作って、Nuget 参照してみます。
右上のパッケージソースを変更するのを忘れないようにします。(事前設定が必要)

f:id:chiguniiita:20200131231615p:plain


落ちてきた DLL のプロパティを見ると、設定されているのが確認できました。

f:id:chiguniiita:20200131231850p:plain f:id:chiguniiita:20200131232253p:plain

*1:よくやるコレ⇒ [assembly: AssemblyFileVersion("1.0.*")]

タグの作成をトリガーに自動ビルドを行ったら、コミットハッシュの埋め込みが意図しないものになった話

タグ追加時に自動的にビルドして、コミットハッシュを埋め込みたい

chiguniiita.hatenablog.jp

chiguniiita.hatenablog.jp

上記2つを組み合わせて

  • タグ作成時に自動ビルドを行い
  • 成果物にタグのコミットハッシュの埋め込み

ができるようにしてみました。

埋め込みたいコミットハッシュは赤枠の部分です。

f:id:chiguniiita:20170206211404p:plain

謎のコミットハッシュが埋め込まれる…

できたアセンブリのバージョンを見ると

f:id:chiguniiita:20170206211831p:plain

埋め込みたいコミットハッシュと違う値が入ってしまいました。

git logを見ても、該当のコミットハッシュが見当たらない…

原因追及

まずはビルドログを追ってみました。

2017-02-06T12:10:33.0016940Z From https://github.com/chiguniiita/Playground
2017-02-06T12:10:33.0016940Z  * [new branch]      master     -> origin/master
2017-02-06T12:10:33.0016940Z  * [new tag]         v0.0.1     -> v0.0.1
2017-02-06T12:10:33.0246951Z ##[command]git checkout --progress --force af73e2d9cae44f6a8ad9d7499111aeecced1eb25
2017-02-06T12:10:33.0636955Z Note: checking out 'af73e2d9cae44f6a8ad9d7499111aeecced1eb25'.
2017-02-06T12:10:33.0636955Z 
2017-02-06T12:10:33.0636955Z You are in 'detached HEAD' state. You can look around, make experimental
2017-02-06T12:10:33.0636955Z changes and commit them, and you can discard any commits you make in this
2017-02-06T12:10:33.0636955Z state without impacting any branches by performing another checkout.
2017-02-06T12:10:33.0636955Z 
2017-02-06T12:10:33.0636955Z If you want to create a new branch to retain commits you create, you may
2017-02-06T12:10:33.0636955Z do so (now or later) by using -b with the checkout command again. Example:
2017-02-06T12:10:33.0636955Z 
2017-02-06T12:10:33.0636955Z   git checkout -b <new-branch-name>
2017-02-06T12:10:33.0636955Z 
2017-02-06T12:10:33.0636955Z HEAD is now at 383e09f... Merge pull request #16 from chiguniiita/issue-15

謎のコミットハッシュを使って git checkoutをしているのを発見。
HEAD is now at ~ にあるコミットハッシュが入れたい値です。
謎のコミットハッシュはどこから来た?

答えはgit show-ref

いろいろ調べていくうちにgit show-refコマンドなるものがあったので実行してみたら答えがありました。

> git show-ref
git show-ref
383e09f5b429aed37d049d2337e5be977919427f refs/heads/master
383e09f5b429aed37d049d2337e5be977919427f refs/remotes/origin/HEAD
383e09f5b429aed37d049d2337e5be977919427f refs/remotes/origin/master
af73e2d9cae44f6a8ad9d7499111aeecced1eb25 refs/tags/v0.0.1

どうやらタグのコミット時に、新たにコミットハッシュを取得していて、これが使われていた模様。

とりあえず対応

対応方法としてベストな選択かは不明ですが、git rev-parse HEADで取得した、コミットハッシュをアセンブリに埋め込めば良さそうです。

更新したスクリプトは以下。

Visual Studio Online でビルドする際に、アセンブリに Git のコミットハッシュ …

結果

意図したコミットハッシュが埋め込まれました。

f:id:chiguniiita:20170206212246p:plain