コード例 #1
0
    def preparing_sonar(self, system):
        """ Function to preparing sonar-scanner execution. """
        utils.print_(
            ">> Preparando execucao do SonarQube no sistema {} ...".format(
                system))

        language = list({
            item["Language"]
            for item in self.systems_and_keys
            if system.upper() in item["ID"].upper()
        })[0]
        files = ",".join(
            {file["File"]
             for file in self.files if file["ID"] == system})
        modules = utils.write_modules(self.modules.items(), self.files, system)

        replacements = {
            "{url}": self.sonar_server,
            "{login}": self.sonar_login,
            "{password}": self.sonar_password,
            "{repository}": self.base_repository,
            "{system}": system,
            "{branch}": self.git_repository.active_branch.name,
            "{sources}": "sonar.sources=" + files,
            "{files}": files,
            "{language}": language,
            "{modules}": modules
        }

        if replacements["{modules}"] != "":
            replacements.update({"{sources}": ""})

        lines = []
        with open(self.sonar_template) as infile:
            for line in infile:
                for src, target in replacements.items():
                    line = line.replace(src, target)
                lines.append(line)

        with open(
                self.sonar_folder + "{}.sonarsource.properties".format(system),
                'w') as outfile:
            for line in lines:
                outfile.write(line)

        utils.ok_text(
            "Arquivo {}.sonarsource.properties criado com sucesso.".format(
                system))
コード例 #2
0
    def remove_configuration_file(self, system):
        """ Function to remove sonar configuration file. """
        utils.print_(">> Removendo arquivo de configuracao ...")

        try:
            utils.remove_file(self.sonar_folder +
                              "{}.sonarsource.properties".format(system))
            utils.ok_text(
                "Arquivo {}.sonarsource.properties removido com sucesso.".
                format(system))

        except Exception:
            utils.error_text(
                "Nao foi possivel remover o arquivo de configuracao do sistema {}"
                .format(system))
            utils.system_exit_ok()
コード例 #3
0
    def commit_analyzer(self):
        """ Main function to analyze commit. """

        utils.verify_branch_is_merging(self.git_command)

        if self.scan_status:
            utils.print_("\n")
            utils.print_(" ANALISE DE CODIGO PELO SONARQUBE INICIADO")
            utils.print_("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n")

            start_time = time.time()

            self.find_modified_files()

            utils.verify_sonar_response(self.sonar_server)

            for system in self.systems:
                self.preparing_sonar(system)
                self.run_sonar(system)

            utils.remove_folder("{}.scannerwork".format(self.base_repository))
            utils.print_(
                ">> Analise de qualidade de codigo pelo SonarQube finalizada.")

            hours, rem = divmod(time.time() - start_time, 3600)
            minutes, seconds = divmod(rem, 60)
            utils.print_(
                ">> Tempo de execucao: {:0>2}:{:0>2}:{:05.2f}\n".format(
                    int(hours), int(minutes), seconds))

            if self.scanner_error:
                utils.warning_text(
                    "Existem problemas criticos de qualidade, verifique o relatorio no navegador. Commit recusado."
                )
                utils.system_exit_block_commit()
            else:
                utils.ok_text("Nenhum problema encontrado. Commit liberado.")
                utils.system_exit_ok()
        else:
            utils.warning_text(
                ">> Analise de qualidade de codigo pelo SonarQube esta desativada. Commit liberado."
            )
            utils.system_exit_ok()
コード例 #4
0
    def find_modified_files(self):
        """ Function to find modified files. """
        utils.print_(">> Analisando arquivos C# no stage ...")

        try:
            modified_files = self.git_repository.head.commit.diff()

            if not modified_files:
                utils.ok_text("Nenhum arquivo alterado.")
                utils.system_exit_ok()

            for file in modified_files:
                _, file_extension = os.path.splitext(file.a_path)
                if file.change_type != "D" and file_extension.lower() == ".cs":
                    dictionary = self.find_modified_systems(file)
                    self.files.append(dictionary)

            if len(self.files) == 0:
                utils.ok_text("Nenhum arquivo alterado.")
                utils.system_exit_ok()

            self.systems = {file["ID"] for file in self.files}
            self.systems = sorted(self.systems)

            for system in self.systems:
                index = list(self.systems).index(system) + 1
                utils.print_("{}. Sistema: {}".format(index, system))
                files = {
                    file["File"]
                    for file in self.files if file["ID"] == system
                }
                files = sorted(files)
                for file in files:
                    utils.print_(" - " + file)
            utils.print_("")

        except Exception:
            utils.error_text(
                "Nao foi possivel encontrar os arquivos modificados no stage.")
            utils.system_exit_ok()
コード例 #5
0
    def run_sonar(self, system):
        """ Function to run sonar-scanner. """
        utils.print_(
            ">> Executando SonarQube no sistema {} ...".format(system))

        try:
            command = self.sonar_scanner + " -D project.settings={}{}.sonarsource.properties".format(
                self.sonar_folder, system)
            output = subprocess.run(command,
                                    stdout=subprocess.PIPE,
                                    stderr=subprocess.STDOUT,
                                    shell=True,
                                    encoding="utf-8")

            if "EXECUTION FAILURE" in output.stdout:
                utils.error_text(
                    "Nao foi possivel executar o SonarQube no sistema {}".
                    format(system))
                utils.system_exit_ok()

            if "major" in output.stdout or "critical" in output.stdout:
                webbrowser.open(
                    self.sonar_folder +
                    "issues-report/{}/issues-report-{}.html".format(
                        system, system),
                    new=2)
                utils.ok_text("Relatorio disponibilizado no navegador.")
                self.scanner_error = True
            else:
                utils.ok_text("Analise concluida.")

        except Exception:
            utils.error_text(
                "Nao foi possivel executar o SonarQube no sistema {}".format(
                    system))
            utils.system_exit_ok()

        self.remove_configuration_file(system)
コード例 #6
0
os.makedirs(os.path.dirname(file), exist_ok=True)

with open(file, "w") as f:
    f.writelines("sonar.host.url={url}\n"\
        "sonar.login={login}\n"\
        "sonar.password={password}\n"\
        "\n"\
        "sonar.projectBaseDir={repository}\n"\
        "sonar.projectKey={system}\n"\
        "sonar.projectName={system}\n"\
        "sonar.projectVersion={branch}\n"\
        "{sources}\n"\
        "sonar.language={language}\n"\
        "\n"\
        "sonar.analysis.mode=preview\n"\
        "\n"\
        "sonar.issuesReport.html.enable=true\n"\
        "sonar.issuesReport.html.location=C:/Sonar/issues-report/{system}/\n"\
        "sonar.issuesReport.html.name=issues-report-{system}\n"\
        "sonar.issuesReport.console.enable=true\n"\
        "\n"\
        "{modules}")

utils.ok_text("Directories created.")

utils.print_(">> Instal GitPython ...")

output = subprocess.run("pip install GitPython", stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, encoding="utf-8")

utils.print_(output.stdout)