.NET ビルド小技集 (2)

前回の .NET ビルド小技集 (1) では、プロジェクトのビルド イベントを利用しました。
今回はビルド イベントで ZIP ファイルを作成する方法についてです。

 

ZIP ファイルを作成する

前回説明したファイルのコピーに加えて、ビルドにより出力された実行ファイル一式を圧縮して ZIP ファイルにします。
PowerShell では .NET のライブラリを利用することができるため、
PowerShell スクリプトで ZIP ファイルを作成することにします。
(PowerShell には圧縮のための Compress-Archive Cmdlet があったりもしますが。)

まず、ZipFile.CreateFromDirectory メソッドをラップしたスクリプトを用意します。
引数は、アセンブリのディレクトリと ZIP ファイルのパスです。

そして、前回のプロジェクトのビルド イベントでこのスクリプトを呼び出します。

cd $(ProjectDir)
xcopy Data $(OutDir)Data /D/E/C/I/H/Y
powershell -ExecutionPolicy Unrestricted ..\Tools\CreateZip.ps1 $(OutDir) ..\Downloads\$(TargetName).zip

これで、ビルドのたびに ZIP ファイルが作成されます。

image

 

ちなみに、PowerShell では C# のコードを埋め込むことができます。
次のようにしても同様の結果が得られます。

 

ZIP ファイルの名前にバージョンを含める

さらに、ZIP ファイルの名前を、App1-1.0.0.zip のようにバージョン番号が含まれるようにしてみましょう。
バージョン番号として、AssemblyInfo.cs の AssemblyFileVersion 属性に指定された値を取得します。

先ほどの CreateZip.ps1 を拡張して、
対象のアセンブリから AssemblyFileVersion 属性を取得して、
ZIP ファイルの名前が App1-1.0.0.zip の形式になるように組み立てます。
このスクリプトの引数は、アセンブリのパスと出力先のディレクトリとしています。

あとは、プロジェクトのビルド イベントでこのスクリプトを呼び出します。

cd $(ProjectDir)
xcopy Data $(OutDir)Data /D/E/C/I/H/Y
powershell -ExecutionPolicy Unrestricted ..\Tools\CreateZipForAssembly.ps1 $(TargetPath) ..\Downloads

AssemblyFileVersion 属性には、「1.0.1-Alpha」のように任意の文字列を指定できるようです。
(ただし、AssemblyVersion 属性は数値または * でなければビルド エラーになります。)

image

実行結果:

image

 

次回は、ビルド自体を PowerShell で実行する方法についてです。

前回: .NET ビルド小技集 (1)
次回: .NET ビルド小技集 (3)

作成したサンプル
BuildSample (GitHub)

バージョン情報
Visual Studio 2013

参照
ZipFile.CreateFromDirectory メソッド

Add-Type
PowerShell の Add-Type と [Reflection.Assembly]
PowerShellスクリプト内でC#コードを書いて使う

Compress-Archive
PowerShell v5 の新機能紹介 – Zipファイルの操作が可能に

広告
カテゴリー: ALM, ツール. タグ: , . 2 Comments »

.NET ビルド小技集 (1)

.NET アプリケーション開発のビルドに関する小技を集めました。
以下の内容の実現方法について取り扱います。

  • ビルド時にファイルをコピーする
  • ZIP ファイルを作成する
  • ZIP ファイルの名前にバージョンを含める
  • PowerShell でビルドする
  • PowerShell でバージョンをインクリメントしてビルドする

追記: ビルド用のスクリプトを Visual Studio の「外部ツール」に登録すると便利です。
また、.NET Core プロジェクト形式向けのビルド スクリプトも追加しました。

 

ビルド時にファイルをコピーする

.NET アプリケーションをビルドすると、
プロジェクト フォルダーの下の bin\Debug や bin\Release に実行ファイルが出力されます。
このとき同時に、画像、動画、データなどのコンテンツ ファイルをコピーする方法を紹介します。
(サイズの小さい画像ファイルであればアセンブリ内のリソースとして埋め込んで使いますが。)

