示例#1
0
def analyse(argv):
    '''
    Analyse timestamp file
    '''
    settings = Settings()

    # load Travis environment variables and save them in settings
    load_travis_env_vars()

    # process command line arguments
    process_argv(argv)

    # read build data from timestamp CSV file
    build = Build(TIMESTAMP_FILE)

    # load build properties from settings
    build.load_properties_from_settings()

    # retrieve data from Travis CI API
    if build.get_property("ci_platform") == "travis":
        travis_data = TravisData(
            build.get_property("repo"),
            build.get_property("build"),
        )
        travis_data.get_build_data()
        build.set_started_at(travis_data.get_started_at())

    # log data
    if settings.get_setting("mode_native") is True:
        log_build_native(build)
    if settings.get_setting("mode_keen") is True:
        log_build_keen(build)
示例#2
0
def create_worker_app():
    """Create worker app."""
    # load settings
    settings = Settings()
    settings.load_settings(config_file=constants.CONFIG_FILE)
    settings.set_client(constants.CLIENT_NAME, constants.CLIENT_VERSION)

    if is_worker_enabled():
        task_queue = settings.get_setting("task_queue")
        worker_app = Celery(
            'tasks',
            backend=task_queue["backend"],
            broker=task_queue["broker_url"]
        )

        # configure worker
        worker_app.conf.update(
            CELERY_TASK_SERIALIZER='json',
            CELERY_ACCEPT_CONTENT=['json']
        )

        if worker_app is None:
            logger.error("Error connection to task queue")
        else:
            logger.info(
                "Connected to task queue : %s", task_queue["broker_url"]
            )
    else:
        worker_app = Celery()
        logger.warning(
            "Task queue is not defined,"
            " check README.md to configure task queue"
        )

    return worker_app
def generate_trend(argv):
    """Generate trends from analysed buildtime data."""
    settings = Settings()

    # load settings from config file, env_var and cli parameters
    if settings.load_settings(argv) is None:
        return

    # load Travis CI environment variables
    env_var.load_all(settings)

    # run trend_keen() always,
    # if $KEEN_PROJECT_ID variable is set (checked later), it will be executed
    if settings.get_setting("mode_native") is True:
        trend_native()
    if settings.get_setting("mode_keen") is True:
        trend_keen()
示例#4
0
def generate_trend(argv):
    '''
    Generate trends from analised buildtime data
    '''
    settings = Settings()

    # load Travis environment variables and save them in settings
    load_travis_env_vars()

    # process command line arguments
    process_argv(argv)

    # run trend_keen() always,
    # if $KEEN_PROJECT_ID variable is set (checked later), it will be executed
    if settings.get_setting("mode_native") is True:
        trend_native()
    if settings.get_setting("mode_keen") is True:
        trend_keen()
示例#5
0
def get_repo_data_detail(repo):
    """
    Get level of data detail storage of a repo.

    A repository name is checked against a list of repository names.
    If a match is found, the corresponding data detail level is used.
    Else, the default global setting is returned.

    Parameters:
    -repo : repository name
    """
    settings = Settings()

    if repo is None:
        logger.warning("Repo is not defined")
    else:
        repo_settings = settings.get_setting("repo_data_detail")
        for repo_substring, setting in repo_settings.items():
            if repo_substring in repo:
                return setting

    # return default global data_detail setting
    return settings.get_setting("data_detail")
示例#6
0
def retrieve_and_store_data(argv):
    """
    Load timing and build data, process and store it.

    Retrieve timing and build data from Travis CI log, parse it
    and store the result in Keen.io.
    Parameters:
    - argv : command line parameters
    """
    settings = Settings()
    settings.set_client(CLIENT_NAME, CLIENT_VERSION)

    # load settings from config file, env_var and cli parameters
    if settings.load_settings(argv, "config_service.yml") is None:
        return

    build = settings.get_setting('build')
    if build is None:
        print("Build number is not set, use --build=build_id")
        return

    travis_data = TravisData(settings.get_project_name(), build)

    # retrieve build data using Travis CI API
    print(
        "Retrieve build #{:s} data of {:s} from Travis CI".format(
            build, settings.get_project_name()
        )
    )
    travis_data.get_build_data()

    # process all build jobs
    travis_data.process_build_jobs()

    if not keenio.is_writable():
        print("Keen IO write key not set, no data was sent")
        return

    # send build job data to Keen.io
    for build_job in travis_data.build_jobs:
        print("Send build job #{:s} data to Keen.io".format(build_job))
        keenio.send_build_data_service(travis_data.build_jobs[build_job])
