You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions调用PowerShell脚本时AZ CLI错误未触发工作流失败

问题

我有一个从GitHub Actions调用的PowerShell脚本,测试时发现请求的Key Vault已存在导致脚本执行失败,但GitHub Actions未报错,仍显示执行成功。希望实现当脚本失败时GitHub Actions也随之失败。原脚本代码如下:

param
(
  [String] [Parameter(Mandatory = $true)] $resourceGroupName,
  [String] [Parameter(Mandatory = $true)] $keyVaultname
)
$accessPoliciesConfig = '[{"objectId":"xxxxxxxx","certificatesPermissions":["all"], "keysPermissions":["all"], "secretsPermissions":["all"], "storagePermissions":["all"]}, {"objectId":"xxxxxxxxxxxx", "certificatesPermissions":["all"], "keysPermissions":["all"], "secretsPermissions":["all"], "storagePermissions":["all"]}]'.Replace(' ','') | ConvertTo-Json


# $users = '[{"type":"ServicePrincipal","id":"xxxx","roleid":"21090545-7ca7-4776-b22c-e363652d74d2"}]'.Replace(' ','') | ConvertTo-Json
$users = '[]'.Replace(' ','') | ConvertTo-Json

try{
    $kvName = "$keyVaultPrefix-$application-$audience-$environment"
    # $keyVaultExist = az keyvault show --name $kvName
    if(!$keyVaultExist){

    az deployment group create --resource-group $resourceGroupName --template-file '.\iac\create_kv.bicep' --parameters accessPoliciesConfig=$accessPoliciesConfig users=$users keyVault_name=$keyVaultname

}
}
catch
{
    Write-Host $Error
    throw
    return 1
}
问题原因
  1. 原脚本注释了Key Vault存在性检查的代码,导致直接尝试创建已存在的资源,触发az CLI报错但未被处理。
  2. PowerShell默认不会捕获外部命令(如az CLI)的错误,外部命令的退出码无法触发try/catch块。
  3. return 1无法让GitHub Actions识别为失败,需要使用exit 1返回非零退出码。
解决方案

修改后的脚本如下,通过严格的错误检查和退出码处理,确保脚本失败时GitHub Actions同步标记为失败:

param
(
  [String] [Parameter(Mandatory = $true)] $resourceGroupName,
  [String] [Parameter(Mandatory = $true)] $keyVaultname
)

$accessPoliciesConfig = '[{"objectId":"xxxxxxxx","certificatesPermissions":["all"], "keysPermissions":["all"], "secretsPermissions":["all"], "storagePermissions":["all"]}, {"objectId":"xxxxxxxxxxxx", "certificatesPermissions":["all"], "keysPermissions":["all"], "secretsPermissions":["all"], "storagePermissions":["all"]}]'.Replace(' ','') | ConvertTo-Json

$users = '[]'.Replace(' ','') | ConvertTo-Json

# 配置PowerShell严格处理错误,将非终止错误转为终止错误
$ErrorActionPreference = "Stop"

try {
    # 检查Key Vault是否存在,通过az命令退出码判断
    az keyvault show --name $keyVaultname
    if ($LASTEXITCODE -eq 0) {
        Write-Host "Key Vault $keyVaultname 已存在,终止执行"
        exit 1
    }

    # 执行Bicep部署创建Key Vault
    az deployment group create `
        --resource-group $resourceGroupName `
        --template-file '.\iac\create_kv.bicep' `
        --parameters accessPoliciesConfig=$accessPoliciesConfig users=$users keyVault_name=$keyVaultname

    # 检查部署命令执行结果
    if ($LASTEXITCODE -ne 0) {
        Write-Host "Key Vault创建失败"
        exit 1
    }
}
catch {
    Write-Host "执行过程出错: $_"
    exit 1
}
关键修改说明
  • 恢复并完善Key Vault存在性检查:通过az keyvault show命令和$LASTEXITCODE判断资源是否存在,若存在则直接退出并返回错误码。
  • 设置$ErrorActionPreference = "Stop":让PowerShell将所有非终止错误转为终止错误,确保异常能被try/catch捕获。
  • 检查每个az命令的$LASTEXITCODE:外部命令执行失败时手动调用exit 1,确保GitHub Actions识别为失败。
  • 使用exit 1替代return 1:PowerShell脚本中exit会终止整个进程并返回指定码,而return仅退出当前函数/脚本块,无法触发GitHub Actions的失败标记。

内容的提问来源于stack exchange,提问作者learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:40:59