def build(jenkins, job, monkeypatch): def fake_get_data(cls, url, params=None, tree=None): # pylint: disable=unused-argument return BUILD_DATA_FAIL monkeypatch.setattr(JenkinsBase, 'get_data', fake_get_data) return Build('http://localhost:800/view/Buildampel/job/Fahrzeug-Server/3119/', 3119, job)
def get_build(self, buildnumber): assert isinstance(buildnumber, int) try: url = self.get_build_dict()[buildnumber] return Build(url, buildnumber, job=self) except KeyError: raise NotFound('Build #%s not found' % buildnumber)
def test_build_depth(self, get_data_mock): Build('http://halob:8080/job/foo/98', 98, self.j, depth=0) get_data_mock.assert_called_with( 'http://halob:8080/job/foo/98/api/' 'python', tree=None, params={'depth': 0})
def build(job, monkeypatch): def fake_poll(cls, tree=None): # pylint: disable=unused-argument return configs.BUILD_DATA monkeypatch.setattr(Build, '_poll', fake_poll) return Build('http://', 97, job)
def get_build_metadata(self, buildnumber): """ Get the build metadata for a given build number. For large builds with tons of tests, this method is faster than get_build by returning less data. """ assert type(buildnumber) == int url = self.get_build_dict()[buildnumber] return Build(url, buildnumber, job=self, depth=0)
def get_build_metadata(self, buildnumber): """ Get the build metadata for a given build number. For large builds with tons of tests, this method is faster than get_build by returning less data. """ assert isinstance(buildnumber, int) try: url = self.get_build_dict()[buildnumber] return Build(url, buildnumber, job=self, depth=0) except KeyError: raise NotFound('Build #%s not found' % buildnumber)
def get_build_result(name, url, number): server = get_server_instance() job = server.get_job(name) try: obj = Build(url, number, job) console = obj.get_console() if obj.is_running(): return console, False, '构建中' elif obj.is_good(): return console, True, '构建成功' else: return console, False, '构建失败' except: return '准备构建中,耐心等待', False, '准备构建中,耐心等待'
def get_build_info(last_number=0): server = _get_server_instance() job = server.get_job('build') last_one_build = job.__dict__['_data']['builds'][last_number] url = last_one_build['url'] number = last_one_build['number'] obj = Build(url, number, job) para = obj.get_params() print(para) repo_name = para['REPO_NAME'] pjt_name = para['PROJECT_NAME'] status = obj.get_status() timestamp = obj.get_timestamp().strftime("%Y-%m-%d %H:%M:%S") return (timestamp, repo_name, pjt_name, number, status)
def run_jenkins_job(phrase): job_name = JOBS_MAPPING.get(phrase, None) if job_name is None: return "任务不存在" try: server = Jenkins(JENKINS_URL, username=JENKINS_USER, password=JENKINS_PASS) except HTTPError as ex: return "jenkins连接出错: %s" % ex job = server[job_name] job_buildid = server.get_job(job_name).get_next_build_number() run_job = job.invoke() time.sleep(10) # 查看任务状态 url = f'''{job.baseurl}/{job_buildid}/''' obj = Build(url, job_buildid, job) obj.block() # obj 只是获取当时的任务状态,所以需要等待任务执行完,再获取一次状态 obj = Build(url, job_buildid, job) result = f'''{phrase}完成, 任务名称: {obj.name}, 执行结果:{obj.get_status()}, 耗时: {obj.get_duration().total_seconds()}秒''' return result
def get_job_buildhistory(self, jobname): server = self.get_server_instance() job = server[jobname] data = job.__dict__['_data']['builds'] job_build_list = [] for i in data: job_build_dic = {} lll = Build(i['url'], i['number'], job) lll_dic = lll.get_data(i['url'] + 'api/python/') timest = lll_dic['timestamp'] / 1000 job_build_dic['buildtime'] = time.strftime("%Y-%m-%d", time.localtime(timest)) job_build_dic['status'] = lll_dic['result'] job_build_dic['buildnum'] = lll_dic['number'] job_build_list.append(job_build_dic) return job_build_list
def create_build_json(job, buildnumber, monkeypatch): def fake_get_data(cls, url, params=None, tree=None): # pylint: disable=unused-argument return { "_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun", "actions": [], "artifacts": [], "building": False, "description": None, "displayName": "#3119", "duration": 1208714, "estimatedDuration": 749457, "executor": None, "fullDisplayName": "Fahrzeug-Server #3119", "id": "3119", "keepLog": False, "number": buildnumber, "queueId": 52737, "result": "UNSTABLE", "timestamp": 1583495750710, # 03/06/2020 @ 11:55am (UTC) "url": "http://localhost:800/view/Buildampel/job/Fahrzeug-Server/3119/", "changeSets": [], "culprits": [], "nextBuild": { "number": 3120, "url": "http://localhost:800/view/Buildampel/job/Fahrzeug-Server/3120/" }, "previousBuild": { "number": 3112, "url": "http://localhost:800/view/Buildampel/job/Fahrzeug-Server/3112/" } } monkeypatch.setattr(JenkinsBase, 'get_data', fake_get_data) #build.get_data = mock.MagicMock(return_value=fake_get_data) return Build( 'http://localhost:800/view/Buildampel/job/Fahrzeug-Server/3119/', buildnumber, job)
def setUp(self, _poll): _poll.return_value = self.DATA self.j = mock.MagicMock() # Job self.j.name = 'FooJob' self.b = Build('http://', 97, self.j)
def build_with_diff_baseurl(job_with_diff_baseurl, monkeypatch): def fake_poll(cls, tree=None): # pylint: disable=unused-argument return configs.BUILD_DATA monkeypatch.setattr(Build, '_poll', fake_poll) return Build('http://localhost', 97, job_with_diff_baseurl)
def get_build(self, buildnumber): assert type(buildnumber) == int url = self.get_build_dict()[buildnumber] return Build(url, buildnumber, job=self)
def test_build_depth(self, get_data_mock): build = Build('http://halob:8080/job/foo/98', 98, self.j, depth=0) get_data_mock.assert_called_with( 'http://halob:8080/job/foo/98/api/python?depth=0')
def get_build(self, buildnumber): assert isinstance(buildnumber, int) url = self.get_build_dict()[buildnumber] return Build(url, buildnumber, job=self)
def watch_jenkins_job(args, settings, **kwargs): from jenkinsapi.jenkins import Jenkins from jenkinsapi.jenkins import JenkinsBase from jenkinsapi.build import Build from jenkinsapi.utils.requester import Requester try: from urllib.parser import urlparse except ImportError: from urlparse import urlparse parser = argparse.ArgumentParser() parser.add_argument('url', type=str, nargs=1, help='Jenkins URL to watch') parser.add_argument( '--sleep-interval', dest='sleep_interval', default=30, type=int, help='Amount of time to sleep', ) parser.add_argument('--retries', dest='retries', default=25, type=int, help='Number of times to re-poll Jenkins') options = parser.parse_args(args) class NoVerifyRequester(Requester): def get_request_dict(self, *args, **kwargs): request_dict = super(NoVerifyRequester, self).get_request_dict(*args, **kwargs) request_dict['verify'] = False return request_dict def get_job_name_and_build_number(url): job_build_matcher = re.compile( ".*/job/(?P<job>[^/]+)/(?P<build_number>[^/]+)/.*") job, build_no = job_build_matcher.search(url).groups() return job, int(build_no) def get_formal_build_url(jenkins_url, job_name, build_no): return os.path.join(jenkins_url, 'job', job_name, str(build_no)) def get_jenkins_base_url(url): parsed = urlparse(url) return parsed.scheme + '://' + parsed.netloc job_name, build_no = get_job_name_and_build_number(options.url[0]) jenkins_url = get_jenkins_base_url(options.url[0]) formal_build_url = get_formal_build_url(jenkins_url, job_name, build_no) try: jenkins = Jenkins(jenkins_url, requester=NoVerifyRequester()) job = jenkins[job_name] job.RETRY_ATTEMPTS = options.retries build = Build(formal_build_url, build_no, job) while True: if not build.is_running(): if build.is_good(): send_flash_message( settings.device_url, { 'message': 'Jenkins job %s:%s succeeded' % ( job_name, build_no, ), 'blink': [(0, 255, 0), (0, 0, 0)], 'timeout': 20, }) logger.warn( 'Job %s succeeded', formal_build_url, ) else: send_flash_message( settings.device_url, { 'message': 'Jenkins job %s:%s failed (%s)' % (job_name, build_no, build.get_status()), 'blink': [(255, 0, 0), (0, 0, 0)], 'timeout': 20, }) logger.warn( 'Job %s failed', formal_build_url, ) sys.exit(0) time.sleep(options.sleep_interval) except Exception as e: logger.exception(e)
def __init__(self, jobname, buildnum, **kwargs): super().__init__(**kwargs) for i in self.server[jobname].__dict__['_data']['builds']: if i['number'] == buildnum: self.obj = Build(i['url'], i['number'], self.server[jobname]) break
def get_last_build(self): """ Get the last build """ buildinfo = self._data["lastBuild"] return Build(buildinfo["url"], buildinfo["number"], job=self)