Skip to content

Commit 0966f66

Browse files
authored
Merge pull request #1529 from lindluni/lindluni/code-scanning-exclusion
fix: exclude errored code scanning analyses from migration
2 parents 27cf3c3 + 33b0dd5 commit 0966f66

File tree

6 files changed

+91
-0
lines changed

6 files changed

+91
-0
lines changed

RELEASENOTES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* **Bug Fix:** `migrate-code-scanning-alerts` now excludes code scanning analyses that had processing errors on initial uploads, preventing the CLI from failing to continue when it encounters a failed SARIF retrieval because no SARIF exists. Skipped analyses are logged with their ID and error message.

src/Octoshift/Models/CodeScanningAnalysis.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ public class CodeScanningAnalysis
66
public string CommitSha { get; set; }
77
public string CreatedAt { get; set; }
88
public int Id { get; set; }
9+
public string Error { get; set; }
910
}
1011
}

src/Octoshift/Services/CodeScanningAlertService.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ protected internal virtual async Task MigrateAnalyses(string sourceOrg, string s
6565
{
6666
analysisNumber++;
6767

68+
if (!string.IsNullOrEmpty(analysis.Error))
69+
{
70+
_log.LogWarning($"Skipping analysis with Id {analysis.Id} which failed to process in the source repository: {analysis.Error}");
71+
_log.LogWarning(" This error is non-fatal and will not affect your migrated code-scanning alerts.");
72+
continue;
73+
}
74+
6875
string sarifReport;
6976
try
7077
{

src/Octoshift/Services/GithubApi.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,6 +1237,7 @@ private static CodeScanningAnalysis BuildCodeScanningAnalysis(JToken codescan) =
12371237
CommitSha = (string)codescan["commit_sha"],
12381238
Ref = (string)codescan["ref"],
12391239
CreatedAt = (string)codescan["created_at"],
1240+
Error = (string)codescan["error"],
12401241
};
12411242

12421243
private static CodeScanningAlert BuildCodeScanningAlert(JToken scanningAlert) =>

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,44 @@ public async Task MigrateAnalyses_Dry_Run_Does_Not_Upload_Sarif()
315315
Times.Never);
316316
}
317317

318+
[Fact]
319+
public async Task MigrateAnalyses_Skips_Analyses_With_Error_And_Logs_Warning()
320+
{
321+
var validAnalysis = new CodeScanningAnalysis
322+
{
323+
Id = 111,
324+
CreatedAt = "2022-03-30T00:00:00Z",
325+
CommitSha = "valid_sha",
326+
Ref = "refs/heads/main"
327+
};
328+
var errorAnalysis = new CodeScanningAnalysis
329+
{
330+
Id = 222,
331+
CreatedAt = "2022-03-29T00:00:00Z",
332+
CommitSha = "error_sha",
333+
Ref = "refs/heads/main",
334+
Error = "something went wrong"
335+
};
336+
var processingStatus = new SarifProcessingStatus
337+
{
338+
Status = SarifProcessingStatus.Complete,
339+
Errors = Enumerable.Empty<string>()
340+
};
341+
342+
_mockSourceGithubApi.Setup(x => x.GetCodeScanningAnalysisForRepository(SOURCE_ORG, SOURCE_REPO, "main")).ReturnsAsync(new[] { errorAnalysis, validAnalysis });
343+
_mockTargetGithubApi.Setup(x => x.GetCodeScanningAnalysisForRepository(TARGET_ORG, TARGET_REPO, "main")).ReturnsAsync(Enumerable.Empty<CodeScanningAnalysis>());
344+
_mockSourceGithubApi.Setup(x => x.GetSarifReport(SOURCE_ORG, SOURCE_REPO, validAnalysis.Id)).ReturnsAsync("SARIF");
345+
_mockTargetGithubApi.Setup(x => x.UploadSarifReport(TARGET_ORG, TARGET_REPO, "SARIF", validAnalysis.CommitSha, validAnalysis.Ref)).ReturnsAsync("sarif-id");
346+
_mockTargetGithubApi.Setup(x => x.GetSarifProcessingStatus(TARGET_ORG, TARGET_REPO, "sarif-id")).ReturnsAsync(processingStatus);
347+
348+
await _alertService.MigrateAnalyses(SOURCE_ORG, SOURCE_REPO, TARGET_ORG, TARGET_REPO, "main", false);
349+
350+
_mockOctoLogger.Verify(log => log.LogWarning($"Skipping analysis with Id {errorAnalysis.Id} which failed to process in the source repository: something went wrong"));
351+
_mockOctoLogger.Verify(log => log.LogWarning(" This error is non-fatal and will not affect your migrated code-scanning alerts."));
352+
_mockSourceGithubApi.Verify(x => x.GetSarifReport(SOURCE_ORG, SOURCE_REPO, errorAnalysis.Id), Times.Never);
353+
_mockTargetGithubApi.Verify(x => x.UploadSarifReport(TARGET_ORG, TARGET_REPO, "SARIF", validAnalysis.CommitSha, validAnalysis.Ref), Times.Once);
354+
}
355+
318356
[Fact]
319357
public async Task MigrateAlerts_Matches_Dismissed_Alert_By_Last_Instance_And_Updates_Target()
320358
{

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3068,6 +3068,49 @@ public async Task GetCodeScanningAnalysisForRepository_Returns_Analyses()
30683068
scanResults.ElementAt(2).CreatedAt.Should().Be((string)expectedData["created_at"]);
30693069
}
30703070

3071+
[Fact]
3072+
public async Task GetCodeScanningAnalysisForRepository_Includes_Analyses_With_Error()
3073+
{
3074+
// Arrange
3075+
const string url = $"https://api.github.com/repos/{GITHUB_ORG}/{GITHUB_REPO}/code-scanning/analyses?per_page=100&sort=created&direction=asc";
3076+
3077+
var validAnalysis = $@"
3078+
{{
3079+
""ref"": ""refs/heads/main"",
3080+
""commit_sha"": ""25cb837876685f98756d0c934ffe6cd09da570f8"",
3081+
""created_at"": ""2022-08-08T19:00:18Z"",
3082+
""id"": 38200197,
3083+
""error"": """"
3084+
}}
3085+
";
3086+
3087+
var errorAnalysis = $@"
3088+
{{
3089+
""ref"": ""refs/heads/main"",
3090+
""commit_sha"": ""67f8626e1f3ca40e9678e1dcfc4f840009ffc260"",
3091+
""created_at"": ""2022-08-06T19:40:39Z"",
3092+
""id"": 38026365,
3093+
""error"": ""something went wrong""
3094+
}}
3095+
";
3096+
3097+
var analyses = new List<JToken> { JToken.Parse(validAnalysis), JToken.Parse(errorAnalysis) };
3098+
3099+
_githubClientMock
3100+
.Setup(m => m.GetAllAsync(url, null))
3101+
.Returns(analyses.ToAsyncEnumerable());
3102+
3103+
// Act
3104+
var scanResults = await _githubApi.GetCodeScanningAnalysisForRepository(GITHUB_ORG, GITHUB_REPO);
3105+
3106+
// Assert
3107+
scanResults.Count().Should().Be(2);
3108+
scanResults.First().Id.Should().Be(38200197);
3109+
scanResults.First().Error.Should().BeEmpty();
3110+
scanResults.Last().Id.Should().Be(38026365);
3111+
scanResults.Last().Error.Should().Be("something went wrong");
3112+
}
3113+
30713114
[Fact]
30723115
public async Task GetCodeScanningAnalysisForRepository_Passes_Filtered_Branch_As_QueryString()
30733116
{

0 commit comments

Comments
 (0)