【问题标题】:Sending Microsoft Teams message when Jenkins node is offlineJenkins 节点离线时发送 Microsoft Teams 消息
【发布时间】:2022-02-16 22:23:41
【问题描述】:

问题

我需要验证 Jenkins 中工作节点的状态。我需要验证节点是否在线。此外,我需要在节点离线时发送 Microsoft Teams 消息或 API 调用。如何在 Jenkins 中完成此任务?

【问题讨论】:

    标签: jenkins groovy jenkins-pipeline microsoft-teams jenkins-groovy


    【解决方案1】:

    团队配置

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

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

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

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

    Jenkins 配置

    现在您有了 Teams Webhook URL,您可以编写您的 Jenkins Pipeline 脚本。请记住,您需要安装 Office 365 Connector 插件。创建一个新的 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 建议使用 Jenkins API 而不是 REST API

    您可能会收到以下错误

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

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

    附加信息

    您还可以通过以下 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"
    }
    

    如果您想从 REST 服务中检索数据,可以使用以下 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"
        }
    }
    

    此示例使用Pipeline Utility Steps 插件、HTTP Request 插件和Office 365 Connector 插件

    多个代理

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

    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"
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 2020-11-10
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多