使用Jenkins REST API将Jenkins节点暂时标记为脱机

2024-09-30 16:37:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个Jenkins矩阵作业,它在许多从节点上并行测试我们软件的几个变体。有时候,其中一个奴隶会崩溃,必须重新启动。在这种情况下,我不想跳过这一步。我不想将特定的从属节点标记为underlineg脚本暂时不可用,该脚本检测到崩溃,然后重新启动节点。我发现,这应该可以通过Jenkins restapi实现。我找到了两个python库,它们应该可以完成这项工作;https://python-jenkins.readthedocs.org/en/latest/index.html和{a2}。但是这两个库都有问题,无法用python3.4.3更改我的Jenkins 1.580.2系统(获取信息不是问题)。在

詹金萨皮:

from jenkinsapi.jenkins import Jenkins
from jenkinsapi.utils.requester import Requester

class SSLRequester(Requester):
    def __init__(self, username=None, password=None):
        super(SSLRequester, self).__init__(username, password)

   def get_request_dict(self, *largs, **kwargs):
        requestKWargs = super(SSLRequester, self).get_request_dict(*largs, **kwargs)
        requestKWargs['verify'] = False
        return requestKWargs 

jenkins = Jenkins(jenkinsurl, username, password, requester=SSLRequester())

我必须使用一个自定义sslRequest,因为我的Jenkins服务器使用https://连接,否则我将收到以下错误

SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)

好吧,如果我试图用jenkins对象获取一些信息,一切都很好。在

^{pr2}$

但如果我尝试切换节点,则会收到以下消息:

node.toggle_temporarily_offline()

JenkinsAPIException: Operation failed. url=https:///computer//toggleOffline?offlineMessage=requested%20from%20jenkinsapi, data={}, headers={'Content-Type': 'application/x-www-form-urlencoded'}, status=403, text=b"%2FtoggleOffline%3FofflineMessage%3Drequested%2520from%2520jenkinsapi'/>window.location.replace('/login?from=%2Fcomputer%2F%2FtoggleOffline%3FofflineMessage%3Drequested%2520from%2520jenkinsapi');\n\n\nAuthentication required\n\n\n

我的登录数据被完全忽略。在

python jenkins:

import jenkins
j = jenkins.Jenkins(jenkinsurl, username, password)
j.disable_node(slavenode)

TypeError: the JSON object must be str, not 'bytes'

在谷歌搜索了一小段时间后,我发现我必须修补这个库,因为JSON不喜欢bytearray,而bytearray是由Jenkins JSON API提供的。在插入几个decode('utf-8')语句之后,我能够调用以下语句:

j.get_node_info(slavenode)

但我还是没能把它标记为离线:

j.disable_node(slavenode)

TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.

所以,把它归结为一个简单的问题。您是否知道其他一些方便、可编写脚本的方法来将节点标记为暂时脱机(如果重新启动成功,当然还会再次标记为联机)?我更喜欢python解决方案,因为我从python脚本触发重新启动。但是groovy脚本也足够好了。在

提前谢谢你的帮助


Tags: fromhttps标记importself脚本nodeget
1条回答
网友
1楼 · 发布于 2024-09-30 16:37:37

您可以查看script console,在那里可以测试脚本。您也可以使用curl或CLI调用这些脚本,我想象一个python库

这是groovy脚本查看nodes并删除节点的一个很好的示例

for (aSlave in hudson.model.Hudson.instance.slaves) {
  println('====================');
  println('Name: ' + aSlave.name);
  println('getLabelString: ' + aSlave.getLabelString());
  println('getNumExectutors: ' + aSlave.getNumExecutors());
  println('getRemoteFS: ' + aSlave.getRemoteFS());
  println('getMode: ' + aSlave.getMode());
  println('getRootPath: ' + aSlave.getRootPath());
  println('getDescriptor: ' + aSlave.getDescriptor());
  println('getComputer: ' + aSlave.getComputer());
  println('\tcomputer.isAcceptingTasks: ' + aSlave.getComputer().isAcceptingTasks());
  println('\tcomputer.isLaunchSupported: ' + aSlave.getComputer().isLaunchSupported());
  println('\tcomputer.getConnectTime: ' + aSlave.getComputer().getConnectTime());
  println('\tcomputer.getDemandStartMilliseconds: ' + aSlave.getComputer().getDemandStartMilliseconds());
  println('\tcomputer.isOffline: ' + aSlave.getComputer().isOffline());
  println('\tcomputer.countBusy: ' + aSlave.getComputer().countBusy());
  //if (aSlave.name == 'NAME OF NODE TO DELETE') {
  //  println('Shutting down node!!!!');
  //  aSlave.getComputer().setTemporarilyOffline(true,null);
  //  aSlave.getComputer().doDoDelete();
  //}
  println('\tcomputer.getLog: ' + aSlave.getComputer().getLog());
  println('\tcomputer.getBuilds: ' + aSlave.getComputer().getBuilds());
}

相关问题 更多 >