jenkins - Jenkins 节点离线时发送 Microsoft Teams 消息
问题描述
问题
我需要验证 Jenkins 中工作节点的状态。我需要验证节点是否在线。此外,我需要在节点脱机时发送 Microsoft Teams 消息或 API 调用。我怎样才能在詹金斯做到这一点?
解决方案
团队配置
首先,您需要在 Jenkins 上安装Office 365 连接器插件。
进入您的团队频道并从选项菜单中选择连接器
在连接器屏幕中搜索并单击 Jenkins 连接器上的配置
系统将提示您提供连接器的名称。提供您选择的名称,然后单击创建。在第 2 步中,您将看到一个 Webhook URL。复制该 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"
}
}
您需要将nodeName和webhook变量分别更改为您的节点名称和您从团队复制的 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"
}
}
}
推荐阅读
- android - Android RegistrationId 推送通知
- python - 遍历列表并与嵌套字典进行比较。避免 KeyError - Python
- javascript - Apollo/Express 服务器在 nx.dev 环境中不工作
- python - 为什么我的 pygame 显示几秒钟后没有响应?
- .net - Jenkins Pipeline:readFile 方法正在添加一个“?” 在文件内容的开头
- python - 使用 open cv 检测弧的中心
- amazon-web-services - 属性“队列”不能为空
- c - C中的TCP多用户聊天服务器
- swift - 创建其属性必须满足约束的变量
- php - 如何使用 PayPal Express Payments (PHP)