はじめに

今回は、Azureが提供するパッケージ管理のためのサービスであるAzure Artifactsを紹介します。

Azure Artifactsとは

Azure Artifactsは、パッケージのためのリポジトリサービスとして機能するAzure DevOpsのラインナップのひとつです。

パッケージとパッケージ管理システム

パッケージとは、ある機能やフレームワークなどをライブラリとしてまとめたものを公開するための形式を指しており、大抵のメジャーなプログラミング言語ではそれぞれが独自のパッケージ管理システムを有しています。有名なパッケージ管理システムとしてJavaScriptの「npm」やJavaの「Maven」などが挙げられます。開発を行う上でサードパーティ製のライブラリを自身のプロジェクトで使用する場合は、その言語のパッケージ管理システムが管理しているパッケージリポジトリからパッケージをダウンロードすることになります。またパッケージ管理システムは一度ダウンロードしたパッケージをマシン上にキャッシュしたり、パッケージが依存している別のパッケージも自動で取得するなど開発の生産性を向上させるための機能を提供しており、現代の開発エコシステムにはなくてはならないツールのひとつとなっています。

独自のパッケージの管理

パッケージ管理システムでは、会社やプロジェクトなどで独自に作成したものも使用できます。しかし上記に挙げたようなパッケージ管理システムのパッケージリポジトリでは、パッケージを登録すると全世界に公開されてしまいます。公開する範囲を限定したいパッケージを管理するためには、個別でパッケージリポジトリを構築したり単純にファイルサーバ上にパッケージをアップロードしたりするといった工夫が必要となり、手間や特別な手順が増えてしまうといった問題が発生してしまいます。

今回紹介するAzure Reposは、このようなプライベートなパッケージの管理を簡単にクラウド上で行うことができるサービスです。Azure ReposはAzure DevOpsのサービスラインナップのひとつであるため、その公開範囲をDevOpsの組織や、Azure Active Directoryユーザーなどに限定することが可能です。

Azure Artifactsがサポートしているパッケージ管理システム

Azure Artifactsでは、以下のメジャー言語とパッケージ管理システムとの連携をサポートしています。

  • C# ・・・ NuGet
  • JavaScript ・・・ npm
  • Java ・・・ MavenとGradle
  • Python ・・・  PiP

これらの言語に対しては、それぞれのパッケージ管理システムの操作方法を使ってAzure Artifacts上に保存したパッケージを操作できます。またAzure Artifactsは言語に依存しないパッケージリポジトリとして使用することができます。上記で挙げた言語以外のパッケージは、Universalパッケージという形式でAzure Artifacts上に登録できます。

Azure Artifactsでパッケージを管理してみよう

それではここからは実際にAzure Artifactsを使ったパッケージの管理方法について説明していきます。また、登録したパッケージをソースコードで参照し、実際のアプリケーションへ反映するまでの流れをAzure ReposとAzure Pipelinesを使用して説明していきます。
そのため本稿では、前回までで作成したAzure DevOpsのプロジェクトを使用していきます。Azure ReposとAzure Pipelinesの準備ができていない場合は、本連載の第27回と第28回の内容を確認してください。

NuGetパッケージ用のライブラリプロジェクトの作成

まずはAzure Artifactsに登録するパッケージを作成します。今回はC#のコードを例にしているので、パッケージはNuGetライブラリとしてAzure Artifactsに登録されることとなります。
NuGetライブラリを作成するためには、Visual Studioで「クラスライブラリ」プロジェクトとしてプロジェクトを作成する必要があります。Visual Studioで「File」→「New」→「Project」と選択し、プロジェクトの新規作成画面を表示します。画面右側からプロジェクトテンプレートを選択することができるようになっているので、一覧から「Class Library (.NET Core)」を選択して「Next」を選択します。クラスライブラリはそれを使用するアプリケーションと互換性のあるプラットフォームの形式で作成する必要があります。前回までで作成してきたWebアプリはASP.NET Coreのアプリケーションですので、今回は.NET Core用クラスライブラリのプロジェクトを選択しています。

  • プロジェクトテンプレートの選択

    プロジェクトテンプレートの選択

次にプロジェクトの名前を入力します。以下の図では「ZerokaraLibrary」という名前にしています。またプロジェクトを作成するフォルダーについては任意のフォルダーを選択してください。最後に「Create」ボタンを選択してプロジェクトを作成します。

  • クラスライブラリプロジェクトの新規作成

    クラスライブラリプロジェクトの新規作成

