定时监控节点在线状态 + 常用命令片段
July 24, 2024About 2 min
定时监控节点在线状态 + 常用命令片段
构建农场节点多了,总有机器悄悄掉线。下面是一个用 Python 定时巡检、掉线就发邮件的做法,外加几段常在构建步骤里用到的 Git / PowerShell 命令。
定时监控节点是否在线
思路:建一个 Freestyle job,定时触发,用 jenkinsapi 逐个检查节点在线状态,有节点掉线就让 job 失败并触发邮件通知。
环境:Python 3、Jenkins、email-ext 插件、python 插件。先在 master 上 pip install jenkinsapi。
配置参数
jenkinsURL:Jenkins 根地址。jenkinsUser:管理员用户名。jenkinsPWD:管理员密码(用 Password Parameter 类型,别用明文 string)。jenkinsNodeList:所有「应该在线」的节点名,逗号分隔。
不想让密码出现在日志里,且多个用户共用同一密码时,可以用
envinject插件注入。
把 master 设为节点并配触发器
让这个巡检 job 跑在 master 上,配定时触发(比如每几分钟一次)。
构建步骤选 "Execute Python script"
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from os import getenv
from sys import exit
from jenkinsapi.jenkins import Jenkins
def is_online(jenkins, node):
if not jenkins.get_node(node).is_online():
print(f"{node} offline")
return False
print(f"{node} online")
return True
jenkinsURL = getenv("jenkinsURL")
jenkinsUser = getenv("jenkinsUser")
jenkinsPWD = getenv("jenkinsPWD")
jenkinsNodeList = getenv("jenkinsNodeList").split(',')
J = Jenkins(jenkinsURL, jenkinsUser, jenkinsPWD)
flag = True
for node in jenkinsNodeList:
flag = is_online(J, node) and flag
if not flag:
exit(1) # 有节点不在线就让脚本/job 失败
job 失败时用 Jelly 模板发邮件
在 master 上找到 email-ext 插件的 jar(类似 C:\Users\jenkins\.jenkins\plugins\email-ext\WEB-INF\lib\email-ext.jar),解压取出内置 jelly 模板;然后在 job 的邮件配置里把内容设成:
${JELLY_SCRIPT,template="html"}
job 失败(=有节点掉线)时就会发出带节点状态的 HTML 邮件。
Git:把提交信息写进文件
构建时常要把当前代码的 Git 信息落到工作区文件里,后续步骤或邮件再读:
echo GIT_URL:%GIT_URL% > %WORKSPACE%\GitCommit.txt
echo GIT_BRANCH:%GIT_BRANCH% >> %WORKSPACE%\GitCommit.txt
echo GIT_COMMIT:%GIT_COMMIT% >> %WORKSPACE%\GitCommit.txt
cd /d %WORKSPACE%
for /f "delims=" %%s in ('git log -1 --pretty^="%%s"') do (
echo Git_Message::%%s >> %WORKSPACE%\GitCommit.txt
)
PowerShell:把只读文件改成可写
同步下来的文件常带只读属性(比如 P4 没 checkout 的文件),改之前先去掉只读:
$file = Get-Item "${env:WORKSPACE}\UnrealEngine\Engine\Build\Build.version"
$file.isReadOnly = $false