我一直在调查我们在某些部署工作中看到的问题。
对于后台,我们将多个服务部署到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脚本。 / p>
关于构建要执行的命令,我们有一个所有子作业使用的公共脚本,因此我们将其导入并作为我们构建的命令的一部分登录到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
后,似乎可能是这些设置命令必要的原因,因为它在一个单独的环境中运行。