Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
126 commits
Select commit Hold shift + click to select a range
a249286
squash!
NikolaRHristov Mar 17, 2024
134754f
squash!
NikolaRHristov Mar 17, 2024
e035df1
squash!
NikolaRHristov Mar 18, 2024
ec5b6cc
squash!
NikolaRHristov Mar 18, 2024
dc3b913
squash!
NikolaRHristov Mar 18, 2024
da4a243
squash!
NikolaRHristov Mar 19, 2024
94e558c
squash!
NikolaRHristov Mar 20, 2024
fcf419d
squash!
NikolaRHristov Mar 21, 2024
8d6f558
squash!
NikolaRHristov Mar 21, 2024
279e738
squash!
NikolaRHristov Mar 22, 2024
5b99f14
squash!
NikolaRHristov Mar 24, 2024
4270f02
squash!
NikolaRHristov Mar 24, 2024
9ddf287
squash!
NikolaRHristov Apr 30, 2024
abe0703
squash!
NikolaRHristov May 1, 2024
966a84e
squash!
NikolaRHristov May 1, 2024
9b29535
squash!
NikolaRHristov May 1, 2024
7c054b9
squash!
NikolaRHristov May 2, 2024
8d772c0
squash!
NikolaRHristov May 2, 2024
38ea724
Merge branch 'Current' of ssh://github.com/CodeEditorLand/LandDeployA…
NikolaRHristov May 5, 2024
ae2705f
squash!
NikolaRHristov May 6, 2024
8570591
squash!
NikolaRHristov May 6, 2024
2584e0c
squash!
NikolaRHristov May 7, 2024
29fc183
squash!
NikolaRHristov May 7, 2024
d455a57
squash!
NikolaRHristov May 17, 2024
5b4d4a5
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov May 20, 2024
17bbda8
squash!
NikolaRHristov May 20, 2024
b053b39
squash!
NikolaRHristov May 21, 2024
3244e35
squash!
NikolaRHristov May 21, 2024
2b63a91
squash!
NikolaRHristov May 23, 2024
f951b9e
squash!
NikolaRHristov May 23, 2024
30e8a18
squash!
NikolaRHristov May 24, 2024
5b9d19e
squash!
NikolaRHristov May 26, 2024
c9ae0cd
squash!
NikolaRHristov May 26, 2024
72be27f
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov May 27, 2024
dda6681
squash!
NikolaRHristov May 27, 2024
d035943
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 1, 2024
5fe6278
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 3, 2024
3d41c89
squash!
NikolaRHristov Jun 5, 2024
e42e899
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 6, 2024
1790e48
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 8, 2024
fbcfa5c
squash!
NikolaRHristov Jun 8, 2024
4b89dd6
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 9, 2024
2392b50
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 9, 2024
1e681e3
squash!
NikolaRHristov Jun 9, 2024
e5fec65
squash!
NikolaRHristov Jun 9, 2024
aa2b29d
squash!
NikolaRHristov Jun 11, 2024
74a0e7c
squash!
NikolaRHristov Jun 11, 2024
f6c1968
squash!
NikolaRHristov Jun 12, 2024
362537f
squash!
NikolaRHristov Jun 12, 2024
2e0bdda
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 13, 2024
fac927a
squash!
NikolaRHristov Jun 13, 2024
d1d70e5
squash!
NikolaRHristov Jun 16, 2024
dfd0b8a
Merge branch 'Current' of ssh://github.com/CodeEditorLand/LandDeployA…
NikolaRHristov Jun 17, 2024
04a6612
squash!
NikolaRHristov Jun 18, 2024
bbff518
squash!
NikolaRHristov Jun 18, 2024
37193dd
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 19, 2024
1ab037d
squash!
NikolaRHristov Jun 19, 2024
fbf3415
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 19, 2024
a4b306c
squash!
NikolaRHristov Jun 20, 2024
f30b0ff
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 20, 2024
69afba3
squash!
NikolaRHristov Jun 20, 2024
91b599e
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 20, 2024
76c22e5
squash!
NikolaRHristov Jun 20, 2024
67871a7
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 21, 2024
a942907
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 22, 2024
ceb15f6
squash!
NikolaRHristov Jun 22, 2024
c4bc6d2
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jun 23, 2024
84c3320
squash!
NikolaRHristov Jun 23, 2024
9ac0bc4
squash!
NikolaRHristov Jun 24, 2024
4dbd3e0
squash!
NikolaRHristov Jun 27, 2024
8bee952
squash!
NikolaRHristov Jun 27, 2024
da43b23
squash!
NikolaRHristov Jun 27, 2024
94ec806
squash!
NikolaRHristov Jun 30, 2024
7fddeaf
squash!
NikolaRHristov Jun 30, 2024
2fa5b23
squash!
NikolaRHristov Jul 8, 2024
8715815
squash!
NikolaRHristov Jul 9, 2024
614bd68
squash!
NikolaRHristov Jul 10, 2024
51bb785
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jul 12, 2024
c8cfa98
squash!
NikolaRHristov Jul 13, 2024
145608e
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jul 13, 2024
93c1d40
squash!
NikolaRHristov Jul 14, 2024
c3b7155
squash!
NikolaRHristov Jul 14, 2024
89ee700
Merge branch 'Current' of ssh://github.com/CodeEditorLand/LandDeployA…
NikolaRHristov Jul 14, 2024
ea9e3f0
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Jul 14, 2024
8ac58b9
squash!
NikolaRHristov Jul 15, 2024
51c986b
squash!
NikolaRHristov Jul 15, 2024
ee5078a
NikolaRHristov Jul 17, 2024
dd8281d
NikolaRHristov Jul 18, 2024
5375a80
NikolaRHristov Jul 19, 2024
6b570cb
NikolaRHristov Jul 19, 2024
c90486b
Merge branch 'Current' of ssh://github.com/CodeEditorLand/LandDeployA…
NikolaRHristov Jul 19, 2024
c52ccbb
NikolaRHristov Jul 22, 2024
e37820b
NikolaRHristov Jul 23, 2024
be94f27
NikolaRHristov Jul 24, 2024
86e5039
NikolaRHristov Jul 25, 2024
d32ad96
Merge branch 'Current' of ssh://github.com/CodeEditorLand/LandDeployA…
NikolaRHristov Jul 25, 2024
9dee061
NikolaRHristov Jul 25, 2024
d55ac0c
NikolaRHristov Jul 25, 2024
5285f9e
NikolaRHristov Jul 27, 2024
f103965
NikolaRHristov Jul 27, 2024
f09a5bb
NikolaRHristov Jul 27, 2024
22ea70d
NikolaRHristov Jul 27, 2024
27cc767
NikolaRHristov Jul 28, 2024
558d5da
NikolaRHristov Aug 1, 2024
5adbe54
NikolaRHristov Aug 8, 2024
e8385f7
NikolaRHristov Aug 18, 2024
a7948fc
NikolaRHristov Aug 22, 2024
4c3f2e3
NikolaRHristov Aug 22, 2024
3c79dfa
NikolaRHristov Aug 24, 2024
f578a8d
Merge branch 'Current' of ssh://github.com/CodeEditorLand/LandDeployA…
NikolaRHristov Aug 24, 2024
4336901
NikolaRHristov Aug 25, 2024
fe7ff7a
NikolaRHristov Aug 25, 2024
92e4e5e
NikolaRHristov Aug 26, 2024
1fe9c13
NikolaRHristov Aug 27, 2024
0006832
NikolaRHristov Aug 27, 2024
b23bc8b
NikolaRHristov Aug 27, 2024
7fccd6d
NikolaRHristov Aug 28, 2024
820b36b
NikolaRHristov Aug 30, 2024
03d1031
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Sep 10, 2024
6ee4d23
NikolaRHristov Sep 10, 2024
404ad3b
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Sep 10, 2024
f52439c
NikolaRHristov Sep 10, 2024
41aaee4
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Sep 10, 2024
6176f58
NikolaRHristov Sep 10, 2024
f745f83
Merge remote-tracking branch 'Parent/master' into Current
NikolaRHristov Sep 11, 2024
1dd2a99
Bump node-fetch from 2.6.0 to 2.7.0 in /.azure-pipelines/github-release
dependabot[bot] Sep 12, 2024
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
28 changes: 25 additions & 3 deletions .azure-pipelines/github-release/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 43 additions & 0 deletions Source/configure/activate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import * as vscode from 'vscode';
import { AzureTreeItem, createApiProvider, IActionContext, registerCommand } from 'vscode-azureextensionui';
import { AzureExtensionApi, AzureExtensionApiProvider } from 'vscode-azureextensionui/api';
import { browsePipeline } from './browse';
import { configurePipeline } from './configure';
import { telemetryHelper } from './helper/telemetryHelper';
import { AzureAccountExtensionExports, extensionVariables, IResourceNode } from './model/models';
import { Messages } from './resources/messages';

