Azure Pipelines:「Please run 'az login' to setup account」
パイプラインのエージェントでは、だれも az login していません。Azure CLI がサインインしているのは Azure CLI のタスク(AzureCLI@2)の中だけです。このタスクはスクリプトの前に Azure Resource Manager のサービス接続でサインインし、スクリプトのあとでサインアウトします。そのタスクの外で動く az のコマンドはアカウントを見つけられず、このメッセージで止まります。Azure DevOps のコマンド(az devops・az repos・az pipelines・az boards)はまた別で、AZURE_DEVOPS_EXT_PAT のトークンを使います。
そのステップが az repos pr でプルリクエストを作ったり、投票したり、完了したりしているなら、同じプルリクエストを IDE で待たせておけます:JetBrains IDE のプラグイン Azure DevOps Pull Requests は、あなたのレビュー待ちのプルリクエストを IntelliJ IDEA・PyCharm・Rider に並べ、Azure DevOps Services ならトークンの代わりにあなた自身の Azure CLI のサインインを使えます。JetBrains Marketplace で入れる
出るメッセージ
ERROR: Please run 'az login' to setup account.(アカウントを用意するために az login を実行して、という意味)。az account show・az group list・az webapp deployなどから出ます。保存されたアカウントがひとつもないときに Azure CLI が出すメッセージです。- Azure DevOps のコマンドからは、拡張機能自身のメッセージが出ます:
Before you can run Azure DevOps commands, you need to run the login command(az login if using AAD/MSA identity else az devops login if using PAT token) to setup credentials.(Azure DevOps のコマンドの前に、az login か az devops login で資格情報を用意して、という意味)。使える Azure CLI のサインインも、トークンもなかったということです。
az がサインインしていないステップ
- ふつうのスクリプトのステップ(
bash・pwsh・script・Bash@3・PowerShell@2)。Microsoft がホストするエージェントには Azure CLI が入っていますが、サインインはしていません。 - Azure CLI のタスクのあとのステップ。タスクのソース(バージョン 2.283)では、スクリプトが終わると
az account clearを実行します。既定では、サインインをエージェントの一時フォルダーの下にその回だけ作る構成フォルダーに置き、最後に消します。useGlobalConfig: trueにしても、サインインは次のステップに残りません。 - Azure PowerShell のタスク(
AzurePowerShell@5)。サインインするのは Az PowerShell のモジュールで、Azure CLI ではないので、その中のazにはアカウントがありません。 - だれかが手で az login したセルフホストのエージェント。Azure CLI はサインインを、それを動かすアカウントの
.azureフォルダー(かAZURE_CONFIG_DIR)に置きます。エージェントのサービスはたいてい別のアカウントで動くので、そのサインインは見えません。
Azure のコマンド:Azure CLI のタスクの中で動かす
- コマンドを、Azure Resource Manager のサービス接続を指定した
AzureCLI@2に移します。Azure が要るステップがいくつかあるなら、それぞれを Azure CLI のタスクにします。 - ワークロード ID フェデレーションの接続で、スクリプトがサインインの有効期間より長く動くなら、
keepAzSessionActive: true(試験的とされています)がサインインを更新し続けます。タスクのソースでは、AADSTS700024 のエラーを避けるために足されたとあります。 - シークレットを使った
az loginをスクリプトに手で書くのは避けます。資格情報はサービス接続がすでに持っていて、ワークロード ID フェデレーションならしまっておくシークレット自体がありません。
- task: AzureCLI@2
inputs:
azureSubscription: 'my-arm-connection'
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
az account show
az webapp deploy --resource-group rg-demo --name app-demo --src-path app.zip
Azure DevOps のコマンド:AZURE_DEVOPS_EXT_PAT
- YAML での Azure DevOps CLI についての Microsoft のページでは、パイプライン自身のトークン
$(System.AccessToken)を、それが要るステップごとに環境変数AZURE_DEVOPS_EXT_PATとして渡します。このトークンのようなシークレットの変数は、渡さないとスクリプトの環境に入りません。 - Windows と Linux のホストされたエージェントには azure-devops の拡張機能が入っています。macOS には Azure CLI だけなので、
az extension add -n azure-devopsを先に足します。 - このトークンは、パイプラインのビルド サービスの ID として動きます。その ID に権限が足りないときは、このメッセージではなく権限のエラーで失敗します(たとえば push なら TF401027)。
AzureCLI@2の中では、拡張機能のソースはまず Azure CLI のサインインを試します。そこでのサインインは Azure の接続のサービス プリンシパルです。Azure DevOps がそれを受け付けるのは、そのサービス プリンシパルが組織に追加されているときだけです。AZURE_DEVOPS_EXT_PATも渡してあれば、拡張機能はサインインが組織で通るかを確かめ、通らなければトークンに切り替えます。- Microsoft は、
connectionType: azureDevOpsを指定したAzureCLI@3も載せています。ワークロード ID フェデレーションを使う Azure DevOps のサービス接続でサインインするタスクです。ページには、この機能は Azure DevOps Services にまだ順に展開中だと書かれています。
- bash: |
az repos pr list --organization '$(System.TeamFoundationCollectionUri)' --project '$(System.TeamProject)' --status active
env:
AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
IntelliJ IDEA・PyCharm・Rider で Azure DevOps のプルリクエスト
Azure DevOps Pull Requests は、JetBrains IDE 2024.1 以降と Android Studio で動く Lesstep のプラグインです。git のリモートから組織・プロジェクト・リポジトリを読み、あなたのレビュー待ちのプルリクエストを IDE のツール ウィンドウに並べます。Azure DevOps Services でも Azure DevOps Server でも動きます。サインインは個人用アクセス トークンか、Azure DevOps Services ならあなたの Azure CLI のサインイン(az login)で、トークンを制限している組織でも使えます。レビューの受信箱は無料、投票・コメント・完了・作成は Pro(30日の無料試用つき)。同じことをターミナルからするなら az repos pr と Azure CLI へ。
Azure・Azure DevOps・Azure Pipelines は Microsoft Corporation の商標、IntelliJ IDEA・PyCharm・Rider は JetBrains s.r.o. の商標です。このページはそのいずれとも提携しておらず、承認も受けていません。
ほかに:AADSTS7000215 と AADSTS7000222:サービス接続のシークレット · az repos pr と Azure CLI · TF401027:GenericContribute の権限 · This pipeline needs permission to access a resource · English