プロジェクトが作成できたら、はじめにプロジェクトの全般設定を行います。Visual Studioの画面上部メニューから「Project」を選択し、リスト下部にある「ZerokaraLibrary Properties...」という項目を選択します。プロジェクトの全般設定画面が表示されたら左側のメニューから「Application」を選択し、「Target framework」で「.NET Core 2.2」を選択します。ターゲットフレームワークのバージョンは、このクラスライブラリを使用する側のプロジェクトのバージョンと合わせるようにしてください。ライブラリ使用側のターゲットフレームワークのバージョンは、同じ手順で確認することができます。

  • ターゲットフレームワークの選択

    ターゲットフレームワークの選択

続いて、左側のメニューから「Package」を選択します。この画面では、プロジェクトをNuGetのパッケージにする際の設定を行うことができます。パッケージの名前やバージョン番号、パッケージの説明などの情報を編集することができます。デフォルトではプロジェクト名と同じ名前でパッケージが作成されるようになっていますので、今回は何も編集せずにそのままの内容でパッケージを作成していきます。

  • NuGetパッケージ用の設定画面

    NuGetパッケージ用の設定画面

ファイルを保存してプロジェクトの全般設定を終了します。

ライブラリコードの実装

続いてライブラリの具体的な内容であるコードの実装を行います。今回はサンプルとして非常に単純なライブラリを作成します。与えられた文字列を受け取って挨拶として返す「Greet」というメソッドが一つだけあるクラスを実装します。 プロジェクト内にZerokara.csというクラスファイルを作成して、以下のリストのようにメソッドを実装します。

挨拶を返すGreetメソッドを持つクラスを作成する(Zerokara.cs)

using System;

namespace ZerokaraLibrary
{
    public class Zerokara
    {
        public static string Greet(string message)
        {
            return $"Hello ${message}";
        }
    }
}

ライブラリとして公開するクラス、メソッドにはpublic修飾子を付与する必要があります。また今回のように状態を持たないメソッドであれば静的メソッドとすることも可能です。

NuGetパッケージの作成

ライブラリの実装が完成したら、パッケージ化を行います。Visual Studioから行うことができるほか、後述するnuget.exeを使用してコマンドラインからもパッケージ化が可能です。ここではVisual Studioでのパッケージ化について説明します。

まずはビルドの構成を変更します。画面上部にあるプルダウンで、「Release」のビルド構成を選択します。これによってコードが最適化された状態でビルドされるようになります。この状態でソリューションエクスプローラーでプロジェクトを右クリックし、「Pack」を選択します。これでソリューションのビルドからNuGetパッケージ化までが一度に実行されます。

  • ライブラリのNuGetパッケージ化

    ライブラリのNuGetパッケージ化

パッケージ化が成功した旨がコンソールに出力されると、「<プロジェクトの作成場所>\ZerokaraLibrary\ZerokaraLibrary\bin\Release」というフォルダー内に「ZerokaraLibrary.1.0.0.nupkg」というNuGetパッケージが作成されていることを確認することができます。

パッケージをAzure Artifactsに登録する

NuGetパッケージが用意できたら、いよいよAzure Artifactsへパッケージを登録していきます。まずは、Azure Artifacts内に「フィード」と呼ばれるパッケージの管理領域を作成していきます。WebブラウザでAzure DevOpsプロジェクトにアクセスして左側のメニューから「Artifacts」を選択し、画面中央に表示されている「Create Feed」のボタンを選択します。

  • フィードの新規作成

    フィードの新規作成

フィードの新規作成画面が表示されるので、内容を入力していきます。「Name」にはフィードの名前を入力します。ここでは「zerokara-feed」という名前を付けています。「Team project」はこのフィードが属するDevOpsプロジェクトを指しており、固定値となっています。
「Visibility」ではこのフィードを参照することができる人の範囲を決めます。上から順に、同じAzure Active Directory(AAD)に属する人への参照権限付与、このDevOpsプロジェクトが属するDevOps Organization(組織)に属する人への参照権限付与、個別で登録した人のみの参照権限付与の3種類があります。今回は一番上の同一AADユーザーが参照可能な設定とします。
「Packages from public sources」ではnuget.orgなどの公式サイト上に公開されているパッケージを、フィードを通して使用するかどうかを選択することができます。フィード内にこれらのパッケージを含めることで、あるパッケージの特定のバージョンが公式サイト上から削除されてしまった場合などにもフィードにパッケージが残るので、公式サイト側の影響を受けにくくすることができます。今回はこの設定を有効にするために上(Use packages from・・・)を選択します。最後に「Create」ボタンを選択してフィードを作成します。

  • フィードの新規作成(つづき)

    フィードの新規作成(つづき)

「zerokara-feed」というフィードが作成されると、フィードへ接続するための画面が表示されます。「Connect to feed」ボタンを選択します。

  • フィードへの接続

    フィードへの接続

「Connect to feed」のダイアログが表示されます。このダイアログには、各言語のパッケージマネージャー用の接続手順が記載されています。NuGetのパッケージをフィードへ登録する場合は、「Push packages using NuGet.exe」以降の手順に従って操作を行っていきます。

  • フィードへの接続(つづき)

    フィードへの接続(つづき)

