在 Azure Devops 中部署管道后暂存槽的 Web 作业未停止

Posted

技术标签:

【中文标题】在 Azure Devops 中部署管道后暂存槽的 Web 作业未停止【英文标题】:Webjob of staging slot not stopping after a pipeline deploy in Azure Devops 【发布时间】:2022-01-02 03:57:53 【问题描述】:

在我对包含 2 个插槽(productionstaging 插槽)的 App Service 资源进行的一些部署中,在交换插槽后,暂存网络作业不会停止。

基本上我的管道中有以下任务:

## Start App Service (staging)
- task: AzureAppServiceManage@0
  displayName: 'Start Azure App Service: some-app-webjob (staging)'
  inputs:
    azureSubscription: 'xxx'
    Action: 'Start Azure App Service'
    WebAppName: 'some-app-webjob'
    SpecifySlotOrASE: true
    ResourceGroupName: 'some-rg-app-webjob'
    Slot: staging
##Start staging continuous webjob
- task: AzureAppServiceManage@0
  displayName: 'Start all continuous webjobs: some-app-webjob (staging)'
  inputs:
    azureSubscription: 'Subscrição do Visual Studio Enterprise(c9f20c2b-15cf-41fb-8122-ddf095c6db02)'
    Action: 'Start all continuous webjobs'
    WebAppName: 'some-app-webjob'
    SpecifySlotOrASE: true
    ResourceGroupName: 'some-rg-app-webjob'
    Slot: 'staging'

## Swap Slots (staging to production)
- task: AzureAppServiceManage@0
  displayName: 'Swap Slots: some-app-webjob'
  inputs:
    azureSubscription: 'xxx'
    WebAppName: 'some-app-webjob'
    ResourceGroupName: 'some-rg-app-webjob'
    SourceSlot: staging
    TargetSlot: production

# Stop WebJobs running Staging
- task: AzureAppServiceManage@0
  displayName: 'Stop all continuous webjobs: some-app-webjob (staging)'
  inputs:
    azureSubscription: 'xxx'
    Action: 'Stop all continuous webjobs'
    WebAppName: 'some-app-webjob'
    SpecifySlotOrASE: true
    ResourceGroupName: 'some-rg-app-webjob'
    Slot: staging
    
## Stop App Service (staging)
- task: AzureAppServiceManage@0
  displayName: 'Stop Azure App Service: some-app-webjob (staging)'
  inputs:
    azureSubscription: 'xxx'
    Action: 'Stop Azure App Service'
    WebAppName: 'some-app-webjob'
    SpecifySlotOrASE: true
    ResourceGroupName: 'some-rg-app-webjob'
    Slot: staging

如果我查看我的插槽暂存应用程序服务将停止。但有时工作作业会继续运行,而它不应该运行。因为我有一项任务应该在与生产交换后的所有连续网络作业中排在首位。

总而言之,这可能会发生:

插槽分段运行中的连续 Web 作业 插槽生产运行中的连续网络作业

经过搜索,我找到了这个 github 线程 https://github.com/projectkudu/kudu/issues/1886 它表示 webjobs 正在 scm 站点中运行,不受停止站点命令的影响。 不过,我有一个任务据说会停止所有连续的网络作业。

发生这种情况有什么原因吗?我们怎样才能防止这种情况发生? 我不希望在部署后运行旧代码的网络作业。

【问题讨论】:

【参考方案1】:

要在停止状态下部署连续 WebJob,只需在 WebJob(二进制文件)的根目录中添加一个名为 disable.job 的文件,这将告诉框架 WebJob 当前已停止。

您可以将应用程序设置WEBJOBS_STOPPED 添加到暂存槽并将其设置为1(在天蓝色门户中)。将此设置设为“Slot Setting”,以免与生产交换。

当您将源槽(暂存)交换到目标槽(生产)时会发生这种情况。

首先,Staging 站点需要对标记为“插槽”的应用设置和连接字符串进行一些设置更改。还可能需要应用与源代码控制相关的其他更改。 这会导致暂存站点重新启动,这很好。

接下来,暂存站点通过将请求发送到其根路径(即“/”)并等待其完成来预热。

现在暂存站点是温暖的,它被交换到生产中。没有停机时间,因为它直接从一个温暖的站点到另一个站点。

最后,曾经是 Production 而现在是 Staging 的网站也需要应用一些设置,导致它重新启动。同样,这很好,因为它发生在临时站点中。

我不希望在部署后运行旧代码的网络作业。

检查您是否有舞台环境(将 -stage 添加到 Webapp 名称),如果有,请进入 Azure 管理门户并停止它们。

仅停止 Webapp 是不够的,您必须直接停止 WebJobs。这是在 Settings->WebJobs 下完成的(在新门户中),然后右键单击 webjobs 名称选择停止。

详情请咨询Azure Web Apps (Websites) Deployment Slots。

【讨论】:

你好 @HarshithaVeeramalla-MT 我认为标志 WEBJOBS_STOPPED 是一个很好的解决方案,适用于暂存槽。它是否优雅地停止了被交换的网络作业? 请参考Manage WebJobs WEBJOB_STOPPED 值为 1 以停止在您的站点上运行的所有 WebJobs。这可以很方便地防止冲突的 WebJobs 在暂存槽和生产槽中运行。 感谢我已经阅读了它,但它似乎并没有明确说明它如何停止连续的网络作业。它只是说它停止了,我想它会杀死进程。 对于连续,您只需将一个名为“disable.job”的文件放在WebJob目录的根目录中即可。

以上是关于在 Azure Devops 中部署管道后暂存槽的 Web 作业未停止的主要内容,如果未能解决你的问题,请参考以下文章

访问 Azure 应用服务暂存槽 URL 时出现 HTTP 错误 401

Azure 交换部署槽粘性设置不起作用

如何将发布 ID 和内部版本号提取到我的 Azure DevOps 部署的 PHP 应用程序中

在 Azure DevOps 管道中为 WebApp 创建部署槽

用于 Linux 操作系统的 azure devops 发布管道中的自动化 SQL 部署任务

Azure Databricks 的 Azure DevOps 管道