azure-pipelines-tasks-azurermdeploycommon 3.222.0 → 3.222.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,11 +12,12 @@ export declare class AzureAppServiceUtility {
12
12
  private getKuduAuthHeader;
13
13
  getPhysicalPath(virtualApplication: string): Promise<string>;
14
14
  updateConfigurationSettings(properties: any, formatJSON?: boolean): Promise<void>;
15
- updateAndMonitorAppSettings(addProperties?: any, deleteProperties?: any, formatJSON?: boolean): Promise<boolean>;
15
+ updateAndMonitorAppSettings(addProperties?: any, deleteProperties?: any, formatJSON?: boolean, perSlot?: boolean): Promise<boolean>;
16
16
  updateConnectionStrings(addProperties: any): Promise<boolean>;
17
17
  enableRenameLockedFiles(): Promise<void>;
18
18
  updateStartupCommandAndRuntimeStack(runtimeStack: string, startupCommand?: string): Promise<void>;
19
19
  isSitePublishingCredentialsEnabled(): Promise<boolean>;
20
20
  private _getPhysicalToVirtualPathMap;
21
21
  private _getNewMetadata;
22
+ isFunctionAppOnCentauri(): Promise<boolean>;
22
23
  }
@@ -205,7 +205,7 @@ class AzureAppServiceUtility {
205
205
  console.log(tl.loc('UpdatedAppServiceConfigurationSettings'));
206
206
  });
207
207
  }