export async function activateConfigurePipeline(): Promise<AzureExtensionApiProvider> {
let azureAccountExtension = vscode.extensions.getExtension("ms-vscode.azure-account");
if (!azureAccountExtension) {
throw new Error(Messages.azureAccountExntesionUnavailable);
}

if (!azureAccountExtension.isActive) {
await azureAccountExtension.activate();
}

extensionVariables.azureAccountExtensionApi = <AzureAccountExtensionExports>azureAccountExtension.exports;

// The command has been defined in the package.json file
// Now provide the implementation of the command with registerCommand
// The commandId parameter must match the command field in package.json
registerCommand('configure-cicd-pipeline', async (actionContext: IActionContext, node: IResourceNode | vscode.Uri) => {
// The code you place here will be executed every time your command is executed
telemetryHelper.initialize(actionContext, 'configure-cicd-pipeline');
await configurePipeline(node);
});

registerCommand('browse-cicd-pipeline', async (actionContext: IActionContext, node: AzureTreeItem) => {
// The code you place here will be executed every time your command is executed
telemetryHelper.initialize(actionContext, 'browse-cicd-pipeline');
await browsePipeline(node);
});

return createApiProvider([<AzureExtensionApi>
{
configurePipelineApi: configurePipeline,
browsePipeline: browsePipeline,
apiVersion: "0.0.1"
}]);
}
100 changes: 100 additions & 0 deletions Source/configure/browse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import * as vscode from 'vscode';
import { AzureTreeItem, UserCancelledError } from 'vscode-azureextensionui';
import { AppServiceClient, ScmType } from './clients/azure/appServiceClient';
import { getSubscriptionSession } from './helper/azureSessionHelper';
import { ControlProvider } from './helper/controlProvider';
import { Result, telemetryHelper } from './helper/telemetryHelper';
import { AzureSession, extensionVariables, ParsedAzureResourceId } from './model/models';
import * as constants from './resources/constants';
import { Messages } from './resources/messages';
import { TelemetryKeys } from './resources/telemetryKeys';
import { TracePoints } from './resources/tracePoints';

