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))
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()
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()
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()
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)
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)