Skip to content
This repository was archived by the owner on Dec 9, 2024. It is now read-only.

Commit 327511c

Browse files
authored
perf: Short-circuit deployment if ARM template hasn't changed (#239)
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]
1 parent 7a8a948 commit 327511c

File tree

9 files changed

+159
-62
lines changed

9 files changed

+159
-62
lines changed

package-lock.json

Lines changed: 12 additions & 46 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"@azure/ms-rest-nodeauth": "^1.0.1",
4848
"@azure/storage-blob": "^10.3.0",
4949
"axios": "^0.18.0",
50+
"deep-equal": "^1.0.1",
5051
"js-yaml": "^3.13.1",
5152
"jsonpath": "^1.0.1",
5253
"lodash": "^4.16.6",

src/services/armService.test.ts

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import Serverless from "serverless";
22
import { MockFactory } from "../test/mockFactory";
33
import { ArmService } from "./armService";
4-
import { ArmResourceTemplate, ArmTemplateType } from "../models/armTemplates";
4+
import { ArmResourceTemplate, ArmTemplateType, ArmDeployment } from "../models/armTemplates";
55
import { ArmTemplateConfig, ServerlessAzureOptions } from "../models/serverless";
66
import mockFs from "mock-fs";
77
import jsonpath from "jsonpath";
88
import { Deployments } from "@azure/arm-resources";
99
import { Deployment } from "@azure/arm-resources/esm/models";
10+
import { ResourceService } from "./resourceService";
1011

1112
describe("Arm Service", () => {
1213
let sls: Serverless
@@ -29,6 +30,13 @@ describe("Arm Service", () => {
2930
};
3031

3132
service = createService();
33+
ResourceService.prototype.getDeployments = jest.fn(() => MockFactory.createTestDeployments()) as any;
34+
ResourceService.prototype.getDeploymentTemplate = jest.fn(() => {
35+
return {
36+
template: MockFactory.createTestArmTemplate()
37+
}
38+
}) as any;
39+
3240
})
3341

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

162+
it("Does not deploy if previously deployed template is the same", async () => {
163+
const deployment: ArmDeployment = {
164+
parameters: MockFactory.createTestParameters(false),
165+
template: MockFactory.createTestArmTemplate()
166+
};
167+
await service.deployTemplate(deployment);
168+
expect(Deployments.prototype.createOrUpdate).not.toBeCalled()
169+
});
170+
171+
it("Calls deploy if parameters have changed from deployed template", async () => {
172+
const deployment: ArmDeployment = {
173+
parameters: MockFactory.createTestParameters(false),
174+
template: MockFactory.createTestArmTemplate()
175+
};
176+
deployment.parameters.param1 = "3"
177+
await service.deployTemplate(deployment);
178+
expect(Deployments.prototype.createOrUpdate).toBeCalled();
179+
});
180+
181+
it("Calls deploy if previously deployed template is different", async () => {
182+
ResourceService.prototype.getDeploymentTemplate = jest.fn(() => {
183+
return {
184+
template: {}
185+
}
186+
}) as any;
187+
const deployment: ArmDeployment = {
188+
parameters: MockFactory.createTestParameters(false),
189+
template: MockFactory.createTestArmTemplate()
190+
};
191+
await service.deployTemplate(deployment);
192+
expect(Deployments.prototype.createOrUpdate).toBeCalled()
193+
});
194+
195+
it("Calls deploy if running first deployment", async () => {
196+
ResourceService.prototype.getDeployments = jest.fn(() => {
197+
return []
198+
}) as any;
199+
const deployment: ArmDeployment = {
200+
parameters: MockFactory.createTestParameters(false),
201+
template: MockFactory.createTestArmTemplate()
202+
};
203+
await service.deployTemplate(deployment);
204+
expect(Deployments.prototype.createOrUpdate).toBeCalled()
205+
});
206+
154207
it("Appends environment variables into app settings of ARM template", async () => {
155208
const environmentConfig: any = {
156209
PARAM_1: "1",

0 commit comments

Comments
 (0)