銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Appveyor でNuget Packageの発行を自動化する

Appveyor という.NET専用のCIサービスがあります。

AppVeyor

公開リポジトリであれば、無料プランで無制限にビルドジョブを作成できます。 VisualStudio のソリューションファイルを自動でパースしてくれるので、ビルドだけであれば細かい設定がいりません。 そして、Githubのページにビルド状態のバッジを貼り付けることもできていい感じです。

https://github.com/tanaka-takayoshi/CSharp.Chatwork.Api

今回はこのAppVeyorでNuget Packageの発行まで自動化してみたいと思います。

AppVeyor 自体はGitHubかBitBucketのアカウントと連携させて作成できます。今回はGitHubで作成しました。AppVeyorでプロジェクトを作るとこんな風に選択式でGitHubのプロジェクトを選べます。

f:id:tanaka733:20140216235013p:plain

通常であればこれだけでOKです。コミットがあると自動でビルドが実行され、ソリューションのビルドをしてくれます。

さて、今回はここからNugetに発行してみたいと思います。AppVeyor では PowerShell Scriptを書くことでデプロイ処理を定義することができます。

Deploying application - Appveyor

また、サンプルのデプロイスクリプトが公開されています。

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 フォルダ以下を指定しています。

Building project - Appveyor

CSharp.Chatwork.Api/deploy/Chatwork.Api.nuspec at master · tanaka-takayoshi/CSharp.Chatwork.Api · GitHub

これをプッシュしたら、AppVeyor側の設定をします。 プロジェクトの設定のDeployment で Run Deploy Script を選択し、プッシュした deploy.ps1のパスを指定し、DEPLOYMENT VARIABLES に自分のNugetのAPI Keyを追加します。

f:id:tanaka733:20140217002113p:plain

また、プロジェクトのビルドバージョンがNugetの公開バージョンになるので、いきなり正式版 1.x.y をリリースするのはちょっと... という場合は Generalからビルド番号を変更しておきます。

f:id:tanaka733:20140217002203p:plain

これでビルドすれば自動でNugetに公開するところまでいくはずです。

f:id:tanaka733:20140217002327p:plain

設定もシンプルな上に、公開リポジトリなら無料で使えるので、GitHubでソースを公開している場合にはいろいろ使えそうです。Azureへの発行もサポートしているとのことです!