/// <summary> /// Create a CheckRunUpdate based on a check run that needs to be deleted /// </summary> /// <param name="checkRun">The check run that needs to be deleted</param> /// <returns>The deleted check run</returns> private CheckRunUpdate CheckRunForDelete(CheckRun checkRun) { CheckRunUpdate updatedCheckRun = new CheckRunUpdate(); updatedCheckRun.CompletedAt = checkRun.CompletedAt; updatedCheckRun.Status = "completed"; updatedCheckRun.Conclusion = "skipped"; return(updatedCheckRun); }
/// <summary> /// Identifies the <see cref="PullRequest.Number"/> a <see cref="CheckRun"/> originated from /// </summary> /// <param name="checkRun">The <see cref="CheckRun"/> to test</param> /// <returns>The associated <see cref="PullRequest.Number"/> on success, <see langword="null"/> on failure</returns> static int?GetPullRequestNumberFromCheckRun(CheckRun checkRun) { //nice thing about check runs we know they contain our pull request number in the title var prRegex = Regex.Match(checkRun.Name, "#([1-9][0-9]*)"); if (prRegex.Success) { return(Convert.ToInt32(prRegex.Groups[1].Value, CultureInfo.InvariantCulture)); } return(null); }
public void AddCheckRun(CheckRun data) { Connection.Execute( "INSERT INTO CheckRun(Id,CheckId,Status,RunTime,LastRunOn)" + " VALUES(@Id, @CheckId, @Status, @RunTime,@LastRunOn)", param: new { Id = Guid.NewGuid(), CheckId = data.CheckId, Status = data.Status, RunTime = data.RunTime, LastRunOn = data.LastRunOn }, transaction: Transaction ); }
public async Task UploadFileWithFormData() { var name = "dummyFileName.txt"; var fileContent = "This is some dummy file contents"; var fileDictionary = new Dictionary <string, string> { { name, fileContent } }; var fileService = Substitute.For <ITempFileService>(); var checkRunSubmissionService = Substitute.For <Web.Interfaces.ICheckRunSubmissionService>(); var receivedFiles = new Dictionary <string, string>(); fileService.CreateFromStreamAsync(Arg.Any <string>(), Arg.Any <Stream>()) .Returns(ci => { var fileName = (string)ci[0]; var stream = (Stream)ci[1]; receivedFiles.Add(fileName, new StreamReader(stream, Encoding.UTF8).ReadToEnd()); return($"temp/{fileName}"); }); fileService.Files.Returns(new[] { name }); var checkRun = new CheckRun { Id = Faker.Random.Long(), Url = Faker.Internet.Url() }; checkRunSubmissionService.SubmitAsync(null, null, null, null, 0).ReturnsForAnyArgs(checkRun); var logUploadData = new LogUploadData { CommitSha = "12345", PullRequestNumber = 345 }; var faker = new Faker(); var repoOwner = faker.Person.FullName; var repoName = faker.Hacker.Phrase(); var claims = new[] { new Claim("urn:bcc:repositoryName", repoName), new Claim("urn:bcc:repositoryOwner", repoOwner), new Claim("urn:bcc:repositoryOwnerId", faker.Random.Long().ToString()) }; var checkRunController = new CheckRunControllerStub(TestLogger.Create <CheckRunController>(_testOutputHelper), fileService, checkRunSubmissionService, Substitute.For <ITelemetryService>()) { ControllerContext = await RequestWithFiles(fileDictionary, logUploadData, claims), MetadataProvider = new EmptyModelMetadataProvider(), ModelBinderFactory = Substitute.For <IModelBinderFactory>(), ObjectValidator = Substitute.For <IObjectModelValidator>() }; var result = await checkRunController.Upload() as JsonResult; await fileService.Received(1).CreateFromStreamAsync(Arg.Is(name), Arg.Any <Stream>()); await checkRunSubmissionService.Received(1).SubmitAsync( repoOwner, repoName, logUploadData.CommitSha, string.Empty, logUploadData.PullRequestNumber); receivedFiles.Should().BeEquivalentTo(fileDictionary); var resultFormData = result?.Value as CheckRun; resultFormData.Should().NotBeNull(); resultFormData.Id.Should().Be(checkRun.Id); resultFormData.Url.Should().Be(checkRun.Url); }
private async Task StartExecution() { IReadOnlyList <Installation> installations = await this.gitHubAppClient.GitHubApps.GetAllInstallationsForCurrent().ConfigureAwait(false); try { if (!this.IsGitHubInstallationClientValid()) { throw new InvalidOperationException("Error: gitHubInstallationClient is invalid."); } if (IsPullRequest) { ICheckSuitesClient checkSuiteClient = gitHubInstallationClient.Check.Suite; CheckSuitesResponse x = await checkSuiteClient.GetAllForReference(CurrentRepository.Id, CommitSha).ConfigureAwait(false); if (x.TotalCount > 0) { long checkSuiteId = x.CheckSuites.FirstOrDefault().Id; bool res = await checkSuiteClient.Rerequest(CurrentRepository.Id, checkSuiteId); } else { var newCheckSuite = new NewCheckSuite(CommitSha); try { CheckSuite suite = await checkSuiteClient.Create( CurrentRepository.Owner.Login, CurrentRepository.Name, newCheckSuite) .ConfigureAwait(false); } catch (Exception ex) { } } return; } ICheckRunsClient checkRunClient = gitHubInstallationClient.Check.Run; // Create a new heckRun in GitHub var newCheckRun = new NewCheckRun("ScanX", CommitSha) { Status = CheckStatus.Queued, }; CheckRun checkRun = await checkRunClient.Create( CurrentRepository.Owner.Login, CurrentRepository.Name, newCheckRun) .ConfigureAwait(false); // --- Downoad a ZIP --- byte[] buffer = await ScanHelper.DownloadRepoZip(gitHubInstallationClient, CurrentRepository.Id, CommitSha).ConfigureAwait(false); int size = buffer.Length; // Upload ZIP to a storage blob string blobName = $"{RequestId.ToString()}"; string blobUri = await ScanHelper.UploadBufferToStorage(buffer, blobName); // Update check's status to "in progress" CheckRunUpdate checkRunUpdate = new CheckRunUpdate { Status = CheckStatus.InProgress, Name = checkRun.Name }; checkRun = await checkRunClient.Update(CurrentRepository.Id, checkRun.Id, checkRunUpdate).ConfigureAwait(false); // --- Start a scan --- // Simulate sending of a message to a SB queue // Create worker notification message MalwareDeterminationRequest scanRequest = new MalwareDeterminationRequest(); scanRequest.ClientId = "GitHubScanX"; scanRequest.FileName = $"{RequestId.ToString()}.zip"; scanRequest.FileSizeInBytes = 1000; //dummy scanRequest.RequestId = RequestId; scanRequest.Uri = new Uri(blobUri); // Notify worker (aka put the notification message to a queue) ScanXMock mock = new ScanXMock(); await mock.SendScanRequest(scanRequest).ConfigureAwait(false); // --- Poll for a scan completion --- MalwareDeterminationResult scanResult; do { await Task.Delay(500).ConfigureAwait(false); if (await mock.TryGetResult(RequestId)) { scanResult = await mock.GetResult(RequestId).ConfigureAwait(false); break; } }while (true); //!!!! for POC only checkRunUpdate.Status = CheckStatus.Completed; checkRunUpdate.CompletedAt = DateTime.UtcNow; checkRunUpdate.Conclusion = scanResult.WorkStatus == WorkStatus.Clean ? CheckConclusion.Success : CheckConclusion.Failure; if (checkRunUpdate.Conclusion == CheckConclusion.Failure) { checkRunUpdate.Output = new NewCheckRunOutput( "Scan Report", $"GitScan detected {scanResult.ConfirmedMalwares.Count()} infected files. See details below."); checkRunUpdate.Output.Text = "| File Path| Malware Type| AV Engines|\n"; checkRunUpdate.Output.Text += "|:---|:---|:---|\n"; foreach (var entry in scanResult.ConfirmedMalwares) { checkRunUpdate.Output.Text += $"|{entry.FileName}|{entry.MalwareInfo}|{string.Join(",", entry.AvEngines.ToArray())}"; } } checkRun = await checkRunClient.Update(CurrentRepository.Id, checkRun.Id, checkRunUpdate).ConfigureAwait(false); } catch (Exception ex) { Console.WriteLine($"Exception: {ex.Message}"); } }
public async Task <CheckRun> SubmitCheckRun(InstallationToken token, string repo, CheckRun checkRun) { var url = $"{Base}repos/{token.Account}/{repo}/check-runs"; var output = await Execute <CheckRun>(HttpMethod.Post, url, token, JsonConvert.SerializeObject(checkRun)); return(output); }