如何防止 Azure webjobs 在 Azure 网站生产 <--> 暂存槽中被交换
How to prevent Azure webjobs from being swapped in Azure website production <--> staging slots
我有一个 Azure 网站,其中包含多个实例的生产和暂存槽。
我 运行 网站上有几个 Azure webjobs,其中一些是触发的,另一些是连续的。
我知道触发的网络作业只会 运行 一次。
我当前的设置是:
生产站点除了从临时交换外没有部署
暂存网站已设置为从 bitbucket 持续部署
Web 作业使用 "publish to Azure" 从 VS 内部部署到生产槽(因为 AFAIK 不支持基于计划的 Web 作业的持续部署)
网站的VS方案与包含webjobs的VS方案不同
我注意到当我交换生产和暂存时,webjobs 也被交换了!
当我将一个新的 webjob 部署到生产环境并随后进行网站部署和交换时,我意识到了这一点,新部署的 webjob 不再在生产槽中!
我的问题:
是否可以防止 webjobs 在生产和暂存之间交换(webjobs 是与网站完全不同的代码片段)
webjobs到底交换了什么?二进制文件?日程?两者 ?
我如何防止所有网络作业 运行在暂存槽上?我的网络作业不需要高可用性,我可以轻松地离线测试它们。
如果我 VS 将 webjobs 部署到暂存槽并进行交换,那么当前的暂存槽将缺少已部署的 webjob,我将在下次网站更新时丢失它,所以我应该在哪里部署我的网络作业?
有一个 related thread 但它假设 webjob 与我目前没有的网站同时部署。
我真的很喜欢网站和webjobs,但似乎与持续独立部署webjobs和网站有关的故事被打破了。
非常感谢您的建议!
谢谢
Azure 网站部署槽不是一个容易理解的概念,与 WebJobs 一起变得有点困难。
我建议阅读以下内容 post 以更好地了解部署槽 - http://blog.amitapple.com/post/2014/11/azure-websites-slots/(包括有用信息的评论部分)
要更好地了解 WebJobs 的工作和部署方式,请参阅此 post - http://blog.amitapple.com/post/74215124623/deploy-azure-webjobs/
重要的是要了解:
- 交换部署槽时,您实际上是在两个槽之间交换了网站的 content/files。
- WebJobs 是网站内容的一部分。
因此,当您交换插槽时,您实际上交换了包括 WebJob 在内的网站文件。
Note it is a bad practice to deploy a WebJob directly and not as part of your website files/repository, this is probably the cause of issues you are having.
要防止 WebJobs 在暂存槽上 运行,您可以添加一个名为 WEBJOBS_STOPPED
的应用程序设置并将其设置为 1
(在 Azure 门户中)。 (source)。确保此应用设置粘在插槽中,否则它会传播到生产插槽。
这是 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 $_ }
到目前为止,解决此问题最简单的方法是为您的 Web 作业创建一个单独的 Web 应用程序。只需将 Worker Web App 置于同一个 Azure 服务计划中,您将在同一台计算机上拥有两个单独的 Web 应用程序 运行。
网络应用
网络应用工作者
我有一个 Azure 网站,其中包含多个实例的生产和暂存槽。
我 运行 网站上有几个 Azure webjobs,其中一些是触发的,另一些是连续的。
我知道触发的网络作业只会 运行 一次。
我当前的设置是:
生产站点除了从临时交换外没有部署
暂存网站已设置为从 bitbucket 持续部署
Web 作业使用 "publish to Azure" 从 VS 内部部署到生产槽(因为 AFAIK 不支持基于计划的 Web 作业的持续部署)
网站的VS方案与包含webjobs的VS方案不同
我注意到当我交换生产和暂存时,webjobs 也被交换了! 当我将一个新的 webjob 部署到生产环境并随后进行网站部署和交换时,我意识到了这一点,新部署的 webjob 不再在生产槽中!
我的问题:
是否可以防止 webjobs 在生产和暂存之间交换(webjobs 是与网站完全不同的代码片段)
webjobs到底交换了什么?二进制文件?日程?两者 ?
我如何防止所有网络作业 运行在暂存槽上?我的网络作业不需要高可用性,我可以轻松地离线测试它们。
如果我 VS 将 webjobs 部署到暂存槽并进行交换,那么当前的暂存槽将缺少已部署的 webjob,我将在下次网站更新时丢失它,所以我应该在哪里部署我的网络作业?
有一个 related thread 但它假设 webjob 与我目前没有的网站同时部署。
我真的很喜欢网站和webjobs,但似乎与持续独立部署webjobs和网站有关的故事被打破了。
非常感谢您的建议!
谢谢
Azure 网站部署槽不是一个容易理解的概念,与 WebJobs 一起变得有点困难。
我建议阅读以下内容 post 以更好地了解部署槽 - http://blog.amitapple.com/post/2014/11/azure-websites-slots/(包括有用信息的评论部分)
要更好地了解 WebJobs 的工作和部署方式,请参阅此 post - http://blog.amitapple.com/post/74215124623/deploy-azure-webjobs/
重要的是要了解:
- 交换部署槽时,您实际上是在两个槽之间交换了网站的 content/files。
- WebJobs 是网站内容的一部分。
因此,当您交换插槽时,您实际上交换了包括 WebJob 在内的网站文件。
Note it is a bad practice to deploy a WebJob directly and not as part of your website files/repository, this is probably the cause of issues you are having.
要防止 WebJobs 在暂存槽上 运行,您可以添加一个名为 WEBJOBS_STOPPED
的应用程序设置并将其设置为 1
(在 Azure 门户中)。 (source)。确保此应用设置粘在插槽中,否则它会传播到生产插槽。
这是 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 $_ }
到目前为止,解决此问题最简单的方法是为您的 Web 作业创建一个单独的 Web 应用程序。只需将 Worker Web App 置于同一个 Azure 服务计划中,您将在同一台计算机上拥有两个单独的 Web 应用程序 运行。
网络应用 网络应用工作者