ChatWork 向けのC# クライアントを開発していて、ここ1~2年は更新していなかったものの、最近.NET Core対応させたり、API endpoint v2に対応したりしてまた更新するようになりました。
2年前にAppVeyorで自動ビルド環境を作っていましたが、当時は.NET Core対応などなくVisual StudioのMSBuildでビルドしていました。今回、.NET Core対応したので、dotnet
コマンド中心に自動ビルドを対応したので、そのまとめです。作ったプロジェクトはここにあります。
2年前に作ったプロジェクト、publicリポジトリ向けの無償プランなのにまだビルドログまで保存されていて驚きだったんですがコミット連携とかがおかしくなっていたのでいったんAppVeyorのプロジェクトを作成しなおしました。その上で今回実現できた自動ビルドの中身はこんな感じです。
- 任意のブランチ*1へのコミット、もしくはPRが作成されたらビルドがトリガーされる
- 最新の.NET Core SDKでビルドする
- AppVeyor側で採番されるビルド番号をsuffixにつけたバージョンのNuGetパッケージを生成する。逆に言うと、
<Major>.<Minor>.<Patch>
形式のバージョンは明示的にcsprojで指定し、AppVeyor側からは操作しない。 - 自動ビルドで生成したNuGetパッケージはAppVeyorが持っているプロジェクトごとのNuGetリポジトリにpushする
- (この項目だけ未テスト)GitHubにタグをpushすると、デプロイ処理が実行され、
nuget.org
にリリースビルドされたパッケージをpushする。リリースビルド用のパッケージはsuffixをバージョンにつけない。
順番に見ていきましょう。
ビルド番号とトリガー
AppVeyorの場合、設定したGitHubリポジトリに対してデフォルトですべてのコミットでビルドがトリガーされます。トリガーされたくないブランチや、特定のブランチのみトリガーしたい場合はsettings
のGeneral
タブで指定します。また、ビルド番号形式も指定できます。{build}
で自動インクリメントされる数値、{branch}
でコミットされたブランチ名が入ります。
このページのほかの設定はデフォルトのままにしています。
ビルド環境の設定
最新の.NET Core SDKはVisual Studio 2017という種類のイメージを指定するとすでにインストールされています。インストールスクリプトを記述することもできるので、指定したバージョンのSDKであったりその他のツールをインストールすることもできるでしょう。gitリポジトリをcloneするフォルダは、あとあとのスクリプトの記述を楽にするために明示的に指定しています。
ビルドスクリプトとsuffixの指定
次にBuildタブでビルドスクリプトを記述します。.NET Coreプロジェクトなので、組み込みで用意されているMSBuildではなく、dotnet
コマンドを使ったスクリプトを記述します。といってこのように数行程度のスクリプトです。
dotnet --info cd Chatwork.Service dotnet restore dotnet pack -c Debug --version-suffix $env:APPVEYOR_BUILD_VERSION dotnet pack -c Release
デバッグのために--info
を出力した後は、プロジェクトディレクトリに移動して、NuGetのリストアー、そしてDebug構成とRelease構成でdonet pack
してNuGetパッケージを作成しています。普段の自動ビルドはDebug構成のみ、タグのpushのときはRelease構成のみビルドすればいいのですが、条件分岐をさぼって両方実行しています。また、--version-suffix
はNuGetパッケージを作成するとのバージョンサフィックスをコマンドから指定するオプションです。プロジェクトファイル(csproj
)で指定しているVersionPrefix
とここで指定したサフィックスがあわさってバージョンとなります。またenv:APPVEYOR_BUILD_VERSION
という環境変数を使ってGeneralタブで指定したバージョンを参照することができます。
バージョン番号がci
ではじまっているのは、アルファベットを含むことでprerelease扱いにすることができるからです。
Debugビルドパッケージの開発用NuGetフィードへの登録
AppVeyorではプロジェクトごとにNuGetフィードが用意されていて、ArtifactタブでnupkgファイルをArtifactに指定すると、自動で登録してくれます。これとは別にアカウントごとに用意されたNuGetフィードもあって、こちらにpushするときは通常のNuGetリポジトリ同様、ApiKeyとServerを指定してdotnet nuget push
します。
リリース用のDeployment
開発用にはこれで以上ですが、リリース時にnuget.orgにpushするべきDeploymentタブで設定します。デフォルトだとビルドのたびにDeploymentが実行されるので、今回のようにタグがpushされたときのみDeployするには、Deployment ConditionでAPPVEYOR_REPO_TAG
がtrue
の条件を追加しておきます。NuGetへのpushはNuGetというproviderが用意されているので、それを選択し、ApiKeyやpushするファイルを指定すればOKです。
まとめ
以前のVisual StudioのMSBuildをいろいろいじっていた時と比べると、dotnet
コマンドだけで完結するのでだいぶシンプルになりました。AppVeyorではVisual Studio 2017のイメージに.NET Core SDKが入っているのでそれを使っていますが、実際にはVisual Studioは必要ないです。実際にこの設定でPRを作成すると自動ビルドが走って、Botがコメントしてくれます。
*1:設定で特定のブランチのみ、もしくは特定のブランチ以外も指定できる