ここで記載されている手順にはNuGet.exeというプログラムが必要となりますので、まずはNuGet.exeをインストールします。「Download NuGet」のリンクをクリックし、「Windows x86 Commandline」の項目から推奨バージョンをダウンロードします。

  • NuGet.exeのダウンロード

    NuGet.exeのダウンロード

ダウンロードしたNuGet.exeはパスに通すなどして使用しやすいようにして下さい。続いて「Add this feed」に記載されているコマンドをコピーしてコマンドプロンプトにペーストします。筆者環境では以下のリストのようなコマンドになります。

ソースリポジトリとしてフィードを追加する

nuget.exe sources Add -Name "zerokara-feed" -Source "https://pkgs.dev.azure.com/zerokara/_packaging/zerokara-feed/nuget/v3/index.json"

このコマンドは、NuGet.exeを実行しているマシンにNuGetのソースリポジトリとして先ほど作成した「zerokara-feed」フィードを新たに追加します。
次に先ほど作成したライブラリのNuGetパッケージが存在するフォルダーに移動して以下ようなのコマンドを実行します。これは「Connect to feed」ダイアログの「Push a package」に記載されているコマンドをコピーしてパッケージ名を修正したものです。

パッケージをフィードにアップロードする

nuget.exe push -Source "zerokara-feed" -ApiKey AzureDevOps ZerokaraLibrary.1.0.0.nupkg

このコマンドによってマシン上にあるパッケージがAzure Artifacts上のフィードにアップロードされます。なお、コマンドの実行にサインインのダイアログが表示された場合は、Azureのアカウントを入力します。

  • Azureサインインダイアログ

    Azureサインインダイアログ

コマンドが成功したらWebブラウザでAzure Artifactsのフィードを更新します。以下の図のように「zerokara-feed」のパッケージ一覧に該当するパッケージが表示されていればパッケージのアップロードは成功です。

  • パッケージアップロード後のフィード

    パッケージアップロード後のフィード

パッケージをAzure Artifactsのフィードに登録することができたら、アプリケーションでそのパッケージが使用できるかを試してみましょう。

Azure Artifactsから取得したパッケージを使ってみる

Azure Artifactsにアップロードしたパッケージを、前回までの記事で使用してきたプロジェクト(zerokara-repos)でNuGetインストールして使用できるかを試していきます。

まずはAzure Artifactsの画面で先ほどアップロードしたパッケージ「ZerokaraLibrary」を選択し、パッケージの詳細画面に移ります。

  • パッケージの詳細画面

    パッケージの詳細画面

この画面ではパッケージの詳細情報が表示されているほか、パッケージのダウンロードや削除などの操作も行うことができます。この画面にある「Connect to feed」ボタンを選択し、「Package source URL」の部分にあるURLをコピーします。

  • フィードのURLをコピー

    フィードのURLをコピー

このURLは、ソースリポジトリとしてVisual Studioにこのフィードを追加する際に使用するものです。Visual Studioを開き、「zerokara-repos」プロジェクトを開きます。画面上部のメニューから「Tools」→「Options...」を選択します。オプションのウィンドウが開いたら、左側の一覧から「NuGet Package Manager」を展開し、「Package Sources」を選択します。ウィンドウ右上にある緑色の「+」ボタンを選択し、「Source」という項目にコピーしたURLを貼り付けます。Nameは任意ですが、分かりやすいようにフィード名と同じ「zerokara-feed」と入力します。最後に「OK」ボタンを選択して設定を終了します。

  • Visual Studioでソースリポジトリとしてフィードを追加する

    Visual Studioでソースリポジトリとしてフィードを追加する

これでNuGetパッケージをインストールする準備が完了しました。ソリューションエクスプローラーでソリューション内の「aspnet-core-dotnet-core」というプロジェクトを展開し、「Dependencies」を右クリックして「Manage NuGet Packages...」を選択します。

  • プロジェクトにNuGetパッケージを追加する

    プロジェクトにNuGetパッケージを追加する

NuGetのパッケージ管理画面が表示されたら、画面右上の「Package source」のプルダウンから「zerokara-feed」を選択します。これで作成したフィードに含まれるパッケージを検索することができるようになります。続いて左上の「Browse」タブを選択し、検索フォームに「zerokara」と入力します。すると「ZerokaraLibrary」が検索結果一覧に表示されます。

  • パッケージ管理画面で作成したパッケージを検索する

    パッケージ管理画面で作成したパッケージを検索する

「ZerokaraLibrary」を選択すると、右側に詳細情報が表示されます。内容を確認して「Install」ボタンを選択してパッケージをインストールします。

  • 作成したパッケージをインストールする

    作成したパッケージをインストールする

