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
3 changes: 3 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ inputs:
resource-group-name:
description: 'Enter the resource group name of the web app'
required: false
sitecontainers-config:
description: 'Applies to Sitecontainers, containes a list of siteContainer specs'
required: false

outputs:
webapp-url:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class PublishProfileContainerWebAppValidator {
(0, Validations_1.packageNotAllowed)(actionParams.packageInput);
(0, Validations_1.multiContainerNotAllowed)(actionParams.multiContainerConfigFile);
(0, Validations_1.startupCommandNotAllowed)(actionParams.startupCommand);
(0, Validations_1.siteContainersConfigNotAllowed)(actionParams.siteContainers);
(0, Validations_1.validateAppDetails)();
(0, Validations_1.validateSingleContainerInputs)();
});
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PublishProfileWebAppSiteContainersValidator = void 0;
class PublishProfileWebAppSiteContainersValidator {
validate() {
return __awaiter(this, void 0, void 0, function* () {
throw new Error("publish-profile is not supported for Site Containers scenario");
});
}
}
exports.PublishProfileWebAppSiteContainersValidator = PublishProfileWebAppSiteContainersValidator;
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class PublishProfileWebAppValidator {
(0, Validations_1.containerInputsNotAllowed)(actionParams.images, actionParams.multiContainerConfigFile, true);
(0, Validations_1.validateAppDetails)();
(0, Validations_1.startupCommandNotAllowed)(actionParams.startupCommand);
(0, Validations_1.siteContainersConfigNotAllowed)(actionParams.siteContainers);
yield (0, Validations_1.validatePackageInput)();
});
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SpnWebAppSiteContainersValidator = void 0;
const Validations_1 = require("../Validations");
const SpnLinuxWebAppValidator_1 = require("./SpnLinuxWebAppValidator");
const actionparameters_1 = require("../../actionparameters");
class SpnWebAppSiteContainersValidator extends SpnLinuxWebAppValidator_1.SpnLinuxWebAppValidator {
validate() {
const _super = Object.create(null, {
validate: { get: () => super.validate }
});
return __awaiter(this, void 0, void 0, function* () {
let actionParams = actionparameters_1.ActionParameters.getActionParams();
if (!!actionParams.blessedAppSitecontainers) {
yield _super.validate.call(this);
}
(0, Validations_1.validateSiteContainersInputs)();
});
}
}
exports.SpnWebAppSiteContainersValidator = SpnWebAppSiteContainersValidator;
15 changes: 15 additions & 0 deletions lib/ActionInputValidator/Validations.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ exports.multiContainerNotAllowed = multiContainerNotAllowed;
exports.validateSingleContainerInputs = validateSingleContainerInputs;
exports.validateContainerInputs = validateContainerInputs;
exports.validatePackageInput = validatePackageInput;
exports.siteContainersConfigNotAllowed = siteContainersConfigNotAllowed;
exports.validateSiteContainersInputs = validateSiteContainersInputs;
const core = __importStar(require("@actions/core"));
const packageUtility_1 = require("azure-actions-utility/packageUtility");
const PublishProfile_1 = require("../Utilities/PublishProfile");
Expand Down Expand Up @@ -146,3 +148,16 @@ function validatePackageInput() {
}
});
}
// Error if Sitecontainers configuration is provided
function siteContainersConfigNotAllowed(siteContainers) {
if (!!siteContainers) {
throw new Error("SiteContainers not valid input for this web app.");
}
}
// validate Sitecontainers inputs
function validateSiteContainersInputs() {
const actionParams = actionparameters_1.ActionParameters.getActionParams();
if (!actionParams.siteContainers || actionParams.siteContainers.length === 0) {
throw new Error("Site containers not provided.");
}
}
25 changes: 24 additions & 1 deletion lib/ActionInputValidator/ValidatorFactory.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,17 @@ const SpnWindowsWebAppValidator_1 = require("./ActionValidators/SpnWindowsWebApp
const Validations_1 = require("./Validations");
const PublishProfile_1 = require("../Utilities/PublishProfile");
const RuntimeConstants_1 = __importDefault(require("../RuntimeConstants"));
const SpnWebAppSiteContainersValidator_1 = require("./ActionValidators/SpnWebAppSiteContainersValidator");
const PublishProfileWebAppSiteContainersValidator_1 = require("./ActionValidators/PublishProfileWebAppSiteContainersValidator");
const azure_app_service_1 = require("azure-actions-appservice-rest/Arm/azure-app-service");
class ValidatorFactory {
static getValidator(type) {
return __awaiter(this, void 0, void 0, function* () {
let actionParams = actionparameters_1.ActionParameters.getActionParams();
if (type === BaseWebAppDeploymentProvider_1.DEPLOYMENT_PROVIDER_TYPES.PUBLISHPROFILE) {
if (!!actionParams.blessedAppSitecontainers || !!actionParams.siteContainers) {
return new PublishProfileWebAppSiteContainersValidator_1.PublishProfileWebAppSiteContainersValidator();
}
if (!!actionParams.images) {
yield this.setResourceDetails(actionParams);
return new PublishProfileContainerWebAppValidator_1.PublishProfileContainerWebAppValidator();
Expand All @@ -83,7 +89,11 @@ class ValidatorFactory {
(0, Validations_1.appNameIsRequired)(actionParams.appName);
yield this.getResourceDetails(actionParams);
if (!!actionParams.isLinux) {
if (!!actionParams.images || !!actionParams.multiContainerConfigFile) {
if (!!actionParams.siteContainers) {
yield this.setBlessedSitecontainerApp(actionParams);
return new SpnWebAppSiteContainersValidator_1.SpnWebAppSiteContainersValidator();
}
else if (!!actionParams.images || !!actionParams.multiContainerConfigFile) {
return new SpnLinuxContainerWebAppValidator_1.SpnLinuxContainerWebAppValidator();
}
else {
Expand Down Expand Up @@ -121,5 +131,18 @@ class ValidatorFactory {
actionParams.isLinux = appOS.includes(RuntimeConstants_1.default.Unix) || appOS.includes(RuntimeConstants_1.default.Unix.toLowerCase());
});
}
static setBlessedSitecontainerApp(actionParams) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
const appService = new azure_app_service_1.AzureAppService(actionParams.endpoint, actionParams.resourceGroupName, actionParams.appName, actionParams.slotName);
let config = yield appService.getConfiguration();
core.debug(`LinuxFxVersion of app is: ${config.properties.linuxFxVersion}`);
const linuxFxVersion = ((_a = config.properties.linuxFxVersion) === null || _a === void 0 ? void 0 : _a.toUpperCase()) || "";
actionParams.blessedAppSitecontainers = (!linuxFxVersion.startsWith("DOCKER|")
&& !linuxFxVersion.startsWith("COMPOSE|")
&& linuxFxVersion !== "SITECONTAINERS");
core.debug(`Is blessed app sitecontainers: ${actionParams.blessedAppSitecontainers}`);
});
}
}
exports.ValidatorFactory = ValidatorFactory;
4 changes: 4 additions & 0 deletions lib/DeploymentProvider/DeploymentProviderFactory.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const BaseWebAppDeploymentProvider_1 = require("./Providers/BaseWebAppDeployment
const WebAppContainerDeployment_1 = require("./Providers/WebAppContainerDeployment");
const WebAppDeploymentProvider_1 = require("./Providers/WebAppDeploymentProvider");
const PublishProfileWebAppContainerDeploymentProvider_1 = require("./Providers/PublishProfileWebAppContainerDeploymentProvider");
const WebAppSiteContainersDeploymentProvider_1 = require("./Providers/WebAppSiteContainersDeploymentProvider");
class DeploymentProviderFactory {
static getDeploymentProvider(type) {
if (type === BaseWebAppDeploymentProvider_1.DEPLOYMENT_PROVIDER_TYPES.PUBLISHPROFILE) {
Expand All @@ -17,6 +18,9 @@ class DeploymentProviderFactory {
}
}
else if (type == BaseWebAppDeploymentProvider_1.DEPLOYMENT_PROVIDER_TYPES.SPN) {
if (!!actionparameters_1.ActionParameters.getActionParams().blessedAppSitecontainers || !!actionparameters_1.ActionParameters.getActionParams().siteContainers) {
return new WebAppSiteContainersDeploymentProvider_1.WebAppSiteContainersDeploymentProvider(type);
}
if (!!actionparameters_1.ActionParameters.getActionParams().images || (!!actionparameters_1.ActionParameters.getActionParams().isLinux && !!actionparameters_1.ActionParameters.getActionParams().multiContainerConfigFile)) {
return new WebAppContainerDeployment_1.WebAppContainerDeploymentProvider(type);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebAppSiteContainersDeploymentProvider = void 0;
const SiteContainerDeploymentUtility_1 = require("azure-actions-appservice-rest/Utilities/SiteContainerDeploymentUtility");
const core = __importStar(require("@actions/core"));
const WebAppDeploymentProvider_1 = require("./WebAppDeploymentProvider");
class WebAppSiteContainersDeploymentProvider extends WebAppDeploymentProvider_1.WebAppDeploymentProvider {
DeployWebAppStep() {
const _super = Object.create(null, {
DeployWebAppStep: { get: () => super.DeployWebAppStep }
});
return __awaiter(this, void 0, void 0, function* () {
if (!!this.actionParams.blessedAppSitecontainers) {
core.debug("Blessed site containers detected, using WebAppDeploymentProvider for deployment.");
yield _super.DeployWebAppStep.call(this);
}
let siteContainerDeploymentUtility = new SiteContainerDeploymentUtility_1.SiteContainerDeploymentUtility(this.appService);
let siteContainers = this.actionParams.siteContainers;
core.debug("Updating site containers");
for (let i = 0; i < siteContainers.length; i++) {
let siteContainer = siteContainers[i];
core.debug("updating site container: " + siteContainer.getName());
yield siteContainerDeploymentUtility.updateSiteContainer(siteContainer);
}
});
}
}
exports.WebAppSiteContainersDeploymentProvider = WebAppSiteContainersDeploymentProvider;
23 changes: 23 additions & 0 deletions lib/actionparameters.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActionParameters = exports.appKindMap = exports.WebAppKind = void 0;
const core = __importStar(require("@actions/core"));
const SiteContainer_1 = require("azure-actions-appservice-rest/Arm/SiteContainer");
const github = require('@actions/github');
var WebAppKind;
(function (WebAppKind) {
Expand Down Expand Up @@ -66,6 +67,16 @@ class ActionParameters {
*/
this._commitMessage = github.context.eventName === 'push' ? github.context.payload.head_commit.message.slice(0, 1000) : "";
this._endpoint = endpoint;
// Used for Sitecontainers app.
const siteContainersConfigInput = core.getInput('sitecontainers-config');
if (siteContainersConfigInput) {
const raw = JSON.parse(siteContainersConfigInput);
this._siteContainers = raw.map(SiteContainer_1.SiteContainer.fromJson);
}
else {
this._siteContainers = null;
}
this._blessedAppSitecontainers = false;
}
static getActionParams(endpoint) {
if (!this.actionparams) {
Expand Down Expand Up @@ -139,5 +150,17 @@ class ActionParameters {
get multiContainerConfigFile() {
return this._multiContainerConfigFile;
}
get siteContainers() {
return this._siteContainers;
}
set siteContainers(siteContainers) {
this._siteContainers = siteContainers;
}
get blessedAppSitecontainers() {
return this._blessedAppSitecontainers;
}
set blessedAppSitecontainers(blessedAppSitecontainers) {
this._blessedAppSitecontainers = blessedAppSitecontainers;
}
}
exports.ActionParameters = ActionParameters;
4 changes: 3 additions & 1 deletion node_modules/.package-lock.json

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

27 changes: 12 additions & 15 deletions node_modules/azure-actions-appservice-rest/Arm/SiteContainer.d.ts

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

Loading
Loading