Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public Task<PackageResponse> GetPackageWorkItemAsync(string packageName, string
throw new NotImplementedException();
}

public Task<Build> RunPipelineAsync(int pipelineDefinitionId, Dictionary<string, string> templateParams, string branchRef = "main")
public Task<Build> RunPipelineAsync(int pipelineDefinitionId, Dictionary<string, string> templateParams, string apiSpecBranchRef = "main")
{
return Task.FromResult(new Build
{
Expand Down Expand Up @@ -97,7 +97,7 @@ Task<bool> IDevOpsService.LinkNamespaceApprovalIssueAsync(int releasePlanWorkIte
return Task.FromResult(true);
}

Task<Build> IDevOpsService.RunSDKGenerationPipelineAsync(string branchRef, string typespecProjectRoot, string apiVersion, string sdkReleaseType, string language, int workItemId)
Task<Build> IDevOpsService.RunSDKGenerationPipelineAsync(string apiSpecBranchRef, string typespecProjectRoot, string apiVersion, string sdkReleaseType, string language, int workItemId, string sdkRepoBranch)
{
throw new NotImplementedException();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ public async Task GenerateSdk_Uses_WorkItemApi()
.ReturnsAsync(
new Octokit.PullRequest(123, null, null, null, null, null, null, null, 123, ItemState.Open, null, null, DateTimeOffset.Now, DateTimeOffset.Now, DateTimeOffset.Now, null, null, null, null, null, null, false, null, null, null, null, 0, 1, 1, 1, 1, null, false, null, null, null, labels, null));

mockDevOpsService.Setup(x => x.RunSDKGenerationPipelineAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()))
mockDevOpsService.Setup(x => x.RunSDKGenerationPipelineAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>(), It.IsAny<string>()))
.ReturnsAsync(new Build()
{
Id = 100,
Expand All @@ -208,6 +208,7 @@ public async Task GenerateSdk_Uses_WorkItemApi()
pullRequestNumber: 123,
workItemId: 456
);

Assert.That(result.ToString(), Does.Contain("Azure DevOps pipeline https://dev.azure.com/azure-sdk/internal/_build/results?buildId=100 has been initiated to generate the SDK. Build ID is 100"));
}

Expand All @@ -219,7 +220,7 @@ public async Task GenerateSdk_Without_pr_and_workitem()
mockTypeSpecHelper.Setup(x => x.IsValidTypeSpecProjectPath(It.IsAny<string>()))
.Returns(true);

mockDevOpsService.Setup(x => x.RunSDKGenerationPipelineAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()))
mockDevOpsService.Setup(x => x.RunSDKGenerationPipelineAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>(), It.IsAny<string>()))
.ReturnsAsync(new Build()
{
Id = 100,
Expand All @@ -243,7 +244,7 @@ public async Task GenerateSdk_With_pr_and_no_workitem()
mockTypeSpecHelper.Setup(x => x.IsValidTypeSpecProjectPath(It.IsAny<string>()))
.Returns(true);

mockDevOpsService.Setup(x => x.RunSDKGenerationPipelineAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()))
mockDevOpsService.Setup(x => x.RunSDKGenerationPipelineAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>(), It.IsAny<string>()))
.ReturnsAsync(new Build()
{
Id = 100,
Expand Down
13 changes: 7 additions & 6 deletions tools/azsdk-cli/Azure.Sdk.Tools.Cli/Services/DevOpsService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ public interface IDevOpsService
public Task<ReleasePlanDetails> GetReleasePlanForWorkItemAsync(int workItemId);
public Task<ReleasePlanDetails> GetReleasePlanAsync(string pullRequestUrl);
public Task<WorkItem> CreateReleasePlanWorkItemAsync(ReleasePlanDetails releasePlan);
public Task<Build> RunSDKGenerationPipelineAsync(string branchRef, string typespecProjectRoot, string apiVersion, string sdkReleaseType, string language, int workItemId);
public Task<Build> RunSDKGenerationPipelineAsync(string apiSpecBranchRef, string typespecProjectRoot, string apiVersion, string sdkReleaseType, string language, int workItemId, string sdkRepoBranch = "");
public Task<Build> GetPipelineRunAsync(int buildId);
public Task<string> GetSDKPullRequestFromPipelineRunAsync(int buildId, string language, int workItemId);
public Task<bool> AddSdkInfoInReleasePlanAsync(int workItemId, string language, string sdkGenerationPipelineUrl, string sdkPullRequestUrl);
Expand All @@ -98,7 +98,7 @@ public interface IDevOpsService
public Task<bool> UpdateSpecPullRequestAsync(int releasePlanWorkItemId, string specPullRequest);
public Task<bool> LinkNamespaceApprovalIssueAsync(int releasePlanWorkItemId, string url);
public Task<PackageResponse> GetPackageWorkItemAsync(string packageName, string language, string packageVersion = "");
public Task<Build> RunPipelineAsync(int pipelineDefinitionId, Dictionary<string, string> templateParams, string branchRef = "main");
public Task<Build> RunPipelineAsync(int pipelineDefinitionId, Dictionary<string, string> templateParams, string apiSpecBranchRef = "main");
public Task<Dictionary<string, List<string>>> GetPipelineLlmArtifacts(string project, int buildId);
}

Expand Down Expand Up @@ -540,7 +540,7 @@ public static bool IsSDKGenerationSupported(string language)
};
}

