首页 > 解决方案 > Jenkins 节点离线时发送 Microsoft Teams 消息

问题描述

问题

我需要验证 Jenkins 中工作节点的状态。我需要验证节点是否在线。此外,我需要在节点脱机时发送 Microsoft Teams 消息或 API 调用。我怎样才能在詹金斯做到这一点?

标签: jenkinsgroovyjenkins-pipelinemicrosoft-teamsjenkins-groovy

解决方案


团队配置

首先,您需要在 Jenkins 上安装Office 365 连接器插件。

进入您的团队频道并从选项菜单中选择连接器

团队连接器

在连接器屏幕中搜索并单击 Jenkins 连接器上的配置

在 Teams 中配置 Jenkins

系统将提示您提供连接器的名称。提供您选择的名称,然后单击创建。在第 2 步中,您将看到一个 Webhook URL。复制该 URL,然后滚动到底部并单击完成

团队 Webhook URL

詹金斯配置

现在您有了 Teams Webhook URL,您可以编写您的 Jenkins Pipeline 脚本。请记住,您需要安装Office 365 连接器插件。创建一个新的 Pipeline 并使用以下 Groovy 代码

node {
    
    def nodeName = "EC2 (Integrations) - JDK11 Worker (i-0622e9de9e7aaa70d)"
    def isOnline =  Jenkins.instance.nodes.find { it.name == nodeName }?.computer?.online
    def webhook = "https://domain.webhook.office.com/webhookb2/e68084ea-a0a7-49dfJenkinsCI/1c8caa98-bbb8-43b8-abbe-eda2b45832bd"

    if( !isOnline ) {
        office365ConnectorSend message: "${nodeName} is Offline!", status: "FAILURE", webhookUrl: "${webhook}", color: "d00000"
    }

}

您需要将nodeNamewebhook变量分别更改为您的节点名称和您从团队复制的 webhook URL。感谢@NoamHelmer建议在 REST API 上使用 Jenkins API

您可能会收到以下错误

脚本不允许使用 staticMethod jenkins.model.Jenkins getInstance

要解决此错误,请在 Groovy Sandbox 之外运行管道或批准该脚本签名。

附加信息

您还可以通过以下 REST API 检索节点的离线状态

https://${JENKINS_URL}/computer/${NODE}/api/json

从 GET 请求到此端点的响应正文如下(我已经缩小了响应)

{
    "displayName": "JDK11-EC2-Instance",
    "numExecutors": 2,
    "offline": false,
    "offlineCause": null,
    "offlineCauseReason": "",
    "oneOffExecutors": [],
    "temporarilyOffline": false,
    "absoluteRemotePath": "/home/ec2-user"
}

如果您想从其余服务中检索数据,您可以使用以下 Groovy 脚本来实现

node {

    def nodeName = "EC2 (Integrations) - JDK11 Worker (i-0622e9de9e7aaa70d)"
    def webhook = "https://domain.webhook.office.com/webhookb2/e68084ea-a0a7-49dfJenkinsCI/1c8caa98-bbb8-43b8-abbe-eda2b45832bd"
    def response = httpRequest authentication: 'jenkins-credential-id', url: "https://${env.JENKINS_URL}/computer/${nodeName}/api/json"
    
    def json = readJSON text: response.content
    
    if( json['offline'] ) {
        office365ConnectorSend message: "${nodeName} is Offline!", status: "FAILURE", webhookUrl: "${webhook}", color: "d00000"
    }
}

此示例使用管道实用程序步骤插件、HTTP 请求 插件和Office 365 连接器插件

多个代理

这是一个显示多个代理的代码修改的示例。

node {
    
    def nodeNames = ["EC2 (Integrations) - JDK11 Worker (i-0622e9de9e7aaa70d)", "EC2 (Integrations) - JDK7 Worker (i-1223i1de9e7eea70d)"]
    def webhook = "https://domain.webhook.office.com/webhookb2/e68084ea-a0a7-49dfJenkinsCI/1c8caa98-bbb8-43b8-abbe-eda2b45832bd"

    nodeNames.each{ nodeName ->
        def isOnline =  Jenkins.instance.nodes.find { it.name == nodeName }?.computer?.online

        if( !isOnline ) {
            office365ConnectorSend message: "${nodeName} is Offline!", status: "FAILURE", webhookUrl: "${webhook}", color: "d00000"
        }
    }

}

推荐阅读