よくある方法としては、コンテンツ ファイルをプロジェクトに含めて、プロパティで [出力ディレクトリにコピー] の項目を設定します。
ただしこれだと、ファイルごとに設定しなければならないという欠点があります。

imageimage

 

この欠点を回避するには、プロジェクトのビルド イベントを利用するとよいでしょう。
プロジェクトのプロパティを開き、[ビルド イベント] を選択します。
この画面で、ビルド時に実行するコマンド ラインを指定できます。

ファイルをコピーするには copy、フォルダーをコピーするには xcopy を利用します。

xcopy $(ProjectDir)Data $(TargetDir)Data /D/E/C/I/H/Y

image

$(ProjectDir) などの形式の文字列はマクロと呼ばれるもので、
ソリューションやプロジェクトにとっての特別な文字列を扱うことができます。
[ビルド後の編集] をクリックするとエディターが開きます。
ここではマクロの実際の値を確認しながら自動で挿入できます。

image

 

上記で使用した xcopy の各オプションの説明も挙げておきます。

  • /D コピー元の日付がコピー先の日付より新しいファイルだけをコピーします。
  • /E ディレクトリまたはサブディレクトリが空であってもコピーします。"/S /E" と同じ意味です。
  • /C エラーが発生してもコピーを続けます。
  • /I 指定されたコピー先が存在しない場合、コピー先をディレクトリとしてコピーします。
  • /H 隠しファイルやシステム ファイルもコピーします。
  • /Y 既存のファイルを上書きする前に確認のメッセージを表示しません。

 

このように設定してビルドを実行すれば、出力ディレクトリにコンテンツ ファイルがコピーされます。

image

 

なお、ビルド イベントでコマンド ラインが実行されるときの作業ディレクトリは、
$(TargetDir)、つまり bin\Debug や bin\Release などの出力ディレクトリです。
複数のコマンドを実行する場合など、相対パスにしたほうがわかりやすくなるときは、

cd $(ProjectDir)
xcopy Data $(OutDir)Data /D/E/C/I/H/Y

のように作業ディレクトリを設定するとよいでしょう。

次回は、ビルド時に ZIP ファイルを作成する方法についてです。

次回: .NET ビルド小技集 (2)

作成したサンプル
BuildSample (GitHub)

バージョン情報
Visual Studio 2013

参照
Copy
Xcopy

カテゴリー: ALM, ツール. タグ: . 1 Comment »

Azure と Visual Studio Online (Git) で継続的インテグレーション

(追記:この記事の改訂版→ Azure と VSTS で継続的デプロイ (2017) )

以前に Windows Azure と Visual Studio Online で継続的インテグレーションというのを書きましたが、
今回は、リポジトリの種類として TFVC ではなく Git を使ってみます。

Visual Studio Online (Git) に Web アプリケーションのソース コードをコミットすると、
自動的にビルドが開始して Azure Web アプリにデプロイされる、という
継続的インテグレーション (Continuous Integration, CI) を構成するための手順について記述します。

 

■ ソリューションをコミットする

まず、Visual Studio Online で Git のチーム プロジェクトを作成しておきます。
Visual Studio でソリューションのみを作成して、Visual Studio Online にコミット・プッシュします。
ソリューションを作成する手順は後でもかまいませんが、
ここで作成しておくと、ビルド定義にソリューションへのパスが自動で含まれるようになります。

image

 

■ Azure Web アプリを作成する

Microsoft Azure の管理ポータルで、新規の Web アプリを作成します。[カスタム作成] を選択します。

image

作成する Web アプリの URL を入力し、[ソース管理から発行] をオンにします。

image

ソースコードのリポジトリの種類を指定します。
[Visual Studio Online] を選択します。

image

Visual Studio Online の URL を指定します。
[今すぐ承認] をクリックすると Visual Studio Online 側の承認画面が表示されるので、[Accept] をクリックします。

image

