使用 rest api 调用使用 python 创建新的 jenkins slave



我正在使用python自动化我们的Jenkins奴隶创建过程,我正在设计一个函数,该函数将从属名称和json文件作为输入,并在我的Jenkins实例中创建一个新的Jenkins从属。

我遇到了一个 Jenkins 文档,其中谈到了这一点,我有一个有效的 bash 脚本来做到这一点。但我的要求是一个python脚本。我的 bash 脚本有效,但当我将其转换为 python 时它不起作用。有人可以在这里帮助我吗?

这是我的bashpython脚本。

#!/bin/bash
export JENKINS_URL=https://jenkins.domain.com
export JENKINS_USER=<user>
export JENKINS_API_TOKEN=<api>
export NODE_NAME=testnode_sep17
export JSON_OBJECT="{ 'name':+'${NODE_NAME}',+'nodeDescription':+'Linux+slave',+'numExecutors':+'5',+'remoteFS':+'/home/jenkins/agent',+'labelString':+'SLAVE-DOCKER+linux',+'mode':+'EXCLUSIVE',+'':+['hudson.slaves.JNLPLauncher',+'hudson.slaves.RetentionStrategy$Always'],+'launcher':+{'stapler-class':+'hudson.slaves.JNLPLauncher',+'$class':+'hudson.slaves.JNLPLauncher',+'workDirSettings':+{'disabled':+true,+'workDirPath':+'',+'internalDir':+'remoting',+'failIfWorkDirIsMissing':+false},+'tunnel':+'',+'vmargs':+'-Xmx1024m'},+'retentionStrategy':+{'stapler-class':+'hudson.slaves.RetentionStrategy$Always',+'$class':+'hudson.slaves.RetentionStrategy$Always'},+'nodeProperties':+{'stapler-class-bag':+'true',+'hudson-slaves-EnvironmentVariablesNodeProperty':+{'env':+[{'key':+'JAVA_HOME',+'value':+'/docker-java-home'},+{'key':+'JENKINS_HOME',+'value':+'/home/jenkins'}]},+'hudson-tools-ToolLocationNodeProperty':+{'locations':+[{'key':+'hudson.plugins.git.GitTool$DescriptorImpl@Default',+'home':+'/usr/bin/git'},+{'key':+'hudson.model.JDK$DescriptorImpl@JAVA-8',+'home':+'/usr/bin/java'},+{'key':+'hudson.tasks.Maven$MavenInstallation$DescriptorImpl@MAVEN-3.5.2',+'home':+'/usr/bin/mvn'}]}}}"
curl -L -s -o /dev/null -v -k -w "%{http_code}" -u "${JENKINS_USER}:${JENKINS_API_TOKEN}" -H "Content-Type:application/x-www-form-urlencoded" -X POST -d "json=${JSON_OBJECT}" "${JENKINS_URL}/computer/doCreateItem?name=${NODE_NAME}&type=hudson.slaves.DumbSlave"

这是 Python 脚本

#!/usr/bin/python
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
}
params = (
('name', 'test_sep17_TBR'),
('type', 'hudson.slaves.DumbSlave'),
)
#data = {
# 'json': 'file.json'
#}
data = open('my_file.json', 'rb').read()
response = requests.post('http://jenkins.domain.com/computer/doCreateItem', headers=headers, params=params, data=data, verify=False, auth=('user', 'xxxxxxxxxxxxxx'))
print(response.text)

my_file.json 具有以下数据

{ 'name':+'${NODE_NAME}',+'nodeDescription':+'Linux+slave',+'numExecutors':+'5',+'remoteFS':+'/home/jenkins/agent',+'labelString':+'SLAVE-DOCKER+linux',+'mode':+'EXCLUSIVE',+'':+['hudson.slaves.JNLPLauncher',+'hudson.slaves.RetentionStrategy$Always'],+'launcher':+{'stapler-class':+'hudson.slaves.JNLPLauncher',+'$class':+'hudson.slaves.JNLPLauncher',+'workDirSettings':+{'disabled':+true,+'workDirPath':+'',+'internalDir':+'remoting',+'failIfWorkDirIsMissing':+false},+'tunnel':+'',+'vmargs':+'-Xmx1024m'},+'retentionStrategy':+{'stapler-class':+'hudson.slaves.RetentionStrategy$Always',+'$class':+'hudson.slaves.RetentionStrategy$Always'},+'nodeProperties':+{'stapler-class-bag':+'true',+'hudson-slaves-EnvironmentVariablesNodeProperty':+{'env':+[{'key':+'JAVA_HOME',+'value':+'/docker-java-home'},+{'key':+'JENKINS_HOME',+'value':+'/home/jenkins'}]},+'hudson-tools-ToolLocationNodeProperty':+{'locations':+[{'key':+'hudson.plugins.git.GitTool$DescriptorImpl@Default',+'home':+'/usr/bin/git'},+{'key':+'hudson.model.JDK$DescriptorImpl@JAVA-8',+'home':+'/usr/bin/java'},+{'key':+'hudson.tasks.Maven$MavenInstallation$DescriptorImpl@MAVEN-3.5.2',+'home':+'/usr/bin/mvn'}]}}}

当我运行 bash 脚本时,会创建从属服务器。 但是当我运行我的python scrit时,我得到的错误是

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Error 400 This page expects a form submission</title>
</head>
<body><h2>HTTP ERROR 400</h2>
<p>Problem accessing /computer/doCreateItem. Reason:
<pre>    This page expects a form submission</pre></p><hr><i><small>Powered by Jetty://</small></i><hr/>
</body>
</html>

编辑:我可以使用python jenkins模块来创建奴隶,但我不想使用它

花了几个小时后,我发现了我们都错过的东西:

-d "json=${JSON_OBJECT}">

这意味着它正在发布一个字符串,所以在 python 中你需要:

requests.post(url, data=f'json={json.dumps(postdata)}', headers=headers)

最新更新