208
- updateAndMonitorAppSettings(addProperties, deleteProperties, formatJSON) {
208
+ updateAndMonitorAppSettings(addProperties, deleteProperties, formatJSON, perSlot = true) {
209
209
  return __awaiter(this, void 0, void 0, function* () {
210
210
  if (formatJSON) {
211
211
  var appSettingsProperties = {};
@@ -240,7 +240,9 @@ class AzureAppServiceUtility {
240
240
  else {
241
241
  console.log(tl.loc('AppServiceApplicationSettingsAlreadyPresent'));
242
242
  }
243
- yield this._appService.patchApplicationSettingsSlot(addProperties);
243
+ if (perSlot) {
244
+ yield this._appService.patchApplicationSettingsSlot(addProperties);
245
+ }
244
246
  return isNewValueUpdated;
245
247
  });
246
248
  }
@@ -390,5 +392,23 @@ class AzureAppServiceUtility {
390
392
  }
391
393
  return newProperties;
392
394
  }
395
+ isFunctionAppOnCentauri() {
396
+ return __awaiter(this, void 0, void 0, function* () {
397
+ try {
398
+ let details = yield this._appService.get();
399
+ if (details.properties["managedEnvironmentId"]) {
400
+ tl.debug("Function Container app is on Centauri.");
401
+ return true;
402
+ }
403
+ else {
404
+ return false;
405
+ }
406
+ }
407
+ catch (error) {
408
+ tl.debug(`Skipping Centauri check: ${error}`);
409
+ return false;
410
+ }
411
+ });
412
+ }
393
413
  }
394
414
  exports.AzureAppServiceUtility = AzureAppServiceUtility;
@@ -209,7 +209,7 @@ export class AzureAppServiceUtility {
209
209
  console.log(tl.loc('UpdatedAppServiceConfigurationSettings'));
210
210
  }
211
211
 
212
- public async updateAndMonitorAppSettings(addProperties?: any, deleteProperties?: any, formatJSON?: boolean): Promise<boolean> {
212
+ public async updateAndMonitorAppSettings(addProperties?: any, deleteProperties?: any, formatJSON?: boolean, perSlot: boolean = true): Promise<boolean> {
213
213
  if(formatJSON) {
214
214
  var appSettingsProperties = {};
215
215
  for(var property in addProperties) {
@@ -251,7 +251,9 @@ export class AzureAppServiceUtility {
251
251
  console.log(tl.loc('AppServiceApplicationSettingsAlreadyPresent'));
252
252
  }
253
253
 
254
- await this._appService.patchApplicationSettingsSlot(addProperties);
254
+ if (perSlot) {
255
+ await this._appService.patchApplicationSettingsSlot(addProperties);
256
+ }
255
257
  return isNewValueUpdated;
256
258
  }
257
259
 
@@ -413,4 +415,21 @@ export class AzureAppServiceUtility {
413
415
  return newProperties;
414
416
  }
415
417
 
418
+ public async isFunctionAppOnCentauri(): Promise<boolean>{
419
+ try{
420
+ let details: any = await this._appService.get();
421
+ if (details.properties["managedEnvironmentId"]){
422
+ tl.debug("Function Container app is on Centauri.");
423
+ return true;
424
+ }
425
+ else{
426
+ return false;
427
+ }
428
+ }
429
+ catch(error){
430
+ tl.debug(`Skipping Centauri check: ${error}`);
431
+ return false;
432
+ }
433
+ }
434
+
416
435
  }
@@ -5,16 +5,6 @@ export declare class ContainerBasedDeploymentUtility {
5
5
  constructor(appService: AzureAppService);
6
6
  deployWebAppImage(properties: any, restart?: boolean): Promise<void>;
7
7
  private _updateConfigurationDetails;
8
- private _getAzureContainerImageName;
9
- private _getDockerHubImageName;
10
- private _constructImageName;
11
- private _getPrivateRegistryImageName;
12
- private _updateWebAppSettings;
13
- private _getImageName;
14
- private _getContainerRegistrySettings;
15
- private _getAzureContainerRegistrySettings;
16
- private _getDockerPrivateRegistrySettings;
17
- private _deleteRegistryConnectionSettings;
18
8
  private updateImagesInConfigFile;
19
9
  private tokenizeImages;
20
10
  }
@@ -11,19 +11,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.ContainerBasedDeploymentUtility = void 0;
13
13
  const tl = require("azure-pipelines-task-lib/task");
14
- const url = require("url");
15
- const util = require("util");
16
14
  const ParameterParserUtility_1 = require("./ParameterParserUtility");
17
15
  const AzureAppServiceUtility_1 = require("./AzureAppServiceUtility");
18
16
  const fs = require("fs");
19
17
  const path = require("path");
20
18
  var deployUtility = require('../webdeployment-common/utility.js');
21
- var registryTypes;
22
- (function (registryTypes) {
23
- registryTypes[registryTypes["AzureContainerRegistry"] = 0] = "AzureContainerRegistry";
24
- registryTypes[registryTypes["Registry"] = 1] = "Registry";
25
- registryTypes[registryTypes["PrivateRegistry"] = 2] = "PrivateRegistry";
26
- })(registryTypes || (registryTypes = {}));
27
19
  class ContainerBasedDeploymentUtility {
28
20
  constructor(appService) {
29
21
  this._appService = appService;
@@ -83,128 +75,6 @@ class ContainerBasedDeploymentUtility {
83
75
  yield this._appServiceUtility.updateConfigurationSettings(appSettingsNewProperties);
84
76
  });
85
77
  }
86
- _getAzureContainerImageName() {
87
- var registry = tl.getInput('AzureContainerRegistryLoginServer', true) + ".azurecr.io";
88
- var image = tl.getInput('AzureContainerRegistryImage', true);
89
- var tag = tl.getInput('AzureContainerRegistryTag', false);
90
- return this._constructImageName(registry, image, tag);
91
- }
92
- _getDockerHubImageName() {
93
- var namespace = tl.getInput('DockerNamespace', true);
94
- var image = tl.getInput('DockerRepository', true);
95
- var tag = tl.getInput('DockerImageTag', false);
96
- return this._constructImageName(namespace, image, tag);
97
- }
98
- _constructImageName(namespace, repository, tag) {
99
- var imageName = null;
100
- /*
101
- Special Case : If release definition is not linked to build artifacts
102
- then $(Build.BuildId) variable don't expand in release. So clearing state
103
- of dockerImageTag if $(Build.BuildId) not expanded in value of dockerImageTag.
104
- */
105
- if (tag && (tag.trim() == "$(Build.BuildId)")) {
106
- tag = null;
107
- }
108
- if (tag) {
109
- imageName = namespace.toLowerCase() + "/" + repository.toLowerCase() + ":" + tag;
110
- }
111
- else {
112
- imageName = namespace.toLowerCase() + "/" + repository.toLowerCase();
113
- }
114
- return imageName.replace(/ /g, "");
115
- }
116
- _getPrivateRegistryImageName() {
117
- var registryConnectedServiceName = tl.getInput('RegistryConnectedServiceName', true);
118
- var loginServer = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'url', true);
119
- var registry = url.parse(loginServer).hostname;
120
- var image = tl.getInput('PrivateRegistryImage', true);
121
- var tag = tl.getInput('PrivateRegistryTag', false);
122
- return this._constructImageName(registry, image, tag);
123
- }
124
- _updateWebAppSettings(appSettingsParameters, webAppSettings) {
125
- // In case of public repo, clear the connection details of a registry
126
- var dockerRespositoryAccess = tl.getInput('DockerRepositoryAccess', true);
127
- // Uncomment the below lines while supprting all registry types.
128
- // if(dockerRespositoryAccess === "public")
129
- // {
130
- // deleteRegistryConnectionSettings(webAppSettings);
131
- // }
132
- var parsedAppSettings = ParameterParserUtility_1.parse(appSettingsParameters);
133
- for (var settingName in parsedAppSettings) {
134
- var setting = settingName.trim();
135
- var settingVal = parsedAppSettings[settingName].value;
136
- settingVal = settingVal ? settingVal.trim() : "";
137
- if (setting) {
138
- webAppSettings["properties"][setting] = settingVal;
139
- }
140
- }
141
- }
142
- _getImageName() {
143
- var registryType = tl.getInput('ImageSource', true);
144
- var imageName = null;
145
- switch (registryType) {
146
- case registryTypes[registryTypes.AzureContainerRegistry]:
147
- imageName = this._getAzureContainerImageName();
148
- break;
149
- case registryTypes[registryTypes.Registry]:
150
- imageName = this._getDockerHubImageName();
151
- break;
152
- case registryTypes[registryTypes.PrivateRegistry]:
153
- imageName = this._getPrivateRegistryImageName();
154
- break;
155
- }
156
- return imageName;
157
- }
158
- _getContainerRegistrySettings(imageName, endPoint) {
159
- return __awaiter(this, void 0, void 0, function* () {
160
- var containerRegistryType = 'Registry';
161
- var containerRegistrySettings = "-DOCKER_CUSTOM_IMAGE_NAME " + imageName;
162
- var containerRegistryAuthParamsFormatString = "-DOCKER_REGISTRY_SERVER_URL %s -DOCKER_REGISTRY_SERVER_USERNAME %s -DOCKER_REGISTRY_SERVER_PASSWORD %s";
163
- switch (containerRegistryType) {
164
- case registryTypes[registryTypes.AzureContainerRegistry]:
165
- containerRegistrySettings = yield this._getAzureContainerRegistrySettings(endPoint, containerRegistrySettings, containerRegistryAuthParamsFormatString);
166
- break;
167
- case registryTypes[registryTypes.Registry]:
168
- var dockerRespositoryAccess = tl.getInput('DockerRepositoryAccess', false);
169
- if (dockerRespositoryAccess === "private") {
170
- containerRegistrySettings = this._getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString);
171
- }
172
- break;
173
- case registryTypes[registryTypes.PrivateRegistry]:
174
- containerRegistrySettings = this._getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString);
175
- break;
176
- }
177
- return containerRegistrySettings;
178
- });
179
- }
180
- _getAzureContainerRegistrySettings(endPoint, containerRegistrySettings, containerRegistryAuthParamsFormatString) {
181
- return __awaiter(this, void 0, void 0, function* () {
182
- var registryServerName = tl.getInput('AzureContainerRegistryLoginServer', true);
183
- var registryUrl = "https://" + registryServerName + ".azurecr.io";
184
- tl.debug("Azure Container Registry Url: " + registryUrl);
185
- var registryName = tl.getInput('AzureContainerRegistry', true);
186
- var resourceGroupName = ''; // await azureRESTUtility.getResourceGroupName(endPoint, registryName, "Microsoft.ContainerRegistry/registries");
187
- tl.debug("Resource group name of a registry: " + resourceGroupName);
188
- var creds = null; //await azureRESTUtility.getAzureContainerRegistryCredentials(endPoint, registryName, resourceGroupName);
189
- tl.debug("Successfully retrieved the registry credentials");
190
- var username = creds.username;
191
- var password = creds["passwords"][0].value;
192
- return containerRegistrySettings + " " + util.format(containerRegistryAuthParamsFormatString, registryUrl, username, password);
193
- });
194
- }
195
- _getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString) {
196
- var registryConnectedServiceName = tl.getInput('RegistryConnectedServiceName', true);
197
- var username = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'username', true);
198
- var password = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'password', true);
199
- var registryUrl = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'registry', true);
200
- tl.debug("Docker or Private Container Registry Url: " + registryUrl);
201
- return containerRegistrySettings + " " + util.format(containerRegistryAuthParamsFormatString, registryUrl, username, password);
202
- }
203
- _deleteRegistryConnectionSettings(webAppSettings) {
204
- delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_URL"];
205
- delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_USERNAME"];
206
- delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_PASSWORD"];
207
- }
208
78
  updateImagesInConfigFile(multicontainerConfigFile, images) {
209
79
  const tempDirectory = deployUtility.getTempDirectory();
210
80
  var contents = fs.readFileSync(multicontainerConfigFile).toString();
@@ -1,6 +1,4 @@
1
1
  import tl = require('azure-pipelines-task-lib/task');
2
- import url = require('url');
3
- import util = require('util');
4
2
  import { AzureAppService } from '../azure-arm-rest/azure-arm-app-service';
5
3
  import { parse } from './ParameterParserUtility';
6
4
  import { AzureAppServiceUtility } from './AzureAppServiceUtility';
@@ -8,12 +6,6 @@ import fs = require('fs');
8
6
  import path = require('path');
9
7
  var deployUtility = require('../webdeployment-common/utility.js');
10
8
 
11
- enum registryTypes {
12
- "AzureContainerRegistry",
13
- "Registry", // TODO: Rename it to DockerHub while supporting all the registry types. Also add all these registry types in Task.json in ImageSource pick list.
14
- "PrivateRegistry"
15
- }
16
-
17
9
  export class ContainerBasedDeploymentUtility {
18
10
  private _appService: AzureAppService;
19
11
  private _appServiceUtility: AzureAppServiceUtility;
@@ -81,156 +73,6 @@ export class ContainerBasedDeploymentUtility {
81
73
  await this._appServiceUtility.updateConfigurationSettings(appSettingsNewProperties);
82
74
  }
83
75
 
84
- private _getAzureContainerImageName(): string {
85
- var registry = tl.getInput('AzureContainerRegistryLoginServer', true) + ".azurecr.io";
86
- var image = tl.getInput('AzureContainerRegistryImage', true);
87
- var tag = tl.getInput('AzureContainerRegistryTag', false);
88
-
89
- return this._constructImageName(registry, image, tag);
90
- }
91
-
92
- private _getDockerHubImageName(): string {
93
- var namespace = tl.getInput('DockerNamespace', true);
94
- var image = tl.getInput('DockerRepository', true);
95
- var tag = tl.getInput('DockerImageTag', false);
96
-
97
- return this._constructImageName(namespace, image, tag);
98
- }
99
-
100
- private _constructImageName(namespace, repository, tag): string {
101
- var imageName = null;
102
- /*
103
- Special Case : If release definition is not linked to build artifacts
104
- then $(Build.BuildId) variable don't expand in release. So clearing state
105
- of dockerImageTag if $(Build.BuildId) not expanded in value of dockerImageTag.
106
- */
107
- if(tag && (tag.trim() == "$(Build.BuildId)")) {
108
- tag = null;
109
- }
110
-
111
- if(tag) {
112
- imageName = namespace.toLowerCase() + "/" + repository.toLowerCase() + ":" + tag;
113
- } else {
114
- imageName = namespace.toLowerCase() + "/" + repository.toLowerCase();
115
- }
116
-
117
- return imageName.replace(/ /g,"");
118
- }
119
-
120
- private _getPrivateRegistryImageName(): string {
121
- var registryConnectedServiceName = tl.getInput('RegistryConnectedServiceName', true);
122
- var loginServer = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'url', true);
123
-
124
- var registry = url.parse(loginServer).hostname;
125
- var image = tl.getInput('PrivateRegistryImage', true);
126
- var tag = tl.getInput('PrivateRegistryTag', false);
127
-
128
- return this._constructImageName(registry, image, tag);
129
- }
130
-
131
- private _updateWebAppSettings(appSettingsParameters, webAppSettings): void {
132
- // In case of public repo, clear the connection details of a registry
133
- var dockerRespositoryAccess = tl.getInput('DockerRepositoryAccess', true);
134
-
135
- // Uncomment the below lines while supprting all registry types.
136
- // if(dockerRespositoryAccess === "public")
137
- // {
138
- // deleteRegistryConnectionSettings(webAppSettings);
139
- // }
140
-
141
- var parsedAppSettings = parse(appSettingsParameters);
142
- for (var settingName in parsedAppSettings) {
143
- var setting = settingName.trim();
144
- var settingVal = parsedAppSettings[settingName].value;
145
- settingVal = settingVal ? settingVal.trim() : "";
146
-
147
- if(setting) {
148
- webAppSettings["properties"][setting] = settingVal;
149
- }
150
- }
151
- }
152
-
153
- private _getImageName(): string {
154
- var registryType = tl.getInput('ImageSource', true);
155
- var imageName = null;
156
-
157
- switch(registryType) {
158
- case registryTypes[registryTypes.AzureContainerRegistry]:
159
- imageName = this._getAzureContainerImageName();
160
- break;
161
-
162
- case registryTypes[registryTypes.Registry]:
163
- imageName = this._getDockerHubImageName();
164
- break;
165
-
166
- case registryTypes[registryTypes.PrivateRegistry]:
167
- imageName = this._getPrivateRegistryImageName();
168
- break;
169
- }
170
-
171
- return imageName;
172
- }
173
-
174
- private async _getContainerRegistrySettings(imageName, endPoint): Promise<string> {
175
- var containerRegistryType: string = 'Registry';
176
- var containerRegistrySettings: string = "-DOCKER_CUSTOM_IMAGE_NAME " + imageName;
177
- var containerRegistryAuthParamsFormatString: string = "-DOCKER_REGISTRY_SERVER_URL %s -DOCKER_REGISTRY_SERVER_USERNAME %s -DOCKER_REGISTRY_SERVER_PASSWORD %s";
178
-
179
- switch(containerRegistryType) {
180
- case registryTypes[registryTypes.AzureContainerRegistry]:
181
- containerRegistrySettings = await this._getAzureContainerRegistrySettings(endPoint, containerRegistrySettings, containerRegistryAuthParamsFormatString);
182
- break;
183
-
184
- case registryTypes[registryTypes.Registry]:
185
- var dockerRespositoryAccess = tl.getInput('DockerRepositoryAccess', false);
186
- if(dockerRespositoryAccess === "private")
187
- {
188
- containerRegistrySettings = this._getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString);
189
- }
190
- break;
191
-
192
- case registryTypes[registryTypes.PrivateRegistry]:
193
- containerRegistrySettings = this._getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString);
194
- break;
195
- }
196
-
197
- return containerRegistrySettings;
198
- }
199
-
200
- private async _getAzureContainerRegistrySettings(endPoint, containerRegistrySettings, containerRegistryAuthParamsFormatString): Promise<string> {
201
- var registryServerName = tl.getInput('AzureContainerRegistryLoginServer', true);
202
- var registryUrl = "https://" + registryServerName + ".azurecr.io";
203
- tl.debug("Azure Container Registry Url: " + registryUrl);
204
-
205
- var registryName = tl.getInput('AzureContainerRegistry', true);
206
- var resourceGroupName = '';// await azureRESTUtility.getResourceGroupName(endPoint, registryName, "Microsoft.ContainerRegistry/registries");
207
- tl.debug("Resource group name of a registry: " + resourceGroupName);
208
-
209
- var creds = null //await azureRESTUtility.getAzureContainerRegistryCredentials(endPoint, registryName, resourceGroupName);
210
- tl.debug("Successfully retrieved the registry credentials");
211
-
212
- var username = creds.username;
213
- var password = creds["passwords"][0].value;
214
-
215
- return containerRegistrySettings + " " + util.format(containerRegistryAuthParamsFormatString, registryUrl, username, password);
216
- }
217
-
218
- private _getDockerPrivateRegistrySettings(containerRegistrySettings, containerRegistryAuthParamsFormatString): string {
219
- var registryConnectedServiceName = tl.getInput('RegistryConnectedServiceName', true);
220
- var username = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'username', true);
221
- var password = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'password', true);
222
- var registryUrl = tl.getEndpointAuthorizationParameter(registryConnectedServiceName, 'registry', true);
223
-
224
- tl.debug("Docker or Private Container Registry Url: " + registryUrl);
225
-
226
- return containerRegistrySettings + " " + util.format(containerRegistryAuthParamsFormatString, registryUrl, username, password);
227
- }
228
-
229
- private _deleteRegistryConnectionSettings(webAppSettings): void {
230
- delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_URL"];
231
- delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_USERNAME"];
232
- delete webAppSettings["properties"]["DOCKER_REGISTRY_SERVER_PASSWORD"];
233
- }
234
76
 
235
77
  private updateImagesInConfigFile(multicontainerConfigFile, images): string {
236
78
  const tempDirectory = deployUtility.getTempDirectory();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "azure-pipelines-tasks-azurermdeploycommon",
3
- "version": "3.222.0",
3
+ "version": "3.222.2",
4
4
  "description": "Common Lib for Azure ARM REST apis",
5
5
  "repository": {
6
6
  "type": "git",