在 Azure Devops 中部署管道后暂存槽的 Webjob 不会停止

Webjob of staging slot not stopping after a pipeline deploy in Azure Devops

在我对包含 2 个插槽(productionstaging 插槽)的 App Service 资源进行的一些部署中,暂存的 webjob 在之后没有停止插槽的交换。

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

## 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

如果我去查看我的插槽暂存应用程序服务已停止。但有时工作会保持 运行 而它不应该保持。因为我有一个任务应该在与生产交换后排在所有连续的网络作业之上。

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

搜索后我找到了这个 github 话题 https://github.com/projectkudu/kudu/issues/1886 它表明 scm 站点中的 webjobs 运行 不受停止站点命令的影响。 不过,我有一个任务应该会停止所有连续的网络作业。

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

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

您可以将应用程序设置 WEBJOBS_STOPPED 添加到暂存槽并将其设置为 1(在 Azure 门户中)。进行此设置 'Slot Setting' 以便它不会与生产交换。

这是将源插槽(暂存)交换到目标插槽(生产)时发生的情况。

  • 首先,登台站点需要对标记为 'slot' 的应用程序设置和连接字符串进行一些设置更改。还可能需要应用与源代码管理相关的其他更改。 这会导致暂存站点重新启动,这很好。

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

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

  • 最后,以前是Production现在是Staging的站点也需要应用一些设置,导致它重新启动。同样,这很好,因为它发生在暂存站点中。

I don't want an webjob with old code running after a deploy.

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

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

详情请参考Azure Web Apps (Websites) Deployment Slots