Skip to content

Commit 9f82b40

Browse files
Merge pull request #1324 from github/skip-not-found-sarif-reports
Skip not found code scanning analysis migrations
2 parents 1b2c02b + 9a10bac commit 9f82b40

File tree

3 files changed

+87
-5
lines changed

3 files changed

+87
-5
lines changed

RELEASENOTES.md

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
- Update validation error messages for `gh bbs2gh migrate-repo` command when generating an archive is not required.
2+
- `gh gei migrate-code-scanning-alerts` now skips a not found code scanning analysis and continues with the rest.

src/Octoshift/Services/CodeScanningAlertService.cs

+16-5
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,28 @@ protected internal virtual async Task MigrateAnalyses(string sourceOrg, string s
5959
return;
6060
}
6161

62-
var migratedCount = 0;
62+
var analysisNumber = 0;
6363

6464
foreach (var analysis in relevantAnalyses)
6565
{
66-
var sarifReport = await _sourceGithubApi.GetSarifReport(sourceOrg, sourceRepo, analysis.Id);
66+
analysisNumber++;
67+
68+
string sarifReport;
69+
try
70+
{
71+
sarifReport = await _sourceGithubApi.GetSarifReport(sourceOrg, sourceRepo, analysis.Id);
72+
}
73+
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
74+
{
75+
_log.LogWarning($"Skipping analysis {analysis.Id} because no analysis was found for it ({analysisNumber} / {relevantAnalyses.Count})...");
76+
continue;
77+
}
78+
6779
_log.LogVerbose($"Downloaded SARIF report for analysis {analysis.Id}");
80+
6881
try
6982
{
70-
_log.LogInformation($"Uploading SARIF for analysis {analysis.Id} in target repository ({migratedCount + 1} / {relevantAnalyses.Count})...");
83+
_log.LogInformation($"Uploading SARIF for analysis {analysis.Id} in target repository ({analysisNumber} / {relevantAnalyses.Count})...");
7184
var id = await _targetGithubApi.UploadSarifReport(targetOrg, targetRepo, sarifReport, analysis.CommitSha, analysis.Ref);
7285
// Wait for SARIF processing to finish before first querying it
7386
await Task.Delay(500);
@@ -95,8 +108,6 @@ protected internal virtual async Task MigrateAnalyses(string sourceOrg, string s
95108
{
96109
throw new OctoshiftCliException($"Received HTTP Status 403 for uploading analysis {analysis.Id}. Please make sure to activate GitHub Advanced Security on the target.", httpException);
97110
}
98-
99-
migratedCount++;
100111
}
101112

102113
_log.LogInformation($"Successfully finished migrating {relevantAnalyses.Count} Code Scanning analyses! ");

src/OctoshiftCLI.Tests/Octoshift/Services/CodeScanningAlertServiceTests.cs

+70
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System.Collections.ObjectModel;
22
using System.Linq;
3+
using System.Net;
4+
using System.Net.Http;
35
using System.Threading.Tasks;
46
using FluentAssertions;
57
using Moq;
@@ -872,6 +874,74 @@ public async Task MigrateAlerts_Dry_Run_Will_Not_Adjust_Any_Alerts_On_Target()
872874
), Times.Never);
873875
}
874876

877+
[Fact]
878+
public async Task MigrateAlerts_Skips_An_Analysis_When_SARIF_Report_Not_Found()
879+
{
880+
// Arrange
881+
var Ref = "refs/heads/main";
882+
var analysis1 = new CodeScanningAnalysis
883+
{
884+
Id = 1,
885+
CreatedAt = "2022-03-30T00:00:00Z",
886+
CommitSha = "SHA_1",
887+
Ref = Ref
888+
};
889+
var analysis2 = new CodeScanningAnalysis
890+
{
891+
Id = 2,
892+
CreatedAt = "2022-03-31T00:00:00Z",
893+
CommitSha = "SHA_2",
894+
Ref = Ref
895+
};
896+
897+
const string sarifResponse2 = "SARIF_RESPONSE_2";
898+
var processingStatus = new SarifProcessingStatus
899+
{
900+
Status = SarifProcessingStatus.Complete,
901+
Errors = new Collection<string>()
902+
};
903+
904+
_mockSourceGithubApi.Setup(x => x.GetCodeScanningAnalysisForRepository(SOURCE_ORG, SOURCE_REPO, "main")).ReturnsAsync(new[] { analysis1, analysis2 });
905+
_mockSourceGithubApi.Setup(x => x.GetSarifReport(SOURCE_ORG, SOURCE_REPO, analysis1.Id))
906+
.ThrowsAsync(new HttpRequestException("No analysis found for analysis ID 1", null, HttpStatusCode.NotFound));
907+
_mockSourceGithubApi.Setup(x => x.GetSarifReport(SOURCE_ORG, SOURCE_REPO, analysis2.Id)).ReturnsAsync(sarifResponse2);
908+
_mockTargetGithubApi.Setup(x => x.UploadSarifReport(TARGET_ORG, TARGET_REPO, It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).ReturnsAsync("sarif-id");
909+
_mockTargetGithubApi.Setup(x => x.GetSarifProcessingStatus(TARGET_ORG, TARGET_REPO, It.IsAny<string>()))
910+
.ReturnsAsync(processingStatus);
911+
912+
// Act
913+
await _alertService.MigrateAnalyses(SOURCE_ORG, SOURCE_REPO, TARGET_ORG, TARGET_REPO, "main", false);
914+
915+
// Assert
916+
_mockTargetGithubApi.Verify(
917+
x => x.UploadSarifReport(
918+
TARGET_ORG,
919+
TARGET_REPO,
920+
It.IsAny<string>(),
921+
It.IsAny<string>(),
922+
It.IsAny<string>()
923+
),
924+
Times.Once);
925+
_mockTargetGithubApi.Verify(
926+
x => x.UploadSarifReport(
927+
TARGET_ORG,
928+
TARGET_REPO,
929+
sarifResponse2,
930+
analysis2.CommitSha,
931+
Ref
932+
),
933+
Times.Once);
934+
935+
_mockTargetGithubApi.Verify(
936+
x => x.GetSarifProcessingStatus(
937+
TARGET_ORG,
938+
TARGET_REPO,
939+
"sarif-id"),
940+
Times.Once);
941+
942+
_mockOctoLogger.Verify(log => log.LogWarning($"Skipping analysis {analysis1.Id} because no analysis was found for it (1 / 2)..."));
943+
}
944+
875945
// Avoid having referential equal instances to have real use case tests
876946
private CodeScanningAlertInstance CopyInstance(CodeScanningAlertInstance codeScanningAlertInstance)
877947
{

0 commit comments

Comments
 (0)