Skip to content

Commit

Permalink
perf: Short-circuit deployment if ARM template hasn't changed (#239)
Browse files Browse the repository at this point in the history
This checks the previously deployed template (including parameters/values) to see if the generated template has changed since the last deployment. If it has not changed, it will not deploy the ARM template. Since many cases will be code changes, this will drastically increase the speed of the average deployment.

Resolves [AB#789]
  • Loading branch information
tbarlow12 authored Aug 16, 2019
1 parent 7a8a948 commit 327511c
Show file tree
Hide file tree
Showing 9 changed files with 159 additions and 62 deletions.
58 changes: 12 additions & 46 deletions package-lock.json

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

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
"@azure/ms-rest-nodeauth": "^1.0.1",
"@azure/storage-blob": "^10.3.0",
"axios": "^0.18.0",
"deep-equal": "^1.0.1",
"js-yaml": "^3.13.1",
"jsonpath": "^1.0.1",
"lodash": "^4.16.6",
Expand Down
55 changes: 54 additions & 1 deletion src/services/armService.test.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import Serverless from "serverless";
import { MockFactory } from "../test/mockFactory";
import { ArmService } from "./armService";
import { ArmResourceTemplate, ArmTemplateType } from "../models/armTemplates";
import { ArmResourceTemplate, ArmTemplateType, ArmDeployment } from "../models/armTemplates";
import { ArmTemplateConfig, ServerlessAzureOptions } from "../models/serverless";
import mockFs from "mock-fs";
import jsonpath from "jsonpath";
import { Deployments } from "@azure/arm-resources";
import { Deployment } from "@azure/arm-resources/esm/models";
import { ResourceService } from "./resourceService";

describe("Arm Service", () => {
let sls: Serverless
Expand All @@ -29,6 +30,13 @@ describe("Arm Service", () => {
};

service = createService();
ResourceService.prototype.getDeployments = jest.fn(() => MockFactory.createTestDeployments()) as any;
ResourceService.prototype.getDeploymentTemplate = jest.fn(() => {
return {
template: MockFactory.createTestArmTemplate()
}
}) as any;

})

afterEach(() => {
Expand Down Expand Up @@ -151,6 +159,51 @@ describe("Arm Service", () => {
Deployments.prototype.createOrUpdate = jest.fn(() => Promise.resolve(null));
});

it("Does not deploy if previously deployed template is the same", async () => {
const deployment: ArmDeployment = {
parameters: MockFactory.createTestParameters(false),
template: MockFactory.createTestArmTemplate()
};
await service.deployTemplate(deployment);
expect(Deployments.prototype.createOrUpdate).not.toBeCalled()
});

it("Calls deploy if parameters have changed from deployed template", async () => {
const deployment: ArmDeployment = {
parameters: MockFactory.createTestParameters(false),
template: MockFactory.createTestArmTemplate()
};
deployment.parameters.param1 = "3"
await service.deployTemplate(deployment);
expect(Deployments.prototype.createOrUpdate).toBeCalled();
});

it("Calls deploy if previously deployed template is different", async () => {
ResourceService.prototype.getDeploymentTemplate = jest.fn(() => {
return {
template: {}
}
}) as any;
const deployment: ArmDeployment = {
parameters: MockFactory.createTestParameters(false),
template: MockFactory.createTestArmTemplate()
};
await service.deployTemplate(deployment);
expect(Deployments.prototype.createOrUpdate).toBeCalled()
});

it("Calls deploy if running first deployment", async () => {
ResourceService.prototype.getDeployments = jest.fn(() => {
return []
}) as any;
const deployment: ArmDeployment = {
parameters: MockFactory.createTestParameters(false),
template: MockFactory.createTestArmTemplate()
};
await service.deployTemplate(deployment);
expect(Deployments.prototype.createOrUpdate).toBeCalled()
});

it("Appends environment variables into app settings of ARM template", async () => {
const environmentConfig: any = {
PARAM_1: "1",
Expand Down
Loading

0 comments on commit 327511c

Please sign in to comment.