我一直在调查我们在工作中的一些部署中看到的一个问题。
作为背景,我们在 Azure 中部署了多个服务,并且有一个Start-Job
用于运行并发子作业的主脚本。在大多数情况下,这很有效,尽管偶尔我们会看到子作业报告为已完成的构建,但它的HasMoreData
属性是false
,并且在任何地方都没有出现错误。如果没有至少一行日志,我们运行的任何子作业都无法成功完成,因此这似乎是启动作业时出现的错误。
这是我们用来创建作业的命令:
Start-Job -Name $RepoName -ScriptBlock {Invoke-Expression -Command "$args"} -ArgumentList $command
在讨论过程中,我们认为可能存在错误,但我们Invoke-Expression
正在吃它,所以我们将创造就业机会改为:
Start-Job -Name $RepoName -ScriptBlock ([ScriptBlock]::Create(".{$command}"))
自昨天进行更改以来,我们还没有看到此问题再次出现。为了测试,我创建了一个新分支,在其中我恢复到该Invoke-Expression
方法并立即再次开始看到错误。
我只是希望看看是否有人知道为什么会出现这个问题,以及为什么在使用 Invoke-Expression 方法时它是一个间歇性问题,而不是该[ScriptBlock]::Create
方法。
谢谢!
编辑以获取更多背景:
因此,主脚本 (deployAll.ps1) 有一个要部署的服务列表,并为每个服务构建一个要执行的命令,该命令构建必要的环境,然后调用每个服务提供的 deployService.ps1 脚本。
关于构建要执行的命令,我们有一个所有子作业都使用的通用脚本,因此我们将其导入并登录到 Azure 作为我们构建的命令的一部分,因此实际传递给 Start-Job 的命令看起来像:
Import-Module $ScriptPath\AzureWrapper.ps1 -Force; $ScriptPath\login.ps1 -AzureAppID $Env:AZURE_APP_ID -AzurePassword $Env:AZURE_PASSWORD -AzureTenantId $Env:AZURE_TENANT_ID; $ScriptPath\..\$RepoName\deploy\deployService.ps1 -subscriptionId '$subscriptionId' -environmentFilePath '$configPath'
此外,在Invoke-Expression
进一步研究之后,似乎这些设置命令是必要的原因,因为它在单独的环境中运行。