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")
Esempio n. 2
0
    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
Esempio n. 3
0
    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
Esempio n. 4
0
    def test_buildTarget(self):
        build_target_phid = "PHID-HMBT-123456"

        # Create a build target
        build_target = BuildTarget(build_target_phid)

        # 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)
Esempio n. 5
0
    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