APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Artifactsでprivateなnpmパッケージを管理する

Azure Artifactsとは

みなさんは、複数のアプリケーションで共有するコードをどのように管理されていますか? 最近だとMulti-Repoで管理するという方もいるかもしれません。

私も検討する過程でMulti-Repoの可能性も考えましたが、管理主体が完全に分かれるケースを想定して あえてパッケージをPrivateに公開するという方法を選択しました。そこで利用したのがAzure Artifactsです。

Azure Artifactsはパブリックおよびプライベートなソースから、 Maven、npm、NuGet、Pythonパッケージのフィードを作成して共有 するサービスです(ほぼMicrosoftの説明のまま)。

まさに今回のようなケースで利用するサービスですね。

Azure Artifactsをnpm registryとして利用する

ということで、Azure Artifactsをnpm registryとして利用するための設定を行いたいと思います。 実は最初は簡単だーと思っていたんですが、後半のAzure Pipelineの利用の段になって、「あれ、どうやるのが最適?」と悩んでしまいました。 同じような点にぶつかった方に参考になれば幸いです。

Feed作成

(1) フィードを作成する

まずAzure Artifactsでフィードを作成します。Azure DevOpsのProjectからArtifactsにアクセスし、「Create Feed」を実行します。

ダイアログが表示されるので必要事項を入力・選択し、「Create」を実行します。

これでフィードの作成は完了です。

(2)フィードの接続

フィード作成が完了したら続いてNPMの接続を行います。Artifactsの画面で「Connect to Feed」というボタンが表示されますのでこちらを実行します。

接続先として「npm」を選択します。

画面の指示に従って設定を行います。Azure Artifactsを使うのがはじめての場合、一番上にある「Get the tools」からツールをインストールしましょう(2022年8月時点ではWindows用のcredential helperのインストール方法や、すべての環境用のPersonal Access Tokenの使い方が案内されます)

Step1の部分はWindowsではcredential-helperを利用できます。その他の環境では用意されていないため、内容に従い以下の手順で(BASE64 Encodeした)PATを記入します。

Step2でPATを生成します。PATはユーザー設定画面で行います。「New Token」を実行します。

表示されるダイアログに必要事項を入力・選択します。なおデフォルトではPATの有効期限は30日に設定されます。

PATを生成されます。Tokenはここでしか表示されません(以後表示されません)ので必ずメモしておきましょう。

完了したら、Step3に戻り、スクリプトを実行します。スクリプトによりBase64 Encodeされた文字列が表示されるのでこれを .npmrcの [BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] と置き換えます( [] の文字も含めて置き換え)。

以上で準備は完了です。

なお、PATを記入した .npmrc ファイルはセキュリティ上、Gitなどのリポジトリには登録しないほうがよいと思います。 (今回例で作成しているプロジェクトは上記Step1で記載されている内容をそのまま sample.npmrc という名称でGitに登録しています。この段階ではPATの文字列は記載されていないのでセキュリティリスクが軽減されると考えてのやり方です。(面倒ですが)各ユーザーにPATを生成してもらい、Step3のスクリプトを各自実行して自身で .npmrc を管理してもらうようにしました。

registryを利用する

ローカル環境で利用する(.npmrcを作成する)

上記の .npmrc を用意したプロジェクトで npm install & npm publish を実行するとAzure Artifactsに公開されます。

同様に公開したパッケージを利用する側でも .npmrc を用意し、 npm install <package-name> を実行するとAzure Artifactsからダウンロードされます。

Azure DevOps Pipelineで利用する

ここまでは Microsoft Docsでもまとめて記載がある部分なので上記のメモがなくてもできるのではないでしょうか。

.npmrc にPAT文字列を登録している場合は npm 認証タスク (タスクランナー用) - Azure Pipelines | Microsoft Docsに記載のやり方でAzure Artifactsにアクセスできます。

- task: npmAuthenticate@0
  inputs:
    workingFile: .npmrc
- script: npm ci

しかし、今回私達は PATの情報をリポジトリに登録したくないという理由から .npmrc はリポジトリに含んでいません。この場合はどうやればいいのでしょうか。また仮に .npmrc を利用する場合、PATの有効期限に悩まされ続けることになります。これはできれば避けたいと思いました。

実は .npmrc を使わないやり方もAzure Pipelinesで用意されています。(ただしやり方が1箇所で明記されているわけではないのが難点でした)

docs.microsoft.com

docs.microsoft.com

上記のページに記載のある customRegistry / customFeed / publishRegistry / publishFeed を利用します。

customRegistry / publishRegistry には useFeed を、 customFeed / publishFeedには <project-name>/<feed-name> を指定します。

useFeedを指定した場合、.npmrc は不要です

同一プロジェクト内のフィードであれば特に追加の指定なくアクセスできます。 同一組織でもプロジェクト間の参照権限が適切に設定されていれば簡単に実現できるでしょう。

内容としては以下のようなものです

- task: Npm@1
  inputs:
    command: custom
    customCommand: ci ci --no-optional --unsafe-perms
    customRegistry: useFeed
    customFeed: <project-name>/<feed-name>
- task: Npm@1
  inputs:
    command: custom
    customCommand: run lint

これで、Azure PipelinesからもArtifactsにあるPrivateなパッケージをダウンロードすることができます。 PAT利用の場合は有効期限前に更新しなければなりませんが、 useFeed の場合は有効期限の心配もありません。

まとめ

今回 Azure Artifactsを使った privateなnpmパッケージ管理ということを実現してみました。 たしかにそれぞれのやり方は簡単でしたが、全体を構成していくとちょっとした点に悩むことになりました。 できればそうした点であまり悩みたくない。そんなちょっとした悩みを解決するきっかけが今回の記事で提供できれば幸いです。

最後に

私達のチームでは、Azure・AKSを活用したシステムのSIや内製化のお手伝いをさせていただいております。 Azureやコンテナ技術の知見を持つエンジニアが対応いたします。ご相談等ありましたらぜひご連絡ください。