【问题标题】:Jenkins Python API and Multi-Configuration ProjectsJenkins Python API 和多配置项目
【发布时间】:2012-05-21 14:26:12
【问题描述】:

我已经在 J​​enkins 中建立了一个多配置项目,我正在尝试通过命令行脚本管理这些作业。我正在尝试为此使用 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 jenkins multi-configuration


【解决方案1】:

我认为 Python JenkinsAPI 不适合处理 Matrix 作业。通过Groovy Plugin 使用Groovy 脚本来接入Jenkins Java API

矩阵类位于hudson.matrix 模块中。

【讨论】:

  • 这可以使用远程 API 吗?还是远程 API 无法处理矩阵作业?
  • 配置运行信息可远程访问(可以在浏览器http://[jenkins_server]/api/xml查看(个别配置运行在/hudson/job/build/run下)。JenkinsAPI不处理它AFAIK(当然,您可以自己添加)。无论如何,该信息是“事后” - 在构建之后。通过Groovy访问Jenkins必须通过在该Jenkins上运行的工作完成。但是,那个作业(或作业)可以通过参数等远程管理。
【解决方案2】:

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

如果不清楚可以从 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一样直接获取作业配置

【讨论】:

    【解决方案3】:

    我发现处理多/矩阵配置的最简单方法是将其作为作业加载。配置的 .../api/python 数据与普通作业完全相同。所以我们可以像访问它一样访问它,只需对 api 进行一些更改。

    编辑: jenkinsbase.py 中的 process_job_folder 函数

    get_full_name_from_url_and_baseurl 在 job.py 中

    要么编辑 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 2012-01-23
      • 2015-09-16
      • 2014-09-26
      • 2012-09-18
      • 2011-12-25
      • 1970-01-01
      相关资源
      最近更新 更多