Jenkins Python API и мультиконфигурационные проекты
Я создал многоконфигурационный проект в Jenkins и пытаюсь управлять этими заданиями через скрипт командной строки. Я пытаюсь использовать модуль Python jenkinsapi для этого. До сих пор я нашел, как получить мою работу, но я не могу понять, как получить конкретные конфигурации сборки, чтобы увидеть, насколько они успешны.
from jenkinsapi.jenkins import *
jenkins = Jenkins('http://example.org/jenkins')
job = jenkins.get_job('foobar')
# I can get job info here, but I don't know how to access specific configurations
Есть какой-либо способ сделать это? Является ли каждый из проектов с несколькими конфигурациями отдельной "работой" или все они объединены в одну и ту же работу? В будущем мне придется управлять многими проектами такого типа, и я хочу иметь возможность легко добавлять новую конфигурацию оборудования в сборку.
2 ответа
Я не думаю, что Python JenkinsAPI подходит для работы с заданиями Matrix. Используйте скрипты Groovy через плагин Groovy, чтобы подключиться к Java-интерфейсу Jenkins.
Матричные классы живут в модуле hudson.matrix.
Самый простой способ, который я нашел для работы с мульти / матричными конфигурациями, это загрузить его как задание. Данные.../api/python для конфигурации в точности соответствуют обычной работе. Таким образом, мы можем просто получить к нему доступ, как один с несколькими изменениями API.
Отредактируйте функцию:process_job_folder в jenkinsbase.py
и get_full_name_from_url_and_baseurl в job.py
Либо отредактируйте код API, либо просто перезапишите функции. (немного некрасиво, но работает ^_^)
Я также внес небольшое изменение в способ отображения имен. Таким образом, наименование более соответствует: задания, "суб"? задания и конфигурации
например:
Имя работы / Имя работы / Конфигурация
import urlparse
from jenkinsapi import job
from jenkinsapi import jenkins
def process_job_folder(self, folder, folder_path):
folder_path += '/job/%s' % folder['name']
data = self.get_data(self.python_api_url(folder_path),
tree='jobs[name,color]')
result = []
for job in data.get('jobs', []):
if 'color' not in job.keys():
result += self.process_job_folder(job, folder_path)
else:
job['url'] = '%s/job/%s' % (folder_path, job['name'])
## Added to prevent name conflicts
job['name'] = folder['name'] + "/" + job['name']
result.append(job)
## Added configuration support
configData = self.get_data(self.python_api_url(job['url']),
tree='activeConfigurations[name,color,url]')
for config in configData.get("activeConfigurations", []):
config['url'] = '%s/%s' % (job['url'], config["name"])
config["name"] = job['name'] + "/" + config["name"]
result.append(config)
## End of edit
return result
@staticmethod
def get_full_name_from_url_and_baseurl(url, baseurl):
"""
Get the full name for a job (including parent folders) from the
job URL.
"""
path = url.replace(baseurl, '')
split = path.split('/')
## Ignore /job and empty strings
split = [urlparse.unquote(part) for part in split[::] if not part in ["", "job"]]
## End of edit
return '/'.join(split)
jenkins.JenkinsBase.process_job_folder = process_job_folder
job.Job.get_full_name_from_url_and_baseurl = get_full_name_from_url_and_baseurl
def get_server_instance():
jenkins_url = SERVER_URL
server = jenkins.Jenkins(jenkins_url,
username = USERNAME, password = PASSWORD_OR_API_KEY,
ssl_verify=False,
timeout=50)
return server
s = get_server_instance()
for j in s.get_jobs():
print j
*Редактировать:
Теперь вы можете сделать:
s = get_server_instance()
myJobName = "foobar/platform=x64"
j = s.get_job(myJobName)
latestBuild = j.get_last_build()
print "Latest build number: ",latestBuild.get_number()
print "\tLatest build status: ",latestBuild.get_status()
Не очень понятно, чего вы хотите, дайте несколько советов.
Если вам не ясно, какую информацию вы можете получить от объекта job
в API вы можете использовать метод ниже, чтобы проверить
Проверьте исходные коды в github, для вашего случая это job.py, также вы можете использовать python dir()
метод, чтобы увидеть, что вы можете позвонить в job
>>> from jenkinsapi.jenkins import *
>>> jenkins = Jenkins('http://localhost')
>>> job = jenkins.get_job('foobar')
>>> dir(job)
['RETRY_ATTEMPTS', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__get
item__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__s
izeof__', '__str__', '__subclasshook__', '__weakref__', '_buildid_for_type', '_config', '_data', '_element_tree', '_get_
config_element_tree', '_mk_json_from_build_parameters', '_poll', '_revmap', '_scm_map', '_scmbranchmap', '_scmurlmap', '
baseurl', 'delete_from_queue', 'disable', 'enable', 'get_build', 'get_build_dict', 'get_build_ids', 'get_build_triggerur
l', 'get_buildnumber_for_revision', 'get_config', 'get_config_xml_url', 'get_data', 'get_delete_url', 'get_description',
'get_downstream_job_names', 'get_downstream_jobs', 'get_first_build', 'get_first_buildnumber', 'get_jenkins_obj', 'get_
last_build', 'get_last_build_or_none', 'get_last_buildnumber', 'get_last_completed_build', 'get_last_completed_buildnumb
er', 'get_last_failed_buildnumber', 'get_last_good_build', 'get_last_good_buildnumber', 'get_next_build_number', 'get_pa
rams', 'get_params_list', 'get_queue_item', 'get_rename_url', 'get_revision_dict', 'get_scm_branch', 'get_scm_type', 'ge
t_scm_url', 'get_upstream_job_names', 'get_upstream_jobs', 'invoke', 'is_enabled', 'is_queued', 'is_queued_or_running',
'is_running', 'jenkins', 'load_config', 'mk_json_from_build_parameters', 'modify_scm_branch', 'modify_scm_url', 'name',
'poll', 'python_api_url', 'strip_trailing_slash', 'update_config']
>>> print job.get_last_build()
foobar #5
Проверьте конфигурацию напрямую, нажмите REST API внизу вашего foobar
работу, вы можете получить конфигурацию работы непосредственно, как http://example.org/jenkins/job/foobar/api/json?pretty=true