如何通过PowerShell脚本触发Azure DevOps CI/CD流水线
Azure DevOps 用PowerShell触发CI/CD流水线完整实现方案
前置配置要求
- 权限要求:操作账号至少具备对应项目的构建管理员或流水线参与者角色
- 个人访问令牌(PAT):提前在Azure DevOps个人设置中生成PAT,权限范围至少勾选Build (Read & execute),如需触开发布流水线还需额外勾选Release (Read, write, & execute),PAT生成后仅显示一次请妥善保存
- 运行环境:支持PowerShell 5.1及以上版本,无需额外安装第三方模块
- 必备参数:提前确认三个核心信息——Azure DevOps组织名、项目名、待触发的流水线ID(可在流水线页面URL的
pipelineId参数中获取)
完整操作步骤
步骤1:确认核心参数值
- 组织名:Azure DevOps域名前缀,例如
https://dev.azure.com/xxx中的xxx即为组织名 - 项目名:对应项目的准确名称,大小写需和系统配置完全匹配
- 流水线ID:打开待触发的流水线页面,地址栏中
pipelineId=后的数字即为流水线ID
步骤2:编写PowerShell触发脚本
触发CI构建流水线脚本
# 替换为实际配置值 $orgName = "你的组织名" $projectName = "你的项目名" $pipelineId = "你的构建流水线ID" $pat = "你的PAT令牌" # 生成认证头 $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($pat)")) $header = @{Authorization = ("Basic {0}" -f $base64AuthInfo) } # 构造请求体,不需要自定义参数可删除parameters字段 $body = @{ resources = @{ repositories = @{ self = @{} } } parameters = "{""自定义参数1"":""参数值1"",""自定义参数2"":""参数值2""}" } | ConvertTo-Json # 调用API触发流水线 $apiUrl = "https://dev.azure.com/$orgName/$projectName/_apis/pipelines/$pipelineId/runs?api-version=7.1-preview.1" try { $response = Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $header -Body $body -ContentType "application/json" Write-Host "构建流水线触发成功,运行ID:$($response.id),运行页面地址:$($response._links.web.href)" } catch { Write-Host "触发失败,错误码:$($_.Exception.Response.StatusCode.value__),错误信息:$($_.ErrorDetails.Message)" }
触发CD发布流水线脚本
# 替换为实际配置值 $orgName = "你的组织名" $projectName = "你的项目名" $releasePipelineId = "你的发布流水线ID" $pat = "你的PAT令牌" # 生成认证头 $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($pat)")) $header = @{Authorization = ("Basic {0}" -f $base64AuthInfo) } # 构造请求体,不需要关联制品或自定义变量可删除对应字段 $body = @{ definitionId = $releasePipelineId variables = @{ 发布变量1 = @{ value = "变量值1" } 发布变量2 = @{ value = "变量值2" } } artifacts = @( @{ alias = "发布流水线中配置的构建制品别名" instanceReference = @{ id = "对应构建运行的ID" name = "对应构建的版本号" } } ) } | ConvertTo-Json -Depth 10 # 调用API触发发布 $apiUrl = "https://vsrm.dev.azure.com/$orgName/$projectName/_apis/release/releases?api-version=7.1-preview.8" try { $response = Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $header -Body $body -ContentType "application/json" Write-Host "发布流水线触发成功,发布ID:$($response.id),发布页面地址:$($response._links.web.href)" } catch { Write-Host "触发失败,错误码:$($_.Exception.Response.StatusCode.value__),错误信息:$($_.ErrorDetails.Message)" }
步骤3:执行验证
替换脚本中的所有占位参数后,直接在PowerShell终端运行脚本即可,返回成功信息后可到Azure DevOps流水线页面核对运行记录。
安全注意事项
- 禁止将PAT明文硬编码在脚本中,生产环境建议通过环境变量、密钥管理工具存储PAT,避免权限泄露
- PAT权限需遵循最小够用原则,仅勾选需要的流水线操作权限即可,不要开启全范围权限
常见问题处理
- 报错403权限不足:检查PAT是否过期、权限范围是否符合要求,以及对应账号是否有目标流水线的执行权限
- 报错404资源不存在:核对组织名、项目名、流水线ID的拼写和大小写是否和系统配置一致,确认项目权限是否开放给当前账号
- 自定义参数不生效:检查流水线配置中是否开启了仅在队列时允许重写参数的开关,未开启的情况下脚本传入的自定义参数会被忽略
- 脚本执行提示网络错误:检查运行环境是否能正常访问Azure DevOps域名,是否有代理、防火墙拦截请求
- 发布流水线触发后制品不匹配:检查请求体中artifacts的alias是否和发布流水线中配置的制品别名完全一致,关联的构建ID是否为已完成的有效构建ID
内容的提问来源于stack exchange,提问作者kiran
相关产品推荐
相关产品推荐

