【发布时间】:2022-02-16 22:23:41
【问题描述】:
问题
我需要验证 Jenkins 中工作节点的状态。我需要验证节点是否在线。此外,我需要在节点离线时发送 Microsoft Teams 消息或 API 调用。如何在 Jenkins 中完成此任务?
【问题讨论】:
标签: jenkins groovy jenkins-pipeline microsoft-teams jenkins-groovy
我需要验证 Jenkins 中工作节点的状态。我需要验证节点是否在线。此外,我需要在节点离线时发送 Microsoft Teams 消息或 API 调用。如何在 Jenkins 中完成此任务?
【问题讨论】:
标签: jenkins groovy jenkins-pipeline microsoft-teams jenkins-groovy
首先,您需要在 Jenkins 上安装 Office 365 Connector 插件。
进入您的 Teams 频道并从选项菜单中选择 连接器
在连接器屏幕中搜索并单击 Jenkins 连接器上的配置
系统将提示您提供连接器的名称。提供您选择的名称,然后单击创建。在第 2 步中,您将看到一个 Webhook URL。复制该 URL,然后滚动到底部并点击完成
现在您有了 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"
}
}
您需要将 nodeName 和 webhook 变量分别更改为您的节点名称和您从团队复制的 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"
}
}
}
【讨论】: