Azure Pipelines - Sprint 240 更新
功能
- 使用 Microsoft Entra ID 身份验证从管道访问Azure 服务总线
- 管道和任务填充变量以自定义工作负荷标识联合身份验证
- 重试服务器任务
- 使用生命周期结束节点运行程序版本执行的任务发出警告
- DockerCompose0 在 v1 兼容模式下使用 Docker Compose v2
使用 Microsoft Entra ID 身份验证从管道访问Azure 服务总线
现在可以使用 Microsoft Entra ID 身份验证从 Azure Pipelines 访问Azure 服务总线。 这样就可以利用工作负荷标识联合来删除机密管理和 Azure RBAC,以便进行精细的访问控制。
需要向访问Azure 服务总线的标识授予访问服务总线上Azure 服务总线的 Azure 内置角色之一。
PublishToAzureServiceBus@2任务
可以使用 Azure 服务连接配置新的PublishToAzureServiceBus@2任务。 创建 Azure 服务连接 并填充 serviceBusQueueName
新任务的和 serviceBusNamespace
属性:
- task: PublishToAzureServiceBus@2
inputs:
azureSubscription: my-azure-service-connection
serviceBusQueueName: my-service-bus-queue
serviceBusNamespace: my-service-bus-namespace
useDataContractSerializer: false
messageBody: |
{
"foo": "bar"
}
服务器任务
使用 ServiceBus
执行的自定义服务器(无代理)任务可以指定 Azure 服务连接并 EndpointId
省略 ConnectionString
。 请参阅 服务器任务创作。
管道和任务填充变量以自定义工作负荷标识联合身份验证
用于请求 OIDC 令牌的 REST API 终结点现在在管道变量中 System.OidcRequestUri
可用。 任务开发人员可以利用此变量生成 idToken,以便使用 Entra ID 进行身份验证。
如果使用市场任务或自定义任务部署到 Azure,请注意,这些任务可能尚不支持工作负荷标识联合。 我们建议任务开发人员启用工作负荷标识联合,以提高安全措施。
connectedService:AzureRM
可以通过以下步骤更新采用task.json输入的任务以支持工作负荷标识联合:
- 利用 Oidctoken REST API 请求 idToken(上图中的箭头 1)。
- 使用 OAuth API 的联合凭据流交换 idToken 作为访问令牌,并将 idToken 指定为
client_assertion
(上图中的箭头 2 和 4):
或: - 对于充当执行身份验证本身的工具的包装器的任务,请使用工具的身份验证方法指定联合令牌。
节点任务可以使用 azure-pipelines-tasks-artifacts-common npm 包来获取 idToken。 有关实现详细信息, 请参阅代码示例 。
请求新的 idToken
System.OidcRequestUri
管道变量和AZURESUBSCRIPTION_SERVICE_CONNECTION_ID
任务中AzureCLI@2
AzurePowerShell@5
公开的环境变量允许管道作者从其自己的脚本进行身份验证:
PowerShell Az
- task: AzurePowerShell@5
inputs:
azureSubscription: 'my-azure-subscription'
scriptType: inlineScript
inline: |
# Request fresh idToken
Invoke-RestMethod -Headers @{
Authorization = "Bearer $(System.AccessToken)"
'Content-Type' = 'application/json'
} `
-Uri "${env:SYSTEM_OIDCREQUESTURI}?api-version=7.1&serviceConnectionId=${env:AZURESUBSCRIPTION_SERVICE_CONNECTION_ID}" `
-Method Post `
| Select-Object -ExpandProperty oidcToken
| Set-Variable idToken
# Fetch current context
$azContext = Get-AzContext
# Start new Az session
Connect-AzAccount -ApplicationId $azContext.Account.Id `
-TenantId $azContext.Tenant.Id `
-SubscriptionId $azContext.Subscription.Id `
-FederatedToken $idToken
Azure CLI
- task: AzureCLI@2
inputs:
addSpnToEnvironment: true
azureSubscription: 'my-azure-subscription'
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
# Request fresh idToken
OIDC_REQUEST_URL="${SYSTEM_OIDCREQUESTURI}?api-version=7.1&serviceConnectionId=${AZURESUBSCRIPTION_SERVICE_CONNECTION_ID}"
ARM_OIDC_TOKEN=$(curl -s -H "Content-Length: 0" -H "Content-Type: application/json" -H "Authorization: Bearer $(System.AccessToken)" -X POST $OIDC_REQUEST_URL | jq -r '.oidcToken')
# Save subscription context
ARM_SUBSCRIPTION_ID=$(az account show --query id -o tsv)
# New az-cli session
az login --service-principal -u $servicePrincipalId --tenant $tenantId --allow-no-subscriptions --federated-token $ARM_OIDC_TOKEN
az account set --subscription $ARM_SUBSCRIPTION_ID
重试服务器任务
调用外部系统(如 AzureFunction
或 InvokeRESTAPI
)的服务器任务有时可能会由于计算资源耗尽等暂时性错误而失败。 以前,此类失败将导致整个作业和管道失败。
为了提高针对暂时性错误的复原能力,我们引入了对 retryCountOnTaskFailure
服务器任务中的属性的支持。 假设管道中有以下 YAML 代码:
- stage: deploy
jobs:
- job:
pool: server
steps:
- task: AzureFunction@1
retryCountOnTaskFailure: 2
inputs:
function: 'https://api.fabrikamfiber.com'
key: $(functionKey)
method: 'POST'
waitForCompletion: 'false'
如果 https://api.fabrikamfiber.com
遇到暂时性错误,Azure Pipelines 将重试请求最多三次(初始尝试加上指定的 retryCountOnTaskFailure
两次重试)。 每次重试都包括一个增加的等待期。 允许的最大重试次数为 10。
ManualValidation
该retryCountOnTaskFailure
任务不适用于不涉及外部系统调用的任务和其他任务。
使用生命周期结束节点运行程序版本执行的任务发出警告
不再 维护 依赖于 Node 版本的管道任务将开始接收警告:
任务
TaskName
版本<version>
依赖于节点版本(10),即生命周期结束。 请联系扩展所有者获取任务的更新版本。 任务维护人员应查看节点升级指南: https://aka.ms/node-runner-guidance
若要取消这些警告,可以在管道(作业)或任务级别设置环境或管道变量。 例如:
variables:
AZP_AGENT_CHECK_IF_TASK_NODE_RUNNER_IS_DEPRECATED: false
DockerCompose@0在 v1 兼容模式下使用 Docker Compose v2
Docker Compose v1 将于 2024 年 7 月 24 日从托管代理中删除其生命周期结束。 如果 Docker Compose v1 在代理上不可用,我们已更新 了DockerCompose@0 任务,以在 v1 兼容模式下使用 Docker Compose v2。
但是,兼容性模式不能解决所有兼容性问题。 请参阅迁移到 Compose V2。 部分用户需要花费更多的时间来更新 Docker Compose 项目,才能实现 Docker Compose v2 兼容性。 在这些情况下,请按照这些说明将 DockerComposeV0 任务与 docker-compose v1 配合使用。
注意:本指南基于 安装 Compose 独立 文档
在 Windows 上使用 docker-compose v1
将 powershell 步骤添加到管道以下载 docker-Compose v1.29.2,并将其用于 Windows 上的 DockerComposeV0 任务:
variables:
dockerComposePath: C:\docker-compose
steps:
- powershell: |
mkdir -f $(dockerComposePath)
# GitHub now requires TLS1.2. In PowerShell, run the following
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Start-BitsTransfer -Source "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-windows-x86_64.exe" -Destination $(dockerComposePath)\docker-compose.exe
displayName: Download docker-compose
- task: DockerCompose@0
inputs:
containerregistrytype: 'Azure Container Registry'
dockerComposeFile: '**/docker-compose.yml'
action: 'Run a Docker Compose command'
dockerComposeCommand: 'run'
dockerComposePath: $(dockerComposePath)\docker-compose.exe
在 Linux 上使用 docker-compose v1
将 bash 步骤添加到管道以下载 Docker-Compose v1.29.2,并将其与 Linux 上的 DockerComposeV0 任务配合使用:
variables:
dockerComposePath: /tmp/docker-compose
steps:
- bash: |
sudo mkdir $(dockerComposePath)
sudo curl -SL https://github.com/docker/compose/releases/download/1.29.2/docker-compose-linux-x86_64 -o $(dockerComposePath)/docker-compose
sudo chmod 755 $(dockerComposePath)/docker-compose
displayName: Download docker-compose
- task: DockerCompose@0
inputs:
containerregistrytype: 'Azure Container Registry'
dockerComposeFile: $(Build.SourcesDirectory)/DockerComposeV0/docker-compose.yml
action: 'Run a Docker Compose command'
dockerComposeCommand: 'run'
dockerComposePath: $(dockerComposePath)/docker-compose
后续步骤
注意
这些功能将在未来两到三周内推出。
前往 Azure DevOps 并了解一下。
如何提供反馈
我们很想听听你对这些功能的看法。 使用帮助菜单报告问题或提供建议。
你还可以在 Stack Overflow 上获取社区的建议和问题解答。