def test_update_build_target_status(self): build_target = BuildTarget("PHID-HMBT-1234") # With no builds queued, default to pass self.phab.update_build_target_status(build_target) self.phab.harbormaster.sendmessage.assert_called_with( buildTargetPHID=build_target.phid, type="pass") # Queue a build build_target.queue_build("build-1", "build-name") self.phab.update_build_target_status(build_target) self.phab.harbormaster.sendmessage.assert_called_with( buildTargetPHID=build_target.phid, type="work") # Test various statuses self.phab.update_build_target_status(build_target, "build-1", BuildStatus.Queued) self.phab.harbormaster.sendmessage.assert_called_with( buildTargetPHID=build_target.phid, type="work") self.phab.update_build_target_status(build_target, "build-1", BuildStatus.Running) self.phab.harbormaster.sendmessage.assert_called_with( buildTargetPHID=build_target.phid, type="work") self.phab.update_build_target_status(build_target, "build-1", BuildStatus.Failure) self.phab.harbormaster.sendmessage.assert_called_with( buildTargetPHID=build_target.phid, type="fail") self.phab.update_build_target_status(build_target, "build-1", BuildStatus.Success) self.phab.harbormaster.sendmessage.assert_called_with( buildTargetPHID=build_target.phid, type="pass")
def test_buildTarget(self): build_target_phid = "PHID-HMBT-123456" # Create a build target build_target = BuildTarget(build_target_phid) # With no builds, the target has default status of success self.assertEqual(build_target.status(), BuildStatus.Success) self.assertEqual(build_target.is_finished(), True) # Queue a few builds for i in range(10): name = "build-{}".format(i) build_target.queue_build(i, name) self.assertEqual(len(build_target.builds), i + 1) self.assertEqual(build_target.builds[i].status, BuildStatus.Queued) self.assertEqual(build_target.status(), BuildStatus.Queued) self.assertEqual(build_target.is_finished(), False) # Update the status of a single build to running, the build target # should be running build_target.update_build_status(3, BuildStatus.Running) self.assertEqual(build_target.builds[3].status, BuildStatus.Running) self.assertEqual(build_target.status(), BuildStatus.Running) self.assertEqual(build_target.is_finished(), False) # If all the builds are finished with success, the build target is also # finished with success. Check it is running until the last one... build_ids = list(build_target.builds.keys()) for build_id in build_ids[:-1]: build_target.update_build_status(build_id, BuildStatus.Success) self.assertEqual(build_target.builds[build_id].status, BuildStatus.Success) self.assertEqual(build_target.status(), BuildStatus.Running) self.assertEqual(build_target.is_finished(), False) # ... which will change the state to finished/success. build_id = build_ids[-1] build_target.update_build_status(build_id, BuildStatus.Success) self.assertEqual(build_target.builds[build_id].status, BuildStatus.Success) self.assertEqual(build_target.status(), BuildStatus.Success) self.assertEqual(build_target.is_finished(), True) # If a single build fails, the build target should fail build_target.update_build_status(3, BuildStatus.Failure) self.assertEqual(build_target.builds[3].status, BuildStatus.Failure) self.assertEqual(build_target.status(), BuildStatus.Failure) self.assertEqual(build_target.is_finished(), True) # All the builds are finished and successful excepted one which remains # queued: the build target should be running and not finished build_target.update_build_status(3, BuildStatus.Queued) self.assertEqual(build_target.builds[3].status, BuildStatus.Queued) self.assertEqual(build_target.status(), BuildStatus.Running) self.assertEqual(build_target.is_finished(), False)
def build_diff(): def get_mandatory_argument(argument): value = request.args.get(argument, None) if value is None: raise AssertionError( "Calling /buildDiff endpoint with missing mandatory argument {}:\n{}".format( argument, request.args ) ) return value staging_ref = get_mandatory_argument('stagingRef') target_phid = get_mandatory_argument('targetPHID') # Get the configuration from master config = yaml.safe_load(phab.get_file_content_from_master( "contrib/teamcity/build-configurations.yml")) # Get a list of the builds that should run on diffs builds = [ k for k, v in config.get( 'builds', {}).items() if v.get( 'runOnDiff', False)] if target_phid in create_server.diff_targets: build_target = create_server.diff_targets[target_phid] else: build_target = BuildTarget(target_phid) for build_name in builds: properties = [{ 'name': 'env.ABC_BUILD_NAME', 'value': build_name, }] build_id = tc.trigger_build( 'BitcoinABC_BitcoinAbcStaging', staging_ref, target_phid, properties)['id'] build_target.queue_build(build_id, build_name) create_server.diff_targets[target_phid] = build_target return SUCCESS, 200
def build(): buildTypeId = request.args.get('buildTypeId', None) ref = request.args.get('ref', 'refs/heads/master') PHID = request.args.get('PHID', None) abcBuildName = request.args.get('abcBuildName', None) properties = None if abcBuildName: properties = [{ 'name': 'env.ABC_BUILD_NAME', 'value': abcBuildName, }] build_id = tc.trigger_build(buildTypeId, ref, PHID, properties)['id'] if PHID in create_server.db['diff_targets']: build_target = create_server.db['diff_targets'][PHID] else: build_target = BuildTarget(PHID) build_target.queue_build(build_id, abcBuildName) create_server.db['diff_targets'][PHID] = build_target return SUCCESS, 200
def build_diff(): def get_mandatory_argument(argument): value = request.args.get(argument, None) if value is None: raise AssertionError( "Calling /buildDiff endpoint with missing mandatory argument {}:\n{}" .format(argument, request.args)) return value staging_ref = get_mandatory_argument('stagingRef') target_phid = get_mandatory_argument('targetPHID') revision_id = get_mandatory_argument('revisionId') # Get the configuration from master config = yaml.safe_load( phab.get_file_content_from_master( "contrib/teamcity/build-configurations.yml")) # Get the list of changed files changedFiles = phab.get_revision_changed_files(revision_id=revision_id) # Get a list of the builds that should run on diffs builds = [] for build_name, v in config.get('builds', {}).items(): diffRegexes = v.get('runOnDiffRegex', None) if v.get('runOnDiff', False) or diffRegexes is not None: if diffRegexes: # If the regex matches at least one changed file, add this # build to the list. def regexesMatchAnyFile(regexes, files): for regex in regexes: for filename in files: if re.match(regex, filename): return True return False if regexesMatchAnyFile(diffRegexes, changedFiles): builds.append(build_name) else: builds.append(build_name) if target_phid in create_server.db['diff_targets']: build_target = create_server.db['diff_targets'][target_phid] else: build_target = BuildTarget(target_phid) for build_name in builds: properties = [{ 'name': 'env.ABC_BUILD_NAME', 'value': build_name, }, { 'name': 'env.ABC_REVISION', 'value': revision_id, }] build_id = tc.trigger_build('BitcoinABC_BitcoinAbcStaging', staging_ref, target_phid, properties)['id'] build_target.queue_build(build_id, build_name) create_server.db['diff_targets'][target_phid] = build_target return SUCCESS, 200