インストールが完了すると、プロジェクト内の「Dependencies」の中に「ZerokaraLibrary」が追加されていることが確認できます。

  • パッケージインストール後のDependencies

    パッケージインストール後のDependencies

これでライブラリを使用できるようになりました。以下のように初期表示画面用のモデルクラスを修正します。

初期表示画面のモデルクラス(Pages/Index.cshtml.cs)

using Microsoft.AspNetCore.Mvc.RazorPages;

using ZerokaraLibrary; ・・・①

namespace aspnet_core_dotnet_core.Pages
{
    public class IndexModel : PageModel
    {
        public string Message { get; set; } ・・・②

        public void OnGet()
        {
            Message = Zerokara.Greet("Azure Artifacts"); ・・・③
        }

        public string DoTest()
        {
            return "Index";
        }
    }
}

まず始めにusing句でライブラリの使用を宣言します(①)。次に画面にメッセージを反映するためのモデルであるMessageプロパティを用意します(②)。このページにアクセスがあったタイミングでメッセージをセットするため、OnGetメソッド内でMessageプロパティを書き換えるようにしています。その際、ライブラリ内のGreetメソッドを呼び出してメッセージの加工を行っています(③)。

続いて、このモデルの内容を表示する画面側の修正を行います。

初期表示画面(Pages/Index.cshtml)

・・・中略・・・
        <div class="content-body">
            <div class="success-text">@Model.Message</div> ・・・①
            <div class="description line-1"> Azure DevOps Project has been successfully setup</div>
            <div class="description line-2"> Your ASP.NET CORE app is up and running on Azure</div>
        </div>
・・・中略・・・

ここでは、元々「Hello, Azure Repos!」と書かれていたdivタグの内容を①のように修正し、モデルから受け取った値を表示できるようにしています。
ここまで修正したらコードのコミットとプッシュを行いますが、プッシュの前にAzure Pipelines側で修正すべき箇所があります。

Azure Pipelinesのビルドパイプラインの修正

前回の記事でAzure Pipelinesによってコードのプッシュをトリガーにビルドとリリースを実行するCI/CDの仕組みを構築しました。ビルドパイプラインには、ソースコードをAzure Reposから取得してビルドを行う手順がありますが、ここでもAzure Artifactsのフィードを参照できるように設定を変更する必要があります。

Azure Pipelinesのサブメニューから「Builds」を選択し、該当のビルドパイプライン(ここでは「zerorkara-repos - CI」)の「Edit」ボタンを選択します。

  • ビルドパイプラインの編集

    ビルドパイプラインの編集

ビルドパイプラインの編集画面に移ったら、「Restore」タスクを選択します。このタスクではプロジェクトの依存関係の復元を行っており、先ほど追加した「ZerokaraLibrary」も正しく取得できるようにします。画面右側の設定画面の中に「Use packages from this Azure Artifacts feed」という項目があり、プルダウンから「zerokara-feed」を選択します。この項目では、公式のパッケージリポジトリの加えてAzure Artifactsのフィードをパッケージリポジトリとして追加することができます。Azure PipelinesとAzure Artifactsはシームレスに連携されているため、このように一箇所の設定を変更するだけで簡単に連携ができます。

  • ビルドパイプラインでAzure Artifactsと連携する

    ビルドパイプラインでAzure Artifactsと連携する

最後に画面上部にある「Save」ボタンを選択してビルドパイプラインの編集を保存します。ここまで設定したらVisual Studioに戻ります。

コードのコミットとプッシュ

Visual Studioではコミットとプッシュをまだ実施していなかったので、チームエクスプローラーから行います。以下の図のように任意のコミットメッセージを入力し、「Commit All and Push」で変更内容をすべてコミット、プッシュします。

  • ソースコードのコミットとプッシュ

    ソースコードのコミットとプッシュ

プッシュまで完了すると、連動してAzure Pipelinesでビルドとリリースのパイプラインが起動します。しばらく待ってビルドとリリースの両パイプラインが成功したことが確認できたら、Webサイトを確認します。

  • 更新されたWebサイト

    更新されたWebサイト

図のように画面中央部のメッセージが、ライブラリによって加工された内容に変更されていれば成功です。

まとめ

今回はAzure Artifactsを使用したパッケージの管理方法と使用方法について説明しました。Azure Artifactsを使用するとプライベートなパッケージであっても簡単に既存のパッケージ管理システムと連携してアプリケーションに組み込めることが分かったかと思います。

次回はAzure DevOpsのラインナップのうち、探索的テストの計画・実施のためのサービスであるAzure Test Plansについて紹介する予定です。

WINGSプロジェクト 秋葉龍一著/山田祥寛監修
<WINGSプロジェクトについて>テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。一緒に執筆をできる有志を募集中