リポジトリ名 (チーム プロジェクト名) を選択して、右下の ✓ をクリックすれば Web アプリが作成されます。

image

このとき同時に、Visual Studio Online にビルド定義が作成されます。
なお、ソース管理システムと連携されていない Web アプリにあとから連携を追加することもできます。

 

■ ビルド定義を編集する

Visual Studio で、先ほど作成されたビルド定義を編集します。
既定では、ビルド定義は「(サイト名)_CD」という名前で作成されています。
この名前を変更しても、デプロイ構成には影響ありません。

image

[全般] の [キューの処理] が [有効] に設定されていることを確認します。

image

ビルドのトリガーは、既定で [継続的インテグレーション] に設定されています。
この設定のときでも、ビルドのメニューから手動で開始することもできます。

image

ソースの場所は、分岐まで指定できます。
本番用 (Production) とテスト用 (Staging) の環境を用意したい場合は、
それぞれの Azure Web アプリを作成し、それぞれを master と開発用の分岐に関連付けるなどするとよいでしょう。

image

ビルドの出力場所は既定で [ビルド出力をサーバーにコピーする] に設定されています。

image

ターゲットのソリューションまたはプロジェクトを [2. Build] – [Projects] で指定します。
Release ビルドにするには、[2. Build] – [Configurations] で、Release 用の構成を追加します。

image

なお、ビルド定義と Azure Web アプリは、[Windows Azure Deployment Environment] の値で関連付けられています。

image

 

■ Web アプリケーションをコミットする

Web アプリケーションを作成します。
ここでは例として、[ASP.NET Web アプリケーション] を選択し、テンプレートから [MVC] を選択します。

image

これらのファイルを Visual Studio Online にコミット・プッシュします。
すると、ビルドが自動的に開始され、Azure Web アプリに初回のビルドがデプロイされます。

Visual Studio Online での表示:

image

Azure Web アプリでの表示:

image

 

ビルドおよびデプロイに成功すると、Web アプリが実行されるようになります。

image

ビルド定義で [ビルド出力をサーバーにコピーする] に設定されている場合、
ビルドの実行ログの [Download drop as zip] でデプロイされたビルド一式を取得できます。

image

Monaco で配置フォルダーを覗いてみると、BuildInfo.config というファイルが作成されています。
これにより、現在デプロイされているビルドの情報を確認することができます。

image

 

以上で、継続的インテグレーションが構成されました。
その後も、ソース コードをコミットするたびに自動的にビルドおよびデプロイが実施されます。

過去のバージョンを選択して再デプロイすることもできます。

image

 

バージョン情報
Visual Studio 2013

参照
Visual Studio Online と Git を使用した Azure への継続的な配信
Windows Azure と Visual Studio Online で継続的インテグレーション (1)
Azure と GitHub で継続的インテグレーション

Azure Web サイトに Dropbox からデプロイする

前回は Azure と GitHub で継続的インテグレーションについて書きましたが、
今回はソースコードを格納するストレージとして Dropbox を利用します。

 

■ Azure Web サイトを作成する

例によって、Microsoft Azure の管理ポータルで、新規の Web サイトを [カスタム作成] を選択して作成します。
[ソース コードの位置] で [Dropbox] を選択します。

image

image

Dropbox の承認が完了したら、[フォルダー名] を選択します。
新しいフォルダーを作成することもできます。

image

Dropbox の「アプリ\Azure」フォルダーの下に、指定したフォルダーが作成されます。

image

 

■ Web アプリケーションをコピーする

このフォルダーに、 ASP.NET MVC Web アプリケーションのソースファイルをコピーします。
bin フォルダーを含める必要はありません。

image

Dropbox と連携している場合、Azure へのデプロイは自動では開始しません。
Web サイトの [デプロイ] タブで、[同期] をクリックします。

image

デプロイが開始されます。

image

デプロイが完了しました。

image

次に、ソースコードの「Version 1」の部分を「Version 2」に変更して、再び [同期] をクリックします。
すると、差分だけが同期され、デプロイが実行されます。

