LoginSignup
0
0

More than 5 years have passed since last update.

Azure Cosmos DBのエミュレーターをAzureDevOpsのビルドパイプラインで利用してCI/CDする

Last updated at Posted at 2019-01-19

問題

プロジェクトをAzure DevOpsでマネージしていて、そのプロジェクトでAzure Cosmos DBを利用していて、なおかつビルドする度にAzure Cosmos DB SKDを利用したコードの機能テストをしたい。でも、クラウド上の実際のAzure Cosmos DBをテストに使ってお金を使いたくない。

解決

Azure Cosmos DB Emulator を新たにビルドパイプラインのタスクに加えて、テストの際にEmulatorに対して操作を行って機能テストをします。Azure Cosmos DB EmulatorのDockerのイメージをインスタンスとしてスタートすることが出来ます。テストを.runsettings 設定ファイルから得た値を使って接続するようにすると、ビルド中にDockerインスタンスでホストされているAzure Cosmos DB Emulatorに繋いて各種機能を実行して検証することが出来るようになります。

準備 marketplace.visualstudio.comからAzure Cosmos DB Emulator 拡張を探す

(1) marketplace.visualstudio.comに行って

(2) cosmos で検索して

(3) 拡張のページに行って

(4) Get it free でインストールする。自分の組織(organization)に加える。

これで、Azure DevOps上で、ビルドパイプラインにAzure Document DB Emulator のタスクを加える準備が出来ました。
その前に、テストプロジェクトの方で、runsettings からAzure Document DBへの接続情報を得るように準備します。

プロジェクトにエミュレーターへ接続するための 。」.runsettings ファイルを加える

サンプルテストプロジェクト (GitHub)

サンプルのプラットフォームは.NET Core。利用しているAzure Cosmos DB SDKは2019年1月現在まだPreviewのSDK v3.0です(GitHubで公開されてるオープンソースのパッケージ。fluentスタイルでクエリを作成出来たりするので可読性が上がりそうです)

サンプル .runsettings ファイル (GitHub) 

ご自分のプロジェクトにこのファイルをコピペします。

<RunSettings>
  <TestRunParameters>
    <Parameter name="endpoint" value="https://localhost:8081" />
    <Parameter name="authKey" value="C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" />
    <Parameter name="database" value="ToDoListTest" />
    <Parameter name="collection" value="ItemsTest" />
  </TestRunParameters>
</RunSettings>

この .runsettings ファイルの authKey の値は「そのまま」使います。通常はこういったKeyデータをソースに記録してしまうのがご法度ですが、これはエミュレータの「よく知られた値」で、これ以外の値だとエミュレーターとつながりません。

endpoint もこのままでいいです。ビルドの時に、そのビルド環境(エージェント環境)に対応したendpointの値で「上書き」します(後述)。

.runsettingsの拡張子さえあれば、ファイル本体の名前は適当でオッケーです。プロジェクト内での .runsettings ファイルの保存場所もどこでも構いません。

テストプロジェクトは .runsettings で定義されているTestRunParametersの値を使ってAzure Cosmos DB に接続しないといけません。テストコードのサンプル (GitHub) を見てください。

以下が .runsettings から設定を読み込んでいる部分です。

 ・・・省略
        [TestInitialize()]
        public void Initialize()
        {
            string endpoint = TestContext.Properties["endpoint"].ToString();
            string authKey = TestContext.Properties["authKey"].ToString();
            repository = new Repository(endpoint, authKey);
        }
 ・・・省略

こうすることで、endpointとauthKeyの簡単に変更できるようにします。実際にはauthKeyはEmulator独特の値を使用するので、endpointの値しか変更する必要はありません。

ビルドパイプラインを作成する

以下が、Azure Cosmos DB Emulator と Visual Studio Test のタスクを含んだビルドパイプラインです。他の部分はプロジェクトによりけるの部分です。このようにAgent Jobを定義します。

Azure Cosmos DB Emulator のタスク設定は得にありません。

ポートマッピングでDocker でホストされている Azure Cosmos DB Emulator が外界との接続にポート8081を使っているのが確認できます。(先の .runsettings ファイル上の endpoint もポート番号は8081でしたね)

Visual Studio Testのタスクは2か所の重要な設定項目があります。

まずは自分のプロジェクト内での .runsettings ファイルを示します。次にendpointの項目を別の値で上書きします。この際、「別の値」とは、Azure Cosmos DB Emulator のendpointの値になりますが、その値はCosmosDbEmlator.Endpointという環境変数から得ることが出来ます。

実行してみる

以下が、ビルド実行の結果です

エミュレータがスタートした後、機能テストが成功したのが分かります。PULL REQUEST毎にビルドをして、機能テストをパスしないコードの侵入を防ぐことも出来ます(というかベストプラクティス)

まとめ

Azure Cosmos DB を利用するプロジェクトはエミュレータをビルドパイプラインに組み込むことで簡単に、安く、機能テストすることが出来るので便利。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0