Devops 关闭服务

Devops Shutdown services

我正在尝试在管道上的 DevOps 中找到一种方法,以便能够在安全的情况下关闭 Windows 服务。 例如。我们有一项服务 运行 不断,但有时我们需要优雅地关闭它,我们通过 MSSQL 通过将 table 中的某些内容设置为 true 来做到这一点,然后该服务将优雅地关闭其连接,然后将更新 table 表示可以停止服务,手动这没问题,但我们希望通过 DevOps 管道发布

自动化该过程

所以我的想法是:

  1. 在 table 上发送更新设置命令以设置为真以便可以关闭
  2. 监控 table 直到它有使用 where name = service name
  3. 的服务行
  4. 从 PowerShell 或管道发送命令以表示可以关闭服务

1 和 3 看起来很简单,但是对于我来说,我似乎无法弄清楚如何不断检查 table 直到它有一行

我发现我可以做到

SELECT CASE WHEN EXISTS(SELECT 1 FROM ShutdownLog WHERE Name = 'ServiceName') THEN 0 ELSE 1 END AS IsEmpty;

这基本上显示一次是空的,但是我如何循环这个查询直到它有数据?

我的计划是 运行 执行选项 1 的存储过程,然后 运行 循环选项 2 然后 return 如果满足则为真,然后在 DevOps 中我将发送一个命令存储过程以查看 if = true 我猜..

您可以使用 powershell Invoke-Sqlcmd (documentation)

使用以下查询:

UPDATE Table
    SET Column = 'True'
Where Name = 'StopService'

等待查询:

 -- Loop until there is a row with value = 'ServiceName'

DECLARE @ServiceName VARCHAR(100) = 'YourServiceName'
DECLARE @Index INT = 0
DECLARE @MaxTries INT = 10

WHILE NOT EXISTS (SELECT 1 FROM ShutdownLog WHERE Name = @ServiceName)
BEGIN
    
    IF @Index > @MaxTries
    BEGIN
        SELECT 'Max retries exceeded' as Message
        BREAK;
    END

    -- sleep for 10 Seconds
    WAITFOR DELAY '00:00:10'
    SET @Index = @Index + 1
END

SELECT CONCAT(@ServiceName, ' was stopped')  as Message

您可以尝试 Azure Functions,Azure Functions 是一种事件驱动的按需计算体验,它扩展了现有的 Azure 应用程序平台,具有实现由 Azure 或第三方服务中发生的事件触发的代码的功能以及本地系统。 Azure Functions 允许开发人员通过连接到数据源或消息传递解决方案来采取行动,从而使处理和响应事件变得容易。

我们可以使用 Azure 函数绑定存储队列消息轻松做到这一点。

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue-trigger?tabs=csharp