image

image

image

 

デプロイの仕組みは GitHub のときと同様で、
Kudu によってソースコードを取得し、ビルドを実行して、Web サイトにコピーする、という一連のタスクが実施されます。

カテゴリー: ALM, クラウド. タグ: , . 1 Comment »

Azure と GitHub で継続的インテグレーション

(追記:この記事の改訂版→ Azure と GitHub で継続的デプロイ (2017) )

以前に Azure と Visual Studio Online で継続的インテグレーションというエントリを書きましたが、
今回はバージョン管理システムとして GitHub を利用した場合の
Azure での継続的インテグレーション (Continuous Integration, CI) について記述します。

 

■ リポジトリを作成する

まず、GitHub でリポジトリを作成します。
下の図ではプライベート リポジトリを作成していますが、
パブリック リポジトリでもプライベート リポジトリでも以降の手順は同じです。

image

 

■ Azure Web サイトを作成する

Microsoft Azure の管理ポータルで、新規の Web サイトを、[カスタム作成] を選択して作成します。
[ソース管理から発行] をオンにします。

image

[GitHub] を選択します。

image

GitHub の承認が完了したら、[リポジトリ名] を選択します。
[リポジトリ名] の選択肢には、プライベート リポジトリも同じように含まれます。

image

 

Web サイトの作成が完了すると、現在のリポジトリの内容がデプロイされます。

image

まだ Web アプリケーションのソースコードが含まれていないため、Web サイトはこのような表示になります。

image

GitHub のリポジトリの [Settings] で、Azure と連携していることが確認できます。

image

 

■ Web アプリケーションをコミットする

ASP.NET MVC で Web アプリケーションを作成して、GitHub に commit/push します。
bin フォルダーを含める必要はありません。
commit/push が完了すると、自動で Web アプリケーションのデプロイが開始します。

image

デプロイが完了しました。

image

以降も、ソースコードを変更して GitHub に commit/push するだけで、自動的にデプロイされます。

image

 

■ デプロイの仕組み

今回の手順では、Visual Studio Online の場合とは異なり、ビルドのタスクを設定していません。

Azure Web サイトの内部では Kudu というツールが動作しており、
GitHub や Dropbox と連携している場合にデプロイが開始されると、
ソースコードを取得し、ビルドを実行して、Web サイトにコピーする、という一連のタスクを実施します。

Kudu には管理サイトがあります。
Kudu の管理サイトにアクセスするには、まず Web サイトのダッシュボードで [デプロイ資格情報] を設定します。

image

Kudu の管理サイトは、

https://site-name.scm.azurewebsites.net/

のように、サイト名のあとに「scm」を追加すればアクセスできます。表示されない場合は、

https://site-name.scm.azurewebsites.net/deploy

も試してみてください。

Kudu の管理サイトでは、エクスプローラーのようにファイルにアクセスできます。

image

また、Web サイトの [デプロイ] ページでも、デプロイのログを見ることができます。

image

これらから判断すると、デプロイ時には差分のファイルのみを取得してビルドし、
ビルド結果の差分のファイルのみを Web サイトにコピーしているように見えます。
したがって Immutable Infrastructure ではなく、変更点が少なければデプロイが速く完了します。

前回: Azure と Visual Studio Online で継続的インテグレーション
次回: Azure Web サイトに Dropbox からデプロイ

参照
Kudu (GitHub)

カテゴリー: ALM, クラウド. タグ: , . 5 Comments »

TFS のビルド時に NuGet パッケージを復元する

近年の .NET 開発では、追加のライブラリをインストールするために NuGet が利用されます。
NuGet からダウンロードしたライブラリは、ソリューションの下の packages フォルダーにキャッシュされます。

Web アプリケーション プロジェクトはとくに NuGet のライブラリを使うことが多く、
通常の手順で TFS にチェックインすると、通信に時間がかかったり、
ソリューションごとに大量のキャッシュをソース管理で保持しなければならなくなります。