const Layer = 'browsePipeline';

export async function browsePipeline(node: AzureTreeItem): Promise<void> {
await telemetryHelper.executeFunctionWithTimeTelemetry(async () => {
try {
if (!!node && !!node.fullId) {
let parsedAzureResourceId: ParsedAzureResourceId = new ParsedAzureResourceId(node.fullId);
let session: AzureSession = await getSubscriptionSession(parsedAzureResourceId.subscriptionId);
let appServiceClient = new AppServiceClient(session.credentials, session.environment, session.tenantId, parsedAzureResourceId.subscriptionId);
await browsePipelineInternal(node.fullId, appServiceClient);
}
else {
throw new Error(Messages.didNotRecieveAzureResourceNodeToProcess);
}
}
catch (error) {
if (!(error instanceof UserCancelledError)) {
extensionVariables.outputChannel.appendLine(error.message);
vscode.window.showErrorMessage(error.message);
telemetryHelper.setResult(Result.Failed, error);
}
else {
telemetryHelper.setResult(Result.Canceled, error);
}
}
}, TelemetryKeys.CommandExecutionDuration);
}

async function browsePipelineInternal(resourceId: string, appServiceClient: AppServiceClient): Promise<void> {
let siteConfig = await appServiceClient.getAppServiceConfig(resourceId);
let scmType = !!siteConfig && !!siteConfig.scmType && siteConfig.scmType.toLowerCase();
telemetryHelper.setTelemetry(TelemetryKeys.ScmType, scmType);

if (scmType === ScmType.VSTSRM.toLowerCase()) {
await browseAzurePipeline(resourceId, appServiceClient);
}
else if (scmType === ScmType.GITHUBACTION.toLowerCase() && extensionVariables.enableGitHubWorkflow) {
await browseGitHubWorkflow(resourceId, appServiceClient);
}
else if (scmType === '' || scmType === ScmType.NONE.toLowerCase()) {
let deployToAzureAction = 'Deploy to Azure';
let controlProvider = new ControlProvider();
let result = await controlProvider.showInformationBox(
constants.BrowseNotAvailableConfigurePipeline,
Messages.browseNotAvailableConfigurePipeline,
deployToAzureAction);

if (result === deployToAzureAction) {
vscode.commands.executeCommand('configure-pipeline', { fullId: resourceId });
telemetryHelper.setTelemetry(TelemetryKeys.ClickedConfigurePipeline, 'true');
}
}
else {
await openDeploymentCenter(resourceId, appServiceClient);
}
}

