public static async Task Main(string[] args) { var client = new SecretClient( vaultUri: new Uri("https://roslyninfra.vault.azure.net:443"), credential: new DefaultAzureCredential(includeInteractiveCredentials: true)); using var devdivConnection = new AzDOConnection("https://devdiv.visualstudio.com/DefaultCollection", "DevDiv", "Roslyn-Signed", client, "vslsnap-vso-auth-token"); using var dncengConnection = new AzDOConnection("https://dnceng.visualstudio.com/DefaultCollection", "internal", "dotnet-roslyn CI", client, "vslsnap-build-auth-token"); var connections = new[] { devdivConnection, dncengConnection }; var visualStudioReleases = await GetVisualStudioReleasesAsync(devdivConnection.GitClient); var roslynRepository = new Repository(args[0]); var existingTags = roslynRepository.Tags.ToImmutableArray(); foreach (var visualStudioRelease in visualStudioReleases) { var roslynTagName = TryGetRoslynTagName(visualStudioRelease); if (roslynTagName is not null) { if (!existingTags.Any(t => t.FriendlyName == roslynTagName)) { Console.WriteLine($"Tag {roslynTagName} is missing."); RoslynBuildInformation?roslynBuild = null; foreach (var connection in connections) { roslynBuild = await TryGetRoslynBuildForReleaseAsync(visualStudioRelease, devdivConnection, connection); if (roslynBuild is not null) { break; } } if (roslynBuild is not null) { Console.WriteLine($"Tagging {roslynBuild.CommitSha} as {roslynTagName}."); string message = $"Build Branch: {roslynBuild.SourceBranch}\r\nInternal ID: {roslynBuild.BuildId}\r\nInternal VS ID: {visualStudioRelease.BuildId}"; roslynRepository.ApplyTag(roslynTagName, roslynBuild.CommitSha, new Signature("dotnet bot", "*****@*****.**", when: visualStudioRelease.CreationTime), message); } else { Console.WriteLine($"Unable to find the build for {roslynTagName}."); } } else { Console.WriteLine($"Tag {roslynTagName} already exists."); } } } }
private static async Task <RoslynBuildInformation?> TryGetRoslynBuildForReleaseAsync(VisualStudioVersion release, AzDOConnection vsConnection, AzDOConnection connection) { try { var(branchName, buildNumber) = await TryGetRoslynBranchAndBuildNumberForReleaseAsync(release, vsConnection.GitClient); if (string.IsNullOrEmpty(branchName) || string.IsNullOrEmpty(buildNumber)) { return(null); } var commitSha = await TryGetRoslynCommitShaFromBuildAsync(connection, buildNumber) ?? await TryGetRoslynCommitShaFromNuspecAsync(vsConnection.NuGetClient, release, vsConnection.GitClient); if (string.IsNullOrEmpty(commitSha)) { return(null); } var buildId = connection.BuildDefinitionName + "_" + buildNumber; return(new RoslynBuildInformation(commitSha, branchName, buildId)); } catch { return(null); } }