示例#7
0
class TestSettings(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        self.settings = Settings()

        self.project_name = buildtimetrend.NAME

        self.project_info = {
            "version": buildtimetrend.VERSION,
            "schema_version": buildtimetrend.SCHEMA_VERSION,
            "project_name": self.project_name}

    def setUp(self):
        # reinit settings singleton
        if self.settings is not None:
            self.settings.__init__()

    def test_get_project_info(self):
        self.assertDictEqual(self.project_info, self.settings.get_project_info())

    def test_get_set_project_name(self):
        self.assertEquals(self.project_name, self.settings.get_project_name())

        self.settings.set_project_name("test_name")
        self.assertEquals("test_name", self.settings.get_project_name())

        self.settings.set_project_name(None)
        self.assertEquals(None, self.settings.get_project_name())

        self.settings.set_project_name("")
        self.assertEquals("", self.settings.get_project_name())

    def test_get_add_setting(self):
        # setting is not set yet
        self.assertEquals(None, self.settings.get_setting("test_name"))

        self.settings.add_setting("test_name", "test_value")
        self.assertEquals("test_value", self.settings.get_setting("test_name"))

        self.settings.add_setting("test_name", None)
        self.assertEquals(None, self.settings.get_setting("test_name"))

        self.settings.add_setting("test_name", "")
        self.assertEquals("", self.settings.get_setting("test_name"))

        self.settings.add_setting("test_name", 6)
        self.assertEquals(6, self.settings.get_setting("test_name"))

    def test_get_setting(self):
        self.assertEquals(None, self.settings.get_setting("test_name"))

        self.assertEquals(
            self.project_name,
            self.settings.get_setting("project_name"))

        self.assertDictEqual(
            {
                "project_name": self.project_name,
                "mode_native": False,
                "mode_keen": True
            },
            self.settings.settings.get_items())

    def test_no_config_file(self):
        # function should return false when file doesn't exist
        self.assertFalse(self.settings.load_config_file('no_file.yml'))
        self.assertDictEqual(
            {
                "project_name": self.project_name,
                "mode_native": False,
                "mode_keen": True
            },
            self.settings.settings.get_items())

        self.assertFalse(self.settings.load_config_file(''))
        self.assertDictEqual(
            {
                "project_name": self.project_name,
                "mode_native": False,
                "mode_keen": True
            },
            self.settings.settings.get_items())

        # function should throw an error when no filename is set
        self.assertRaises(TypeError, self.settings.load_config_file)

    def test_load_config_file(self):
        # checking if Keen.io configuration is not set (yet)
        self.assertEquals(None, keen.project_id)
        self.assertEquals(None, keen.write_key)
        self.assertEquals(None, keen.read_key)

        # load sample config file
        self.assertTrue(self.settings.load_config_file(constants.TEST_SAMPLE_CONFIG_FILE))
        self.assertDictEqual(
            {"project_name": "test_project",
            "mode_native": True,
            "mode_keen": False,
            "setting1": "test_value1"},
            self.settings.settings.get_items())

        # checking if Keen.io configuration is set
        self.assertEquals("1234", keen.project_id)
        self.assertEquals("12345678", keen.write_key)
        self.assertEquals("abcdefg", keen.read_key)
        self.assertTrue(keen_is_readable())
        self.assertTrue(keen_is_writable())
示例#8
0
    def test_load_travis_env_vars(self):
        """Test load_travis_env_vars"""
        settings = Settings()

        self.assertEqual(None, settings.get_setting("ci_platform"))
        self.assertEqual(None, settings.get_setting("build"))
        self.assertEqual(None, settings.get_setting("job"))
        self.assertEqual(None, settings.get_setting("branch"))
        self.assertEqual(None, settings.get_setting("result"))
        self.assertEqual(None, settings.get_setting("build_trigger"))
        self.assertEqual(None, settings.get_setting("pull_request"))
        self.assertEqual(buildtimetrend.NAME, settings.get_project_name())

        # setup Travis env vars
        if "TRAVIS" in os.environ and os.environ["TRAVIS"] == "true":
            reset_travis_vars = False
            expected_build = os.environ["TRAVIS_BUILD_NUMBER"]
            expected_job = os.environ["TRAVIS_JOB_NUMBER"]
            expected_branch = os.environ["TRAVIS_BRANCH"]
            expected_project_name = os.environ["TRAVIS_REPO_SLUG"]
            copy_pull_request = os.environ["TRAVIS_PULL_REQUEST"]
        else:
            reset_travis_vars = True
            os.environ["TRAVIS"] = "true"
            expected_build = os.environ["TRAVIS_BUILD_NUMBER"] = "123"
            expected_job = os.environ["TRAVIS_JOB_NUMBER"] = "123.1"
            expected_branch = os.environ["TRAVIS_BRANCH"] = "branch1"
            expected_project_name = \
                os.environ["TRAVIS_REPO_SLUG"] = "test/project"

        # setup Travis test result
        if "TRAVIS_TEST_RESULT" in os.environ:
            reset_travis_result = False
            copy_result = os.environ["TRAVIS_TEST_RESULT"]
        else:
            reset_travis_result = True

        os.environ["TRAVIS_TEST_RESULT"] = "0"
        os.environ["TRAVIS_PULL_REQUEST"] = "false"

        env_var.load_all(settings)

        self.assertEqual("travis", settings.get_setting("ci_platform"))
        self.assertEqual(expected_build, settings.get_setting("build"))
        self.assertEqual(expected_job, settings.get_setting("job"))
        self.assertEqual(expected_branch, settings.get_setting("branch"))
        self.assertEqual(expected_project_name, settings.get_project_name())
        self.assertEqual("passed", settings.get_setting("result"))
        self.assertEqual("push", settings.get_setting("build_trigger"))
        self.assertDictEqual(
            {
                'is_pull_request': False,
                'title': None,
                'number': None
            }, settings.get_setting("pull_request"))

        os.environ["TRAVIS_TEST_RESULT"] = "1"
        # build is a pull request
        expected_pull_request = os.environ["TRAVIS_PULL_REQUEST"] = "123"
        env_var.load_all()
        self.assertEqual("failed", settings.get_setting("result"))
        self.assertEqual("pull_request", settings.get_setting("build_trigger"))
        self.assertDictEqual(
            {
                'is_pull_request': True,
                'title': "unknown",
                'number': expected_pull_request
            }, settings.get_setting("pull_request"))

        # build is not a pull request
        os.environ["TRAVIS_PULL_REQUEST"] = "false"
        env_var.load_all(settings)
        self.assertEqual("push", settings.get_setting("build_trigger"))
        self.assertDictEqual(
            {
                'is_pull_request': False,
                'title': None,
                'number': None
            }, settings.get_setting("pull_request"))

        # reset test Travis vars
        if reset_travis_vars:
            del os.environ["TRAVIS"]
            del os.environ["TRAVIS_BUILD_NUMBER"]
            del os.environ["TRAVIS_JOB_NUMBER"]
            del os.environ["TRAVIS_BRANCH"]
            del os.environ["TRAVIS_REPO_SLUG"]
            del os.environ["TRAVIS_PULL_REQUEST"]
        else:
            os.environ["TRAVIS_PULL_REQUEST"] = copy_pull_request

        # reset Travis test result
        if reset_travis_result:
            del os.environ["TRAVIS_TEST_RESULT"]
        else:
            os.environ["TRAVIS_TEST_RESULT"] = copy_result
示例#9
0
    def test_load_build_matrix_env_vars_parameters(self):
        """Test load_travis_env_vars, optional parameters"""
        # setup Travis env vars
        if "TRAVIS" in os.environ and os.environ["TRAVIS"] == "true":
            reset_travis_vars = False
            copy_os = os.environ["TRAVIS_OS_NAME"]
        else:
            reset_travis_vars = True
            os.environ["TRAVIS"] = "true"

        # temporarily remove OS VERSION
        if "TRAVIS_OS_NAME" in os.environ:
            reset_os = True
            copy_os = os.environ["TRAVIS_OS_NAME"]
            del os.environ["TRAVIS_OS_NAME"]
        else:
            reset_os = False

        # temporarily remove PYTHON VERSION
        if "TRAVIS_PYTHON_VERSION" in os.environ:
            reset_python_version = True
            copy_python = os.environ["TRAVIS_PYTHON_VERSION"]
            del os.environ["TRAVIS_PYTHON_VERSION"]
        else:
            reset_python_version = False

        # test optional build matrix parameters
        test_parameters = [{
            'env_var': 'TRAVIS_XCODE_SDK',
            'parameter': 'xcode_sdk',
            'test_value': "test_x_sdk"
        }, {
            'env_var': 'TRAVIS_XCODE_SCHEME',
            'parameter': 'xcode_scheme',
            'test_value': "test_x_scheme"
        }, {
            'env_var': 'TRAVIS_XCODE_PROJECT',
            'parameter': 'xcode_project',
            'test_value': "test_x_project"
        }, {
            'env_var': 'TRAVIS_XCODE_WORKSPACE',
            'parameter': 'xcode_workspace',
            'test_value': "test_x_workspace"
        }, {
            'env_var': 'CC',
            'parameter': 'compiler',
            'test_value': "test_gcc"
        }, {
            'env_var': 'ENV',
            'parameter': 'parameters',
            'test_value': "test_env"
        }]

        # test parameters
        for parameter in test_parameters:
            Settings().__init__()
            settings = Settings()

            if parameter['env_var'] in os.environ:
                reset_travis_parameter = False
                expected_param_value = os.environ[parameter['env_var']]
            else:
                reset_travis_parameter = True
                expected_param_value = os.environ[parameter['env_var']] = \
                    parameter['test_value']

            env_var.load_build_matrix_env_vars(settings)

            self.assertDictEqual(
                {
                    parameter["parameter"]: expected_param_value,
                    'summary': expected_param_value
                }, settings.get_setting("build_matrix"))

            # reset Travis parameters
            if reset_travis_parameter:
                del os.environ[parameter['env_var']]

        # reset test Travis vars
        if reset_travis_vars:
            del os.environ["TRAVIS"]

        # reset removed os name
        if reset_os:
            os.environ["TRAVIS_OS_NAME"] = copy_os

        # reset removed python version
        if reset_python_version:
            os.environ["TRAVIS_PYTHON_VERSION"] = copy_python
示例#10
0
    def test_load_build_matrix_env_vars(self):
        """Test load_build_matrix_env_vars"""
        settings = Settings()

        self.assertEqual(None, settings.get_setting("build_matrix"))

        # setup Travis env vars
        if "TRAVIS" in os.environ and os.environ["TRAVIS"] == "true":
            reset_travis_vars = False
            expected_os = os.environ["TRAVIS_OS_NAME"]
            copy_python = os.environ["TRAVIS_PYTHON_VERSION"]
            del os.environ["TRAVIS_PYTHON_VERSION"]
        else:
            reset_travis_vars = True
            os.environ["TRAVIS"] = "true"
            expected_os = os.environ["TRAVIS_OS_NAME"] = "test_os"

        # temporarily remove PYTHON VERSION
        if "TRAVIS_PYTHON_VERSION" in os.environ:
            reset_python_version = True
            copy_python = os.environ["TRAVIS_PYTHON_VERSION"]
            del os.environ["TRAVIS_PYTHON_VERSION"]
        else:
            reset_python_version = False

        # test language and language versions
        test_languages = [{
            'env_var': 'TRAVIS_DART_VERSION',
            'language': 'dart',
            'test_value': "1.1"
        }, {
            'env_var': 'TRAVIS_GO_VERSION',
            'language': 'go',
            'test_value': "1.2"
        }, {
            'env_var': 'TRAVIS_HAXE_VERSION',
            'language': 'haxe',
            'test_value': "1.3"
        }, {
            'env_var': 'TRAVIS_JDK_VERSION',
            'language': 'java',
            'test_value': "1.4"
        }, {
            'env_var': 'TRAVIS_JULIA_VERSION',
            'language': 'julia',
            'test_value': "1.5"
        }, {
            'env_var': 'TRAVIS_NODE_VERSION',
            'language': 'javascript',
            'test_value': "1.6"
        }, {
            'env_var': 'TRAVIS_OTP_RELEASE',
            'language': 'erlang',
            'test_value': "1.7"
        }, {
            'env_var': 'TRAVIS_PERL_VERSION',
            'language': 'perl',
            'test_value': "1.8"
        }, {
            'env_var': 'TRAVIS_PHP_VERSION',
            'language': 'php',
            'test_value': "1.9"
        }, {
            'env_var': 'TRAVIS_PYTHON_VERSION',
            'language': 'python',
            'test_value': "1.10"
        }, {
            'env_var': 'TRAVIS_R_VERSION',
            'language': 'r',
            'test_value': "1.11"
        }, {
            'env_var': 'TRAVIS_RUBY_VERSION',
            'language': 'ruby',
            'test_value': "1.12"
        }, {
            'env_var': 'TRAVIS_RUST_VERSION',
            'language': 'rust',
            'test_value': "1.13"
        }, {
            'env_var': 'TRAVIS_SCALA_VERSION',
            'language': 'scala',
            'test_value': "1.14"
        }]

        # test languages
        for language in test_languages:
            if language['env_var'] in os.environ:
                reset_travis_lang_version = False
                expected_lang_version = os.environ[language['env_var']]
            else:
                reset_travis_lang_version = True
                expected_lang_version = \
                    os.environ[language['env_var']] = language['test_value']

            env_var.load_build_matrix_env_vars(settings)

            self.assertDictEqual(
                {
                    'os':
                    expected_os,
                    'language':
                    language['language'],
                    'language_version':
                    expected_lang_version,
                    'summary':
                    "{0!s} {1!s} {2!s}".format(language['language'],
                                               expected_lang_version,
                                               expected_os)
                }, settings.get_setting("build_matrix"))

            # reset Travis test result
            if reset_travis_lang_version:
                del os.environ[language['env_var']]

        # reset test Travis vars
        if reset_travis_vars:
            del os.environ["TRAVIS"]
            del os.environ["TRAVIS_OS_NAME"]

        # reset removed python version
        if reset_python_version:
            os.environ["TRAVIS_PYTHON_VERSION"] = copy_python