async function browseAzurePipeline(resourceId: string, appServiceClient: AppServiceClient): Promise<void> {
try {
let pipelineUrl = await appServiceClient.getAzurePipelineUrl(resourceId);
vscode.env.openExternal(vscode.Uri.parse(pipelineUrl));
telemetryHelper.setTelemetry(TelemetryKeys.BrowsedExistingPipeline, 'true');
}
catch (ex) {
telemetryHelper.logError(Layer, TracePoints.CorruptMetadataForVstsRmScmType, ex);
await openDeploymentCenter(resourceId, appServiceClient);
}
}

async function browseGitHubWorkflow(resourceId: string, appServiceClient: AppServiceClient): Promise<void> {
let webAppSourceControl = await appServiceClient.getSourceControl(resourceId);
let webAppMetaData = await appServiceClient.getAppServiceMetadata(resourceId);

if (!!webAppSourceControl && !!webAppSourceControl.properties && webAppSourceControl.properties.isGitHubAction) {
let url = `${webAppSourceControl.properties.repoUrl}/actions?query=${encodeURI("workflow:\"" + (!!webAppMetaData.properties.configName ? webAppMetaData.properties.configName : webAppMetaData.properties.configPath) + "\"")}`;
await vscode.env.openExternal(vscode.Uri.parse(url));
telemetryHelper.setTelemetry(TelemetryKeys.BrowsedExistingPipeline, 'true');
}
else {
await openDeploymentCenter(resourceId, appServiceClient);
}
}

async function openDeploymentCenter(resourceId: string, appServiceClient: AppServiceClient): Promise<void> {
let deploymentCenterUrl: string = await appServiceClient.getDeploymentCenterUrl(resourceId);
await vscode.env.openExternal(vscode.Uri.parse(deploymentCenterUrl));
telemetryHelper.setTelemetry(TelemetryKeys.BrowsedDeploymentCenter, 'true');
}
6 changes: 6 additions & 0 deletions Source/configure/clients/IProvisioningServiceClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { ProvisioningConfiguration } from "../model/provisioningConfiguration";

export interface IProvisioningServiceClient {
createProvisioningConfiguration(provisioningConfiguration: ProvisioningConfiguration, githubOrg: string, repositoryId: string): Promise<ProvisioningConfiguration>;
getProvisioningConfiguration(jobId: string, githubOrg: string, repositoryId: string): Promise<ProvisioningConfiguration>;
}
12 changes: 12 additions & 0 deletions Source/configure/clients/ITemplateServiceClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { RepositoryAnalysis } from "azureintegration-repoanalysis-client-internal";
import { ExtendedPipelineTemplate } from "../model/Contracts";
import { StringMap } from "../model/models";
import { TemplateInfo } from "../model/templateModels";

export interface ITemplateServiceClient {
getTemplates(body: RepositoryAnalysis): Promise<TemplateInfo[]>;
getTemplateParameters(templateId: string): Promise<ExtendedPipelineTemplate>;
getTemplateConfiguration(templateId: string, inputs: StringMap<string>): Promise<ExtendedPipelineTemplate>;
getTemplateFile(templateId: string, fileName: string): Promise<{ id: string, content: string }[]>;
getTemplatesInfoByFilter(language: string, deployTargetFilter?: string, buildTargetFilter?: string): Promise<TemplateInfo[]>;
}
52 changes: 52 additions & 0 deletions Source/configure/clients/ProvisioningServiceClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { ServiceClientCredentials, UrlBasedRequestPrepareOptions } from "ms-rest";
import { IServiceUrlDefinition, ServiceFramework } from "../helper/remoteServiceUrlHelper";
import { ProvisioningConfiguration } from "../model/provisioningConfiguration";
import { IProvisioningServiceClient } from "./IProvisioningServiceClient";
import { RestClient } from "./restClient";

