しばやん雑記

ASP.NET Core とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Artifacts で Public Feed を作れるようになっていた(おまけで Credential Provider も試した)

久し振りに Azure Artifacts を開いたら、いつの間にかに New public feed というボタンが追加されていたので試すことにしました。MyGet のように独自の公開リポジトリを利用出来るので、Azure Pipelines と組み合わせて Nightly Build の公開などに向いています。

現在 Preview 中ですが、特に機能が大きく変わったりすることはないでしょう。

f:id:shiba-yan:20190723235616p:plain

ドキュメントも公開されています。日付から見るに、最近リリースされたっぽいです。

これまでの Private Feed とは異なり、Upstream が無効化されているのが Public Feed の特徴という感じです。普通は Upstream は扱えないので、一般的な動作になりました。

Azure Artifacts については以前に書いたエントリを参照してください。Azure Pipelines からの利用方法などは変わっていないので、そのままで大丈夫です。

とりあえずサンプルとして Public Feed を作成してみます。適当な名前を付けて作成します。

f:id:shiba-yan:20190723235255p:plain

この画面で Public Feed についての注意点が書いてあるので確認しておきます。当然ながらだれでもアクセス出来るようになるので、その点だけは頭に入れておく必要があります。

Feed に NuGet パッケージを追加するために、適当なパイプラインを作成しました。今回は CI で Nightly Build を作成するという想定なので、バージョンはビルド番号から付けるようにしました。

trigger:
- master

variables:
  buildConfiguration: 'Release'

stages:
- stage: Build
  jobs:
  - job: Build_Nupkg
    pool:
      vmImage: 'windows-2019'
    steps:
    - powershell: 'echo "##vso[task.setvariable variable=PackageVersion]1.0.0-ci-$env:Build_BuildNumber"'
      displayName: 'PowerShell Script'

    - task: DotNetCoreCLI@2
      displayName: 'dotnet pack'
      inputs:
        command: pack
        packagesToPack: '**/*.csproj'
        packDirectory: '$(System.DefaultWorkingDirectory)/dist'
        versioningScheme: byEnvVar
        versionEnvVar: PackageVersion
        verbosityPack: Normal

    - publish: dist
      artifact: nupkg
      displayName: 'Publish artifacts'

- stage: Publish
  dependsOn:
  - Build
  jobs:
  - job: Publish_Nupkg
    pool:
      vmImage: 'windows-2019'
    steps:
    - download: current
      artifact: nupkg
      displayName: 'Download artifact'

    - task: DotNetCoreCLI@2
      inputs:
        command: 'push'
        packagesToPush: '$(Pipeline.Workspace)/**/*.nupkg'
        nuGetFeedType: 'internal'
        publishVstsFeed: 'xxxx/xxxx'

適当なクラスライブラリのプロジェクトをこのパイプライン定義でビルドすると、ビルド番号でバージョンが付けられた NuGet パッケージが Public Feed に追加されます。

NuGet が採用している SemVer 2.0 では、ハイフンで区切るとプレリリース扱いになります。すぐ後ろにビルド番号を付けるのではなく、Nightly であることが分かるように ci を間に付けています。

f:id:shiba-yan:20190724001303p:plain

何回かコミットを行ってビルドさせると、バージョンが追加されていきます。ちゃんとバージョンが新しいものが上に来ていることも確認できます。

f:id:shiba-yan:20190724001313p:plain

この Public Feed は NuGet クライアントからだけではなく、ブラウザからアクセスすると登録されているパッケージとバージョンを確認することが出来ます。この辺りも MyGet と似ていますね。

f:id:shiba-yan:20190725005401p:plain

昔みたいにプライベートで NuGet Server をホストしていると、API 経由でしかパッケージを確認できなかったりしましたが、Azure Artifacts の Public Feed では便利な UI 付きなので簡単です。

価格に関しては正確な情報が見当たりませんでしたが、おそらく Private と同じく容量課金だと思います。

Public Feed のパッケージを利用する

Public Feed に登録されているパッケージを参照するには、Private と同じようにパッケージソースとしての追加が必要です。Visual Studio がインストールされている場合は、これまで通り設定から追加できます。

f:id:shiba-yan:20190724005246p:plain

Visual Studio が無い環境では、NuGet CLI を使ってパッケージソースを追加できます。

Linux / macOS 環境では少し面倒で、Mono がインストールされている場合は NuGet CLI を利用してソースを追加できますが、それ以外の場合は手動で nuget.config を作成する必要があります。

一応 .NET Core CLI でテンプレートは作成できますが、あまり手軽ではないです。

パッケージソースを追加してしまえば、後はこれまで通り Install-Packagedotnet add package を使ってパッケージのインストールが行えます。

プレリリース扱いの場合は、バージョンを指定しないとエラーになるので注意です。

# Package Manager Console
Install-Package AzureArtifactsTest -Version 1.0.0-ci-20190724.1

# .NET Core CLI
dotnet add package AzureArtifactsTest --version 1.0.0-ci-20190724.1

認証が不要な分、すんなりと Public Feed を使うことが出来ました。

Private Feed やローカルからパッケージを追加する場合は、Credential Provider をインストールしないと地味にはまります。Azure Artifacts の Connect to feed に書いてある設定はイマイチなので、ついでに Credential Provider のインストールについても試しておきました。

おまけ : Credential Provider のインストール

Azure Artifacts の Private Feed を使う場合やパッケージを手動でプッシュする場合には、認証のために Credential Provider をインストールしておく必要があります。

Connect to feed から NuGet と一緒にダウンロードできますが、.NET Core を使う場合には以下のリポジトリからスクリプトを使ってインストールしないと dotnet コマンドで動きません。

Windows の場合は ps1 を、Linux / macOS の場合は sh をダウンロードして実行すれば、NuGet のプラグインとして Credential Provider がインストールされます。

ワンライナーだと Windows 向けは以下のようになるかと思います。ちなみにユーザー権限で良いです。

iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1'))

実行すると GitHub Release から最新の zip をダウンロードして、インストールまで行ってくれます。

f:id:shiba-yan:20190723235306p:plain

インストールが終われば dotnet nuget push を使ってプッシュしていくのですが、その時に登録したフィードの名前と API キー、そして --interactive オプションを指定して実行します。

今回の例では以下のようなコマンドとなります。API キーは AzureDevOps を指定します。

dotnet nuget push KazuakixWallet.nupkg -s "Azure Artifacts Feed" -k AzureDevOps --interactive

コマンドを実行すると、途中で Azure CLI などと同じように Device Flow を利用したログインが行われます。表示された URL にブラウザでアクセスして、Code を入力するとログインが完了するやつです。

Device Flow でのログインに成功すると、NuGet パッケージのプッシュが完了します。

f:id:shiba-yan:20190724005338p:plain

パッケージの復元時に認証周りでのエラーが出た場合は、同じように dotnet restore--interactive を付けて実行すると Device Flow でのログインが行われるようになります。

一度認証が通ってしまえば、次からはセッションが切れるまでは再ログイン不要です。