示例#1
0
        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);
        }
示例#4
0
        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));
        }
示例#5
0
        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);
        }
示例#6
0
        private static void WriteReport(string filePath, SonarQubeReport sonarQubeReport)
        {
            Console.WriteLine("Writing output files {0}", filePath);

            File.WriteAllText(filePath, JsonConvert.SerializeObject(sonarQubeReport, JsonSerializerSettings));
        }
示例#7
0
        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.");
            }
        }