export class ProvisioningServiceClient implements IProvisioningServiceClient {
private restClient: RestClient;
private serviceDefinition: IServiceUrlDefinition;
private defaultHeaders: { [propertyName: string]: string };
private defaultParameters: { [propertyName: string]: string };
private readonly pipelineProvisioningJob = "PipelineProvisioningJob";
private readonly PEProvisioningServiceAPIVersion = "6.1-preview.1";

constructor(serviceDefinition: IServiceUrlDefinition, headers: { [propertyName: string]: string }, credentials: ServiceClientCredentials) {
this.restClient = new RestClient(credentials);
this.serviceDefinition = serviceDefinition;
this.defaultHeaders = headers;
if (this.serviceDefinition.serviceFramework === ServiceFramework.Vssf) {
this.defaultParameters = { "api-version": this.PEProvisioningServiceAPIVersion };
}
}

public async createProvisioningConfiguration(provisioningConfiguration: ProvisioningConfiguration, githubOrg: string, repositoryId: string): Promise<ProvisioningConfiguration> {
const requestUrl = this.serviceDefinition.serviceUrl + githubOrg + "/" + repositoryId + "/" + this.pipelineProvisioningJob;

return this.restClient.sendRequest(<UrlBasedRequestPrepareOptions>{
url: requestUrl,
method: "POST",
headers: this.defaultHeaders,
queryParameters: this.defaultParameters,
body: provisioningConfiguration,
serializationMapper: null,
deserializationMapper: null,
}
);
}

public async getProvisioningConfiguration(jobId: string, githubOrg: string, repositoryId: string): Promise<ProvisioningConfiguration> {
const requestUrl = this.serviceDefinition.serviceUrl + githubOrg + "/" + repositoryId + "/" + this.pipelineProvisioningJob + "/" + jobId;

return this.restClient.sendRequest(<UrlBasedRequestPrepareOptions>{
url: requestUrl,
method: "GET",
headers: this.defaultHeaders,
queryParameters: this.defaultParameters,
serializationMapper: null,
deserializationMapper: null,
}
);
}
}
43 changes: 43 additions & 0 deletions Source/configure/clients/TemplateServiceClientFactory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { ServiceClientCredentials, TokenCredentials } from "ms-rest";
import { RemoteServiceUrlHelper, ServiceFramework } from "../helper/remoteServiceUrlHelper";
import { Messages } from '../resources/messages';
import { TemplateServiceClient } from "./github/TemplateServiceClient";
import { ITemplateServiceClient } from "./ITemplateServiceClient";
const UserAgent = "deploy-to-azure-vscode";

export class TemplateServiceClientFactory {

public static async getClient(): Promise<ITemplateServiceClient> {
if (!!this.client) {
return this.client;
}

if (!this.githubPatToken || !this.credentials) {
throw new Error(Messages.UndefinedClientCredentials);
}

const serviceDefinition = await RemoteServiceUrlHelper.getTemplateServiceDefinition();
if (serviceDefinition.serviceFramework === ServiceFramework.Vssf) {
this.client = new TemplateServiceClient(serviceDefinition.serviceUrl, this.credentials, {
"Content-Type": "application/json; charset=utf-8"
});
} else {
this.client = new TemplateServiceClient(serviceDefinition.serviceUrl, new TokenCredentials(this.githubPatToken, "token"), {
"User-Agent": UserAgent,
"Content-Type": "application/json; charset=utf-8"
});
}

return this.client;
}

public static initialize(credentials: ServiceClientCredentials, githubPatToken: string): void {
this.client = null;
this.credentials = credentials;
this.githubPatToken = githubPatToken
}

private static client: ITemplateServiceClient;
private static credentials: ServiceClientCredentials;
private static githubPatToken: string;
}
Loading