private static IEnumerable <SonarQubeReport> Map(Report report) { var reportIssueTypes = report.IssueTypes.ToDictionary(t => t.Id, type => type); var sonarQubeReports = new List <SonarQubeReport>(); foreach (var project in report.Issues) { var sonarQubeReport = new SonarQubeReport { ProjectName = project.Name }; var replaceFileNameRegex = new Regex($@"^{Regex.Escape(project.Name)}\\"); foreach (var issue in project.Issue) { if (!reportIssueTypes.TryGetValue(issue.TypeId, out ReportIssueType issueType)) { Console.WriteLine("Unable to find issue type {0}.", issue.TypeId); continue; } if (!Constants.ReSharperToSonarQubeSeverityMap.TryGetValue(issueType.Severity, out string sonarQubeSeverity)) { Console.WriteLine("Unable to map ReSharper severity {0} to SonarQube", issueType.Severity); continue; } var sonarQubeIssue = new Issue { EngineId = Constants.EngineId, RuleId = issue.TypeId, Type = Constants.SonarQubeCodeSmellType, Severity = sonarQubeSeverity, PrimaryLocation = new PrimaryLocation { FilePath = replaceFileNameRegex.Replace(issue.File, string.Empty), Message = issue.Message, TextRange = new TextRange { // For some reason, some issues doesn't have line, but actually they are on the first one StartLine = issue.Line > 0 ? issue.Line : 1 } } }; sonarQubeReport.Issues.Add(sonarQubeIssue); } sonarQubeReports.Add(sonarQubeReport); } return(sonarQubeReports); }
public void ConstructorShouldSetEmptyContent() { // Arrange var sonarQubeReport = new SonarQubeReport(string.Empty); string content = "non-empty"; // Act content = sonarQubeReport.GetContent(); // Assert Assert.Empty(content); }
public void GetTimeUnitWithMoreThan8hourShouldReturndays(int seconds, string expected) { // Arrange var sonarQubeReport = new SonarQubeReport(string.Empty); string time; // Act time = sonarQubeReport.GetTimeUnit(seconds); // Assert Assert.Equal(expected, time); }
private static void WriteReport(string filePath, SonarQubeReport sonarQubeReport) { Console.WriteLine("Writing output files {0}", filePath); var projectDirectory = Path.GetDirectoryName(filePath); if (projectDirectory != null && !Directory.Exists(projectDirectory)) { Directory.CreateDirectory(projectDirectory); } File.WriteAllText(filePath, JsonConvert.SerializeObject(sonarQubeReport, JsonSerializerSettings)); }
private static string GetFolderProject(ISolution solution, SonarQubeReport sonarQubeReport, int solutionDirectoryDepth) { var paths = solution.Projects .Where(x => x.Name == sonarQubeReport.ProjectName && x.TypeGuid != Constants.ProjectTypeGuids["Solution Folder"]) .Select(x => x.Path) .ToList(); string path = null; if (paths.Count > 1) { //Si hay más de un resultado tenemos que tomar como referencia alguna de las incidencias para detectar que ruta es la que corresponde. var sampleIssue = sonarQubeReport.Issues.FirstOrDefault(); if (sampleIssue != null) { var rootPath = sampleIssue.PrimaryLocation.FilePath.Split(@"\").FirstOrDefault(); path = solution.Projects .Where(x => x.Name == sonarQubeReport.ProjectName && x.TypeGuid != Constants.ProjectTypeGuids["Solution Folder"] && x.Path.Split(@"\").FirstOrDefault() == rootPath) .Select(x => x.Path) .FirstOrDefault(); } } else { path = paths.FirstOrDefault(); } if (path != null && solutionDirectoryDepth > 0) { path = RemoveUpperDirectories(path, solutionDirectoryDepth); } return(path != null?Path.GetDirectoryName(path) : sonarQubeReport.ProjectName); }
private static void WriteReport(string filePath, SonarQubeReport sonarQubeReport) { Console.WriteLine("Writing output files {0}", filePath); File.WriteAllText(filePath, JsonConvert.SerializeObject(sonarQubeReport, JsonSerializerSettings)); }
static void Main(string[] args) { var userName = string.Empty; var password = string.Empty; var sendEmail = true; if (args.Length > 1) { if (args[1].Contains(":")) { var credentials = args[1].Split(":"); userName = credentials[0]; password = credentials[1]; if (args.Length > 2) { sendEmail = args[2] != "/noemail"; } } else { sendEmail = args[1] != "/noemail"; } } var startingTime = DateTime.Now; WriteLogMessage("process started..."); if (File.Exists(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json"))) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: false); IConfigurationRoot configuration = builder.Build(); var sonarQubeApiUrl = configuration["SonarQubeApiUrl"]; var projectKey = configuration["SonarQubeProjectKey"]; if (string.IsNullOrWhiteSpace(userName)) { userName = configuration["SonarQubeUserName"]; password = configuration["SonarQubePassword"]; } var metrics = configuration["SonarQubeMetrics"].Split(','); var metricsUri = configuration["SonarQubeMetricUri"]; var lastAnalysisUri = configuration["SonarQubeLastAnalysisUri"]; var projectStatusUri = configuration["SonarQubeProjectStatus"]; var issuesUri = configuration["SonarQubeIssuesUri"]; var emailTemplateFilePath = configuration["EmailTemplateFilePath"]; var smtpHost = configuration["SmtpHost"]; var smtpPort = string.IsNullOrEmpty(configuration["SmtpPort"]) ? 0 : Convert.ToInt32(configuration["SmtpPort"]); var smtpUserName = configuration["SmtpUserName"]; var smtpPassword = configuration["SmtpPassword"]; var smtpTo = configuration["SmtpTo"]; var smtpEnableSsl = string.IsNullOrEmpty(configuration["SmtpEnableSsl"]) ? false : Convert.ToBoolean(configuration["SmtpEnableSsl"]); var smtpUseDefaultCredentials = string.IsNullOrEmpty(configuration["SmtpUseDefaultCredentials"]) ? false : Convert.ToBoolean(configuration["SmtpUseDefaultCredentials"]); WriteLogMessage($"project key: {projectKey}"); var sonarQubeApi = new SonarQubeApi(sonarQubeApiUrl, userName, password); var lastAnalysisService = new LastAnalysisService(sonarQubeApi, lastAnalysisUri, "last-analysis", "previous-analysis", projectKey); if (lastAnalysisService.LastAnalysisDate.Date == DateTime.Today.Date) { WriteLogMessage($"last analysis date: Today [{lastAnalysisService.LastAnalysisDateString}]"); } else { WriteLogMessage($"last analysis date: {lastAnalysisService.LastAnalysisDateString}"); } WriteLogMessage($"previous analysis date: {lastAnalysisService.PreviousAnalysisDateString}"); var projectStatusService = new ProjectStatusService(sonarQubeApi, projectStatusUri, "created-after", projectKey); WriteLogMessage($"last period date: {projectStatusService.PeriodDateString}"); var daysSinceLastAnalysis = lastAnalysisService.PreviousAnalysisDate.Day - DateTime.Today.Day; WriteLogMessage($"total days since previous analysis: {lastAnalysisService.LastAnalysisDate.Day - lastAnalysisService.PreviousAnalysisDate.Day}"); var issueService = new IssueService(sonarQubeApi, issuesUri, DateTime.Today.AddDays(daysSinceLastAnalysis).ToString("yyyy-MM-dd"), projectKey); WriteLogMessage($"new issues since previous analysis: {issueService.GetIssues().Count()}"); WriteLogMessage($"processing {metrics.Length} metrics..."); var metricService = new MetricService(sonarQubeApi, metricsUri, metrics, projectKey); var parameters = new StringDictionary { { "{{project-name}}", projectKey }, { "{{created-before}}", DateTime.Today.AddDays(1).ToString("yyyy-MM-dd") }, { "{{days_since_previous_analysis}}", (lastAnalysisService.LastAnalysisDate.Day - lastAnalysisService.PreviousAnalysisDate.Day).ToString() }, { "{{period-date}}", projectStatusService.PeriodDateString } }; foreach (var measure in lastAnalysisService.GetMeasures()) { parameters.Add("{{" + measure.Metric + "}}", measure.Value); } foreach (var measure in projectStatusService.GetMeasures()) { parameters.Add("{{" + measure.Metric + "}}", measure.Value); } foreach (var measure in metricService.GetMeasures()) { parameters.Add("{{" + measure.Metric + "}}", measure.Value); } WriteLogMessage("generating report..."); var sonarQubeReport = new SonarQubeReport(emailTemplateFilePath); var issueValues = new List <List <string> >(); foreach (var issue in issueService.GetIssues()) { var row = new List <string>(); row.Add(issue.Type); row.Add(issue.Severity); row.Add(issue.ProjectName); row.Add(issue.FileName); row.Add(issue.Message); row.Add(issue.Effort); issueValues.Add(row); } sonarQubeReport.UpdateMinuteUnit(parameters, new[] { "{{sqale_index}}", "{{new_technical_debt}}" }); sonarQubeReport.UpdateMillisecondUnit(parameters, new[] { "{{test_execution_time}}" }); sonarQubeReport.ApplyParameters(parameters); sonarQubeReport.AddNewIssuesSection(new string[] { "Type", "Severity", "Project Name", "File Name", "Message", "Effort" }, issueValues); var reportsDirectory = configuration["ReportsDirectory"]; if (!Directory.Exists(reportsDirectory)) { Directory.CreateDirectory(reportsDirectory); } var filePath = Path.Combine(reportsDirectory, DateTime.Now.ToString("yyyy-dd-MM_hh-mm-sstt", new System.Globalization.CultureInfo("en-US")) + "_report.html"); File.WriteAllText(filePath, sonarQubeReport.GetContent()); WriteLogMessage($"report file available in: {filePath}"); filePath = Path.Combine(reportsDirectory, "last-report.html"); File.WriteAllText(filePath, sonarQubeReport.GetContent()); if (sendEmail) { WriteLogMessage("sending email..."); var emailService = new EmailService(smtpHost, smtpPort, smtpUserName, smtpPassword, smtpEnableSsl, smtpUseDefaultCredentials); emailService.SendEmail(smtpTo, projectKey, sonarQubeReport.GetContent()); } else { WriteLogMessage("'/noemail' flag detected. No email was sent"); } var timespan = DateTime.Now - startingTime; WriteLogMessage($"process finished in {timespan.Hours:00}h:{timespan.Minutes:00}m:{timespan.Seconds:00}s:{timespan.Milliseconds:00}ms"); } else { WriteLogMessage("error appsettings.json file not found."); } }