我有一个 Azure 网站,其中包含具有多个实例的生产和暂存槽。
我在网站上运行多个 Azure Web 作业,其中一些是触发的,另一些是连续的。
我了解触发的网络作业只会在一个实例上运行一次。
我当前的设置是:
生产站点除了从临时站点交换之外没有任何部署
暂存网站已设置为从 bitbucket 持续部署
使用“发布到 Azure”将 Web 作业从 VS 内部署到生产槽(因为据我所知,不支持基于计划的 Web 作业的持续部署)
网站的VS解决方案与包含webjobs的VS解决方案不同
我注意到当我交换制作和登台时,网络作业也会交换! 当我将一个新的 webjob 部署到生产环境并随后进行网站部署并进行交换时,我意识到这一点,新部署的 webjob 不再位于生产槽中!
我的问题:
是否可以阻止网络作业在生产和登台之间交换(网络作业实际上是与网站完全不同的代码段)
webjobs 到底换了什么?二进制文件?日程?两个都?
如何阻止所有网络作业在暂存槽上运行?我的网络作业不需要具有高可用性,我可以轻松地离线测试它们。
如果我将 webjobs 部署到暂存槽并进行交换,那么当前的暂存槽将缺少已部署的 webjob,并且当我进行下一次网站更新时我将丢失它,那么我应该在哪里部署我的 webjobs?
有一个相关线程,但它假设网络作业与网站同时部署,而这不是我目前拥有的网站。
我真的很喜欢网站和webjobs,但似乎与webjobs和网站持续独立部署相关的故事已经被打破了。
非常感谢建议!
谢谢
Azure 网站部署槽并不是一个容易理解的概念,与 WebJobs 一起使用会变得更加困难。
我建议阅读以下文章以更好地了解部署槽 - http://blog.amitapple.com/post/2014/11/azure-websites-slots/(包括有用信息的评论部分)
要更好地了解 WebJobs 的工作和部署方式,请参阅这篇文章 - http://blog.amitapple.com/post/74215124623/deploy-azure-webjobs/
重要的是要了解:
因此,当您交换插槽时,您实际上交换了包括 WebJob 在内的网站文件。
请注意,直接部署 WebJob 而不是作为网站文件/存储库的一部分部署是一种不好的做法,这可能是导致您遇到问题的原因。
要防止 WebJobs 在暂存槽上运行,您可以添加一个名为
WEBJOBS_STOPPED
的应用程序设置,并将其设置为 1
(在 Azure 门户中)。 (来源)。确保此应用程序设置粘在插槽上,否则它将传播到生产插槽。
解决此问题的最简单方法是为您的 Web 作业创建一个单独的 Web 应用程序。只需将 Worker Web 应用程序放在同一个 Azure 服务计划上,您就会在同一台计算机上运行两个单独的 Web 应用程序。
网络应用程序 网络应用程序工作者
这是 Amit 使用 PowerShell 对#3 的回答,
Function Disable-AzureSlotJobs($SiteName, $Slot = 'staging')
{
$site = Get-AzureWebsite -Name $SiteName -Slot $Slot
$site.AppSettings.WEBJOBS_STOPPED = "1"
Set-AzureWebsite -Name $SiteName -Slot $Slot -AppSettings $site.AppSettings
Set-AzureWebsite -Name $SiteName -SlotStickyAppSettingNames @("WEBJOBS_STOPPED")
}
'MySite1', 'MySite2', 'MySite3' | % { Disable-AzureSlotJobs $_ }
我的解决方案是在部署后、交换插槽和/或启动插槽中的应用程序服务之前从插槽中删除 webjob:
az webapp webjob continuous remove --webjob-name fooJob --name fooApp --resource-group fooApps --slot fooSlot
可以通过使用内联 powershell 脚本添加 Azure CLI 任务来在 Azure DevOps 版本中完成。