Azure Artifacts:pip の「401 Error, Credentials not correct for …/pypi/simple/」
pip はフィードのインデックス(…/_packaging/<フィード>/pypi/simple/<パッケージ>/)に、どのバージョンがあるかを聞きます。Azure Artifacts は、受け付ける資格情報のない要求には 401 を返します。pip はそこで止まらず、警告を出し、そのフィードには何もないものとして扱い、そのあと (from versions: none) で失敗します。パッケージがフィードにないように読めますが、フィードは一度も読まれていません(これについての Stack Overflow の質問は4万回以上見られています)。
プルリクエストのビルド検証で pip install が失敗しているなら、プルリクエストはそれを待っています:JetBrains IDE のプラグイン Azure DevOps Pull Requests は、プルリクエストのブランチ ポリシーを状態つきで IDE に並べ、Pro ならフィードがビルドを通すようになったあとに、失敗したビルド ポリシーをもう一度動かせます。JetBrains Marketplace で入れる
どう見えるか
WARNING: 401 Error, Credentials not correct for https://pkgs.dev.azure.com/fabrikam/_packaging/shared/pypi/simple/fabrikam-tools/のあとに、ERROR: Could not find a version that satisfies the requirement fabrikam-tools (from versions: none)とERROR: No matching distribution found for fabrikam-tools。- ターミナルでは、pip が代わりに
User for pkgs.dev.azure.com:と聞いてくることがあります。同じ 401 を受け取り、ほかに試すものがないということです。 - Azure DevOps Server でも同じで、
pkgs.dev.azure.comの代わりにサーバーのアドレスが出ます。
自分のマシンでは:artifacts-keyring
pip install artifacts-keyringは、pip が求めたときに Azure Artifacts のフィードのトークンを取ってくる keyring のバックエンドを足します。そのあとはpip install fabrikam-tools --index-url https://pkgs.dev.azure.com/fabrikam/_packaging/shared/pypi/simple/が動きます。Microsoft のクイックスタートのように、仮想環境のpip.ini(Windows)かpip.conf(macOS・Linux)のindex-urlに同じアドレスを書いても同じです。- pip 19.2 以降と Python 3.10 以降、Linux では .NET 8 のランタイムが要ります(README)。一番読まれている質問への回答も、artifacts-keyring を入れること、その前に
python -m pip install --upgrade pipで pip を上げること、に行き着いています。 - 初回はサインインを求めます。たとえばターミナルにデバイス コードが出ます。何も出ないなら、詳しさの設定が Warning 以上になっていて、その案内が隠れているのかもしれません。README はこのための
ARTIFACTS_KEYRING_VERBOSITYを挙げています。
artifacts-keyring なしで:個人用アクセス トークン
- Packaging の Read のスコープを持つ個人用アクセス トークンを作り、パスワードとして使います(この警告の質問の採用された回答)。インデックスの URL なら
https://any-name:<トークン>@pkgs.dev.azure.com/fabrikam/_packaging/shared/pypi/simple/です。ユーザー名は確かめられず、あればよいだけです。 - URL に入れたトークンは、
pip.confやシェルの履歴に残ります。そのファイルはリポジトリに入れず、期限が切れたら作り直します。切れた日に 401 が戻ってきます。 - プロジェクト スコープのフィードは、アドレスにプロジェクトが入ります:
…/fabrikam/Web/_packaging/shared/pypi/simple/。
パイプラインでは:pip install の前に PipAuthenticate
pip installの前に、artifactFeeds:を書いた- task: PipAuthenticate@1を足します。このタスクは、そのフィードの資格情報を入れたPIP_INDEX_URLとPIP_EXTRA_INDEX_URLを設定します(タスクのリファレンス)。プロジェクト スコープのフィードはproject/feed、組織スコープのフィードは名前だけで書きます。ほかの組織のフィードはpythonDownloadServiceConnectionsに書きます。- タスクを2回動かしても、資格情報は積み重なりません。動かすたびに、それまでの資格情報が消えます。ジョブが使うフィードは全部1つのタスクに書きます。
onlyAddExtraIndex: trueにすると、PyPI が主なインデックスのまま、フィードは追加のインデックスになります。- タスクを置いても 401 や 403 のままなら、ビルド ID がフィードのロールを持っていないか、フィードが別のプロジェクトにあります。ロールもスコープの設定も NuGet と同じです:Unable to load the service index for source。PyPI のようなアップストリームからパッケージを保存するには、タスクのリファレンスにあるとおり、ID に Feed and Upstream Reader (Collaborator) が要ります。
Poetry
- Poetry は
PIP_INDEX_URLを読まないので、PipAuthenticate だけでは助けになりません。poetry installの前のスクリプトのステップで、ソースに資格情報を渡します:poetry config http-basic.azure any-name $(System.AccessToken)。azureはpyproject.tomlでのソースの名前です(これについての質問への回答)。ジョブのトークンが使えるのは、ビルド ID がフィードのロールを持っているときだけです。
IntelliJ IDEA と Rider で Azure DevOps のプルリクエスト
Azure DevOps Pull Requests は、JetBrains IDE 2024.1 以降と Android Studio で動く Lesstep のプラグインです。git のリモートから組織・プロジェクト・リポジトリを読み、あなたのレビュー待ちのプルリクエストを IDE のツール ウィンドウに並べます。Azure DevOps Services でも Azure DevOps Server でも動きます。プルリクエストのブランチ ポリシーを状態つきで見せるので、通っていない必須のビルドがプルリクエストの隣に出ます。Pro なら、失敗したビルド ポリシーや期限の切れたビルド ポリシーをそこからもう一度動かせます。レビューの受信箱は無料、投票・コメント・完了・作成は Pro(30日の無料試用つき)。
Azure DevOps・Azure Artifacts・Azure Pipelines は Microsoft Corporation の商標、Python と PyPI は Python Software Foundation の商標、IntelliJ IDEA と Rider は JetBrains s.r.o. の商標です。このページはそのいずれとも提携しておらず、承認も受けていません。
ほかに:Maven:フィードからの 401 Unauthorized · NuGet:Unable to load the service index for source · npm:E401 Unable to authenticate · チェックアウトが Git fetch failed with exit code: 128 で止まる · English