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 ファイルで設定できる他の情報も書き換え可能です。
余談ですが、PowerShell で C# のコード書けるの便利ですね!
Release 設定
Yaml ファイルは以下です。Nuget に Push しているだけですが載せておきます。
TFVCのラベル名をファイルのバージョンに埋め込んで、Nugetリリースまでする(Release)
あと、Release 側のトリガー設定をするのをよく忘れるので、画面ショットを貼っておきます。
実行
Build 画面よりキューを入れます。
ラベルを指定する場合は、Source version に L
+ ラベル名で設定します。
実行中の画面にラベル名が表示されます。
Nuget の Push まで成功すると、Artifacts 画面から指定した Nuget バージョンで作成されているのが確認できます。
Nuget 参照する
適当にプロジェクトを作って、Nuget 参照してみます。
右上のパッケージソースを変更するのを忘れないようにします。(事前設定が必要)
落ちてきた DLL のプロパティを見ると、設定されているのが確認できました。
*1:よくやるコレ⇒ [assembly: AssemblyFileVersion("1.0.*")]
タグの作成をトリガーに自動ビルドを行ったら、コミットハッシュの埋め込みが意図しないものになった話
タグ追加時に自動的にビルドして、コミットハッシュを埋め込みたい
上記2つを組み合わせて
- タグ作成時に自動ビルドを行い
- 成果物にタグのコミットハッシュの埋め込み
ができるようにしてみました。
埋め込みたいコミットハッシュは赤枠の部分です。
謎のコミットハッシュが埋め込まれる…
できたアセンブリのバージョンを見ると
埋め込みたいコミットハッシュと違う値が入ってしまいました。
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 のコミットハッシュ …
結果
意図したコミットハッシュが埋め込まれました。