public async Task<Build> RunSDKGenerationPipelineAsync(string branchRef, string typespecProjectRoot, string apiVersion, string sdkReleaseType, string language, int workItemId)
public async Task<Build> RunSDKGenerationPipelineAsync(string apiSpecBranchRef, string typespecProjectRoot, string apiVersion, string sdkReleaseType, string language, int workItemId, string sdkRepoBranch = "")
{
int pipelineDefinitionId = GetPipelineDefinitionId(language);
if (pipelineDefinitionId == 0)
Expand All @@ -550,14 +550,15 @@ public async Task<Build> RunSDKGenerationPipelineAsync(string branchRef, string

var templateParams = new Dictionary<string, string>
{
{ "SdkRepoBranch", sdkRepoBranch},
{ "ConfigType", "TypeSpec"},
{ "ConfigPath", $"{typespecProjectRoot}/tspconfig.yaml" },
{ "ApiVersion", apiVersion },
{ "SdkReleaseType", sdkReleaseType },
{ "CreatePullRequest", "true" },
{ "ReleasePlanWorkItemId", $"{workItemId}"}
};
var build = await RunPipelineAsync(pipelineDefinitionId, templateParams, branchRef);
var build = await RunPipelineAsync(pipelineDefinitionId, templateParams, apiSpecBranchRef);
var pipelineRunUrl = GetPipelineUrl(build.Id);
logger.LogInformation($"Started pipeline run {pipelineRunUrl} to generate SDK.");
if (workItemId != 0)
Expand All @@ -569,7 +570,7 @@ public async Task<Build> RunSDKGenerationPipelineAsync(string branchRef, string
return build;
}

public async Task<Build> RunPipelineAsync(int pipelineDefinitionId, Dictionary<string, string> templateParams, string branchRef = "main")
public async Task<Build> RunPipelineAsync(int pipelineDefinitionId, Dictionary<string, string> templateParams, string apiSpecBranchRef = "main")
{
if (pipelineDefinitionId == 0)
{
Expand All @@ -587,7 +588,7 @@ public async Task<Build> RunPipelineAsync(int pipelineDefinitionId, Dictionary<s
{
Definition = definition,
Project = project,
SourceBranch = branchRef,
SourceBranch = apiSpecBranchRef,
TemplateParameters = templateParams
});
return build;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,14 +325,28 @@ public async Task<SDKWorkflowResponse> RunGenerateSdkAsync(string typespecProjec
}

string typeSpecProjectPath = typespecHelper.GetTypeSpecProjectRelativePath(typespecProjectRoot);
string branchRef = "main";
string apiSpecBranchRef = "main";
if (pullRequestNumber > 0)
{
var pullRequest = await githubService.GetPullRequestAsync(REPO_OWNER, PUBLIC_SPECS_REPO, pullRequestNumber);
branchRef = (pullRequest?.Merged ?? false) ? pullRequest.Base.Ref : $"refs/pull/{pullRequestNumber}/merge";
apiSpecBranchRef = (pullRequest?.Merged ?? false) ? pullRequest.Base.Ref : $"refs/pull/{pullRequestNumber}/merge";
}

string sdkRepoBranch = "";
var releasePlan = workItemId != 0 ? await devopsService.GetReleasePlanForWorkItemAsync(workItemId) : null;
var sdkPullRequestUrl = releasePlan?.SDKInfo.FirstOrDefault(s => s.Language == language)?.SdkPullRequestUrl;
if (!string.IsNullOrEmpty(sdkPullRequestUrl))
{
var parsedUrl = DevOpsService.ParseSDKPullRequestUrl(sdkPullRequestUrl);
var sdkPullRequest = await githubService.GetPullRequestAsync(parsedUrl.RepoOwner, parsedUrl.RepoName, parsedUrl.PrNumber);
if (sdkPullRequest is not null && sdkPullRequest.State != "closed" && sdkPullRequest.Merged == false)
{
sdkRepoBranch = sdkPullRequest.Head.Ref;
}
}

logger.LogInformation("Running SDK generation pipeline");
var pipelineRun = await devopsService.RunSDKGenerationPipelineAsync(branchRef, typeSpecProjectPath, apiVersion, sdkReleaseType, language, workItemId);
var pipelineRun = await devopsService.RunSDKGenerationPipelineAsync(apiSpecBranchRef, typeSpecProjectPath, apiVersion, sdkReleaseType, language, workItemId, sdkRepoBranch);
response = new SDKWorkflowResponse()
{
Status = "Success",
Expand Down