Example #1
0
        public void LastAnalysisDateShouldReturnValueIfNotNull()
        {
            // Arrange
            var sonarQubeApiMock = new Mock <SonarQubeApi>(null, null, null);

            sonarQubeApiMock.Setup(m => m.ExecuteRequest <LastResult>(It.IsAny <string>())).Returns(
                new LastResult
            {
                Analyses = new[] { new Analyses {
                                       Date = DateTime.Today
                                   }, new Analyses {
                                       Date = DateTime.Today
                                   } }
            }
                );
            var      lastAnalysisService = new LastAnalysisService(sonarQubeApiMock.Object, string.Empty, string.Empty, string.Empty, string.Empty);
            string   lastAnalysisDate;
            DateTime cstTime  = TimeZoneInfo.ConvertTimeToUtc(DateTime.Today);
            string   expected = $"{cstTime.ToString("MMMM dd, yyyy, hh:mm tt", new System.Globalization.CultureInfo("en-US"))} (UTC)";

            // Act
            lastAnalysisDate = lastAnalysisService.LastAnalysisDateString;

            // Assert
            Assert.Equal(expected, lastAnalysisDate);
        }
Example #2
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.");
            }
        }