簡體   English   中英

Jenkins Python API和多配置項目

[英]Jenkins Python API and Multi-Configuration Projects

我在Jenkins中設置了一個多配置項目,我正在嘗試通過命令行腳本來管理這些作業。 我正在嘗試使用jenkinsapi Python模塊。 到目前為止,我已經找到了如何完成工作,但我無法弄清楚如何獲取特定的構建配置以查看它們是否成功。

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

反正有沒有這樣做? 每個多配置項目中的每個項目都是一個單獨的“工作”,還是它們都被歸入同一個工作中? 我將來必須管理很多這類項目,我希望能夠輕松地為構建添加新的硬件配置。

我不認為Python JenkinsAPI適合使用Matrix作業。 通過Groovy插件使用Groovy腳本來使用Jenkins Java API

Matrix類存在於hudson.matrix模塊中。

不太清楚你想要什么,給一些提示。

如果您不清楚API中對象job可以提供哪些信息,可以使用以下方法進行檢查

檢查 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

直接檢查配置 ,單擊foobar作業底部的REST API,您可以直接獲得作業配置,如http://example.org/jenkins/job/foobar/api/json?pretty=true

我發現處理多/矩陣配置的最簡單方法是將其作為一項工作加載。 配置的... / api / python數據與普通作業完全相同。 所以我們可以像對api進行一些更改一樣訪問它。

編輯jenkinsbase.py中的: process_job_folder函數

job.py中的get_full_name_from_url_and_baseurl

編輯api代碼或只是覆蓋功能。 (有點丑,但有效^ _ ^)

我還對名稱的顯示方式做了一些小改動。 這樣命名更符合:jobs,“sub”? 工作和配置

例如:

作業名稱/作業名稱/配置

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM