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 }
问题原因
- 原脚本注释了Key Vault存在性检查的代码,导致直接尝试创建已存在的资源,触发az CLI报错但未被处理。
- PowerShell默认不会捕获外部命令(如az CLI)的错误,外部命令的退出码无法触发
try/catch块。 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
相关产品推荐
相关产品推荐