これを避け、ビルド時に TFS 側で NuGet パッケージをダウンロードさせる方法を以下で紹介します。

 

■ ビルド時に TFS 側で NuGet パッケージをダウンロードさせるための手順

ソリューションを作成したら、Web アプリケーション プロジェクトを作成する前に
[ソリューション エクスプローラー] でソリューションを右クリックして、
[NuGet パッケージの復元の有効化] をクリックします。

image

すると、.nuget というソリューション フォルダーが作成されます。

image

[ASP.NET MVC 4 Web アプリケーション] を [空] で作成して、TFS にチェックインします。
packages フォルダーの中では、repositories.config だけがチェックインされます。

image

これで、ビルド時には TFS 側で NuGet パッケージがダウンロードされるようになります。

 

■ NuGet パッケージのキャッシュを TFS のソース管理から完全に除外するための手順

上記の手順でビルドは成功するようになりましたが、
[保留中の変更] で [検出済み: 追加 xx] と表示されています。
ここには、ローカルとサーバーの差分がリアルタイムで表示されます。

image

[検出済み: 追加 xx] と表示されている部分をクリックします。

[候補の変更の昇格] ダイアログが表示されるので、
任意のファイルを右クリックして、[フォルダー (…) で無視] をクリックします。

image

すると、チーム プロジェクトのルート フォルダーに .tfignore ファイルが作成されます。
このファイルでは、TFS のソース管理で無視するファイルやフォルダーを指定できます。

このファイルを開き、「packages」以降のパスを削除して保存します。

image

これで、NuGet パッケージのキャッシュが TFS のソース管理から完全に除外されました。

 

バージョン情報
Visual Studio 2012

参照
Windows Azure と Visual Studio Online で継続的インテグレーション (1)

カテゴリー: ALM. タグ: , . 2 Comments »

Windows Azure と Visual Studio Online で継続的インテグレーション (2)

(追記:この記事の改訂版→ Azure と VSTS で継続的デプロイ (2017) )

今回は、データベースと連携する Web アプリケーションを作成して、
Windows Azure と Visual Studio Online で継続的インテグレーションを構成してみたいと思います。

手順は Windows Azure と Visual Studio Online で継続的インテグレーション (1) とほぼ同様になるため、
主に相違点について記述していきます。

まず以下で示すように、
Windows Azure Web サイトを作成する際に、同時に無料の 20 MB SQL データベースを作成します。

Windows Azure の管理ポータルで、新規の Web サイトを [カスタム作成] で作成します。

image

[無料の 20 MB SQL データベースの作成] を選択します。
アプリケーション側で使用する接続文字列の名前 (Web.config で定義されているもの) を指定します。
[ソース管理から発行] をオンにします。

image

今回は、新しい SQL データベース サーバーも作成することにします。
[データベースの詳細設定を構成します] をオンにします。

image

照合順序を選択します。

image

[Visual Studio Online] を選択します。

image

Visual Studio Online の URL を入力して、[今すぐ承認] をクリックします。
Visual Studio Online 側の承認画面が表示されたら [Accept] をクリックします。

image

リポジトリ名 (チーム プロジェクト名) を選択して、右下の ✓ をクリックします。
すると、Web サイトおよび SQL データベースが作成されます。

image

 

ここから先の手順は Windows Azure と Visual Studio Online で継続的インテグレーション (1) で示した通り、

  • ビルド定義を編集する
  • Web アプリケーションをチェックインする

を実施すれば継続的インテグレーションが構成されます。
Visual Studio から Windows Azure にデプロイするで説明した通り、
接続文字列は Windows Azure Web サイトに登録されているものが使用されるため、デプロイ時に改めて設定する必要はありません。

例として、Visual Studio から Windows Azure にデプロイするで利用した Todo List の Web アプリケーションで
動作を確認できました。

image

 

バージョン情報
Visual Studio 2012

参照
Windows Azure
Visual Studio Online

Windows Azure と Visual Studio Online で継続的インテグレーション (1)
Visual Studio から Windows Azure にデプロイする