Azure DevOps如何捕获运行用户为变量用于Bicep资源打标签
解决方法
你之前调用[System.Security.Principal.WindowsIdentity]::GetCurrent().Name获取的是托管代理节点本地的运行账号,自然只能拿到代理用户,和触发流水线的ADO用户完全无关,换用ADO内置预定义变量即可解决。
步骤1:使用ADO内置预定义变量获取触发用户
Azure DevOps已经内置了存储触发用户信息的预定义变量,无需自行抓取系统身份:
- 构建流水线场景,使用
Build.RequestedFor获取用户显示名,Build.RequestedForEmail获取用户邮箱 - 经典发布流水线场景,使用
Release.RequestedFor获取用户显示名,Release.RequestedForEmail获取用户邮箱
步骤2:赋值自定义变量(可选)
如果需要将用户信息赋值为自定义流水线变量,可使用如下PowerShell脚本:
# 构建流水线使用 $triggerUser = $env:BUILD_REQUESTEDFOR # 发布流水线请替换为 $triggerUser = $env:RELEASE_REQUESTEDFOR Write-Host "##vso[task.setvariable variable=createdBy;]$triggerUser"
注:ADO预定义变量在PowerShell环境中会自动转换为全大写、点替换为下划线的环境变量,可直接调用。
步骤3:传递变量给Bicep添加标签
首先在你的Bicep文件中定义接收创建者信息的参数,示例如下:
param createdBy string // 其他参数定义省略 resource yourResource 'Microsoft.XXX/XXX@XXXX-XX-XX' = { name: 'your-resource-name' location: resourceGroup().location tags: { CreatedBy: createdBy // 其他标签省略 } // 其他资源配置省略 }
之后在流水线的Bicep部署任务中,将用户变量作为参数传入即可:
- 如果直接使用预定义变量,在部署任务的参数覆盖配置中添加
-createdBy $(Build.RequestedFor)(发布流水线替换为$(Release.RequestedFor)) - 如果使用了上文的自定义变量,添加
-createdBy $(createdBy)即可
特殊场景说明:如果流水线由定时任务、服务连接等非用户操作触发,上述变量会返回对应服务账号的名称,符合实际触发主体的逻辑。
内容的提问来源于stack exchange,提问作者ashleighmjr
相关产品推荐
相关产品推荐

