Azure Artifactsを使ったパッケージ管理 (1/2)
はじめに
今回は、パッケージ管理サービスであるAzure Artifactsを紹介します。
この記事では、前編として、Artifactsへ登録するための簡単なクラスライブラリの作成とパッケージとして登録するまでの流れを説明します。
Azure Artifactsとは
Azure Artifactsは、パッケージのためのリポジトリサービスとして機能するAzure DevOpsの一部です。これにより、プライベートなパッケージの管理が簡単に行えるようになります。
パッケージとパッケージ管理システム
パッケージとは、ある機能やフレームワークなどをライブラリとしてまとめたものを公開するための形式を指しており、大抵のメジャーなプログラミング言語ではそれぞれが独自のパッケージ管理システムを有しています。有名なパッケージ管理システムとしてJavaScriptの「npm」やJavaの「Maven」などが挙げられます。開発を行う上でサードパーティ製のライブラリを自身のプロジェクトで使用する場合は、その言語のパッケージ管理システムが管理しているパッケージリポジトリからパッケージをダウンロードすることになります。またパッケージ管理システムは一度ダウンロードしたパッケージをマシン上にキャッシュしたり、パッケージが依存している別のパッケージも自動で取得するなど開発の生産性を向上させるための機能を提供しており、現代の開発エコシステムにはなくてはならないツールのひとつとなっています。
独自のパッケージの管理
パッケージ管理システムでは、会社やプロジェクトで独自に作成したパッケージも管理できますが、通常のパッケージリポジトリに登録すると全世界に公開されてしまいます。公開範囲を限定するには、個別のリポジトリを構築したりする必要があり、手間がかかります。Azure Artifactsは、このようなプライベートパッケージの管理を簡単に行えるサービスです。Azure DevOpsと連携しており、公開範囲を組織内やMicrosoft Entra IDユーザーに限定できます。
Azure Artifactsがサポートしているパッケージ管理システム
Azure Artifactsは、以下のパッケージ管理システムと連携できます。
- C# ・・・ NuGet
- JavaScript ・・・ npm
- Java ・・・ MavenとGradle
- Python ・・・ pip
また、言語に依存しないUniversalパッケージとしても利用可能です。
Azure Artifactsでパッケージを管理する
ここからは、Azure Artifactsを使って実際にパッケージを管理する方法を説明します。登録したパッケージをソースコードで参照し、アプリケーションに反映するまでの流れを、Azure ArtifactsとAzure Pipelinesを使用して説明します。
この記事では、Artifactsへ登録するための簡単なクラスライブラリの作成とパッケージとして登録するまでの流れを説明します。
NuGetパッケージ用のライブラリプロジェクトの作成
まずはAzure Artifactsに登録するパッケージを作成します。今回はC#のコードを例にしているので、パッケージはNuGetライブラリとしてAzure Artifactsに登録されることとなります。
NuGetライブラリを作成するためには、Visual Studioで「クラスライブラリ」プロジェクトとしてプロジェクトを作成する必要があります。Visual Studioで「File」→「New」→「Project」と選択し、プロジェクトの新規作成画面を表示します。画面右側からプロジェクトテンプレートを選択することができるようになっているので、一覧から「Class Library (.NET Core)」を選択して「Next」を選択します。クラスライブラリはそれを使用するアプリケーションと互換性のあるプラットフォームの形式で作成する必要があります。
.NET Core用クラスライブラリのプロジェクトを選択しています。
次にプロジェクトの名前を入力します。以下の図では「DemoCoreServices」という名前にしています。またプロジェクトを作成するフォルダーについては任意のフォルダーを選択してください。最後に「Create」ボタンを選択してプロジェクトを作成します。
プロジェクトが作成できたら、はじめにプロジェクトの全般設定を行います。Visual Studioの画面上部メニューから「Project」を選択し、リスト下部にある「DemoCoreServices Properties...」という項目を選択します。プロジェクトの全般設定画面が表示されたら左側のメニューから「Application」を選択し、「Target framework」で「.NET 8.0」を選択します。ターゲットフレームワークのバージョンは、このクラスライブラリを使用する側のプロジェクトのバージョンと合わせるようにしてください。ライブラリ使用側のターゲットフレームワークのバージョンは、同じ手順で確認することができます。
続いて、左側のメニューから「Package」を選択します。この画面では、プロジェクトをNuGetのパッケージにする際の設定を行うことができます。パッケージの名前やバージョン番号、パッケージの説明などの情報を編集することができます。デフォルトではプロジェクト名と同じ名前でパッケージが作成されるようになっていますので、今回は何も編集せずにそのままの内容でパッケージを作成していきます。
ファイルを保存してプロジェクトの全般設定を終了します。
ライブラリコードの実装
続いてライブラリの具体的な内容であるコードの実装を行います。今回はサンプルとして非常に単純なライブラリを作成します。与えられた文字列を受け取って挨拶として返す「Display」というメソッドが一つだけあるクラスを実装します。 プロジェクト内にCoreFunctionality.csというクラスファイルを作成して、以下のリストのようにメソッドを実装します。
namespace DemoCoreServices
{
public class CoreFunctionality
{
public String Display()
{
return "This class has core functionality";
}
}
}
ライブラリとして公開するクラス、メソッドにはpublic修飾子を付与する必要があります。また今回のように状態を持たないメソッドであれば静的メソッドとすることも可能です。
NuGetパッケージの作成
ライブラリの実装が完成したら、パッケージ化を行います。Visual Studioから行うことができるほか、後述するnuget.exeを使用してコマンドラインからもパッケージ化が可能です。ここではVisual Studioでのパッケージ化について説明します。
まずはビルドの構成を変更します。画面上部にあるプルダウンで、「Release」のビルド構成を選択します。これによってコードが最適化された状態でビルドされるようになります。この状態でソリューションエクスプローラーでプロジェクトを右クリックし、「Pack」を選択します。これでソリューションのビルドから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」にはフィードの名前を入力します。ここでは「DemoCoreService」という名前を付けています。「Visibility」ではこのフィードを参照することができる人の範囲を決めます。上から順に、同じMicrosoft Entra tenantに属する人への参照権限付与、このAzure DevOpsプロジェクトが属するOrganization(組織)に属する人への参照権限付与、個別で登録した人のみの参照権限付与の3種類があります。今回は二番目のAzure DevOpsプロジェクトが属するOrganization(組織)に属するメンバーが参照可能な設定とします。
「Upstream sources」ではnuget.orgなどの公式サイト上に公開されているパッケージを、フィードを通して使用するかどうかを選択することができます。フィード内にこれらのパッケージを含めることで、あるパッケージの特定のバージョンが公式サイト上から削除されてしまった場合などにもフィードにパッケージが残るので、公式サイト側の影響を受けにくくすることができます。今回はこの設定を有効にします。最後に「Create」ボタンを選択してフィードを作成します。
続いて、「Connect to feed」をクリックします。各言語のパッケージマネージャー用の接続手順が記載されています。NuGetのパッケージをフィードへ登録する場合は、「Push packages using NuGet.exe」以降の手順に従って操作を行っていきます。
ここで記載されている手順にはNuGet.exeというプログラムが必要となりますので、まずはNuGet.exeをインストールします。「Download the latest NuGet」のリンクをクリックし、「Windows x86 Commandline」の項目から推奨バージョンをダウンロードします。
ダウンロードしたNuGet.exeはパスに通すなどして使用しやすいようにして下さい。続いて「Add this feed」に記載されているコマンドをコピーしてコマンドプロンプトにペーストします。私の環境では以下のリストのようなコマンドになります。
ソースリポジトリとしてフィードを追加する
nuget.exe sources Add -Name "DemoCoreService" -Source "https://pkgs.dev.azure.com/freeplanets/Hyperion/_packaging/DemoCoreService/nuget/v3/index.json"
このコマンドは、NuGet.exeを実行しているマシンにNuGetのソースリポジトリとして先ほど作成した「DemoCoreService」フィードを新たに追加します。
次に先ほど作成したライブラリのNuGetパッケージが存在するフォルダーに移動して以下ようなのコマンドを実行します。これは「Connect to feed」ダイアログの「Push a package」に記載されているコマンドをコピーしてパッケージ名を修正したものです。
パッケージをフィードにアップロードする
nuget.exe push -Source "DemoCoreService" -ApiKey az DemoCoreServices.1.0.0.nupkg
このコマンドによってマシン上にあるパッケージがAzure Artifacts上のフィードにアップロードされます。なお、コマンドの実行にサインインのダイアログが表示された場合は、Azureのアカウントを入力します。
コマンドが成功したらWebブラウザでAzure Artifactsのフィードを更新します。以下の図のように「DemoCoreService」のパッケージ一覧に該当するパッケージが表示されていればパッケージのアップロードは成功です。
まとめ
Azure Artifactsは、企業やプロジェクト内で作成された独自パッケージを安全かつ効率的に管理できる強力なツールです。Azure DevOpsとシームレスに統合されているため、パッケージの公開範囲を柔軟に設定でき、様々な言語のパッケージ管理システムと連携が可能です。次回は、登録したパッケージをアプリケーションで実際に使用する方法と、Azure Pipelinesを利用したCI/CDパイプラインの構築について解説します。
References
Discussion