Appveyor という.NET専用のCIサービスがあります。
公開リポジトリであれば、無料プランで無制限にビルドジョブを作成できます。 VisualStudio のソリューションファイルを自動でパースしてくれるので、ビルドだけであれば細かい設定がいりません。 そして、Githubのページにビルド状態のバッジを貼り付けることもできていい感じです。
今回はこのAppVeyorでNuget Packageの発行まで自動化してみたいと思います。
AppVeyor 自体はGitHubかBitBucketのアカウントと連携させて作成できます。今回はGitHubで作成しました。AppVeyorでプロジェクトを作るとこんな風に選択式でGitHubのプロジェクトを選べます。
通常であればこれだけでOKです。コミットがあると自動でビルドが実行され、ソリューションのビルドをしてくれます。
さて、今回はここからNugetに発行してみたいと思います。AppVeyor では PowerShell Scriptを書くことでデプロイ処理を定義することができます。
また、サンプルのデプロイスクリプトが公開されています。
Deployment/NuGet/publish.ps1 at master · AppVeyor/Deployment · GitHub
これをもとに実際に動かしたデプロイスクリプトがここにあります。
CSharp.Chatwork.Api/deploy at master · tanaka-takayoshi/CSharp.Chatwork.Api · GitHub
ドキュメントにあるように、AppVeyorから渡される変数を使う場合は、 Param {} の中に定義しておく必要があります。Nugetに公開するときのAPI Key はあとで説明しますが AppVeyorの設定から渡すようにします。続いて、.nuspec ファイルのバージョンをプロジェクトのビルドバージョンで置換します。これもAppVeyorの設定から変えられます。あとは、Nuget.exe を使って nuspec から nupkgバイナリを作成し、それをNugetに公開しています。
注意点としてはフォルダの位置になります、 $scriptFolder でこの deploy.ps1 が置いてあるフォルダを取得できます。nuspec はこのフォルダにおいています。 $srcFolder は(このプロジェクトでは1つ上の)リポジトリのルートフォルダになります。Nuget.exe はルートフォルダの下の .nuget フォルダにあります(Nuget復元の有効化をしたときに作成される位置)。 .nuspec から作成される nupkg バイナリもルートフォルダ直下に作成されます。
また、 .nuspec ファイルでの注意点として公開するビルド成果物のパスを定義しているのですが、AppVeyor のデフォルトでは、 $srcFolder と同じ階層に out と temp フォルダが作成されて、ビルド成果物は temp フォルダにコピーされます。 .nuspec ファイルでは相対パスでこの temp フォルダ以下を指定しています。
これをプッシュしたら、AppVeyor側の設定をします。 プロジェクトの設定のDeployment で Run Deploy Script を選択し、プッシュした deploy.ps1のパスを指定し、DEPLOYMENT VARIABLES に自分のNugetのAPI Keyを追加します。
また、プロジェクトのビルドバージョンがNugetの公開バージョンになるので、いきなり正式版 1.x.y をリリースするのはちょっと... という場合は Generalからビルド番号を変更しておきます。
これでビルドすれば自動でNugetに公開するところまでいくはずです。
設定もシンプルな上に、公開リポジトリなら無料で使えるので、GitHubでソースを公開している場合にはいろいろ使えそうです。Azureへの発行もサポートしているとのことです!