Skip to content

Commit e653b59

Browse files
authored
fix: extending job with referenced variables should merge and not overwrite (#1563)
1 parent f366a26 commit e653b59

File tree

4 files changed

+89
-1
lines changed

4 files changed

+89
-1
lines changed

src/data-expander.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,12 @@ export function jobExtends (gitlabData: any) {
4040
export function reference (gitlabData: any, recurseData: any) {
4141
for (const [key, value] of Object.entries<any>(recurseData || {})) {
4242
if (value?.referenceData) {
43-
recurseData[key] = getSubDataByReference(gitlabData, value.referenceData);
43+
if (Object.keys(value).length > 1) {
44+
recurseData[key] = {...getSubDataByReference(gitlabData, value.referenceData), ...recurseData[key]};
45+
delete recurseData[key].referenceData;
46+
} else {
47+
recurseData[key] = getSubDataByReference(gitlabData, value.referenceData);
48+
}
4449
} else if (typeof value === "object") {
4550
reference(gitlabData, value);
4651
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
.somevariables:
3+
variables:
4+
HESTHEST: ponypony
5+
6+
7+
.something:
8+
variables: !reference [.somevariables, variables]
9+
10+
test-job:
11+
extends: [.something]
12+
variables:
13+
NICENESS: byrdalos
14+
script:
15+
- echo ${NICENESS}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
.somevariables:
3+
variables:
4+
NICENESS: reference
5+
6+
7+
.something:
8+
variables: !reference [.somevariables, variables]
9+
10+
test-job:
11+
extends: [.something]
12+
variables:
13+
NICENESS: byrdalos
14+
script:
15+
- echo ${NICENESS}

tests/test-cases/reference/integration.test.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,56 @@ test("should not support 11 level deep", async () => {
152152
}
153153
throw new Error("Error is expected but not thrown/caught");
154154
});
155+
156+
it("should merge values", async () => {
157+
const writeStreams = new WriteStreamsMock();
158+
await handler({
159+
preview: true,
160+
file: ".gitlab-ci-1.yml",
161+
cwd: "tests/test-cases/reference",
162+
}, writeStreams);
163+
164+
const expected = `
165+
---
166+
stages:
167+
- .pre
168+
- build
169+
- test
170+
- deploy
171+
- .post
172+
test-job:
173+
variables:
174+
HESTHEST: ponypony
175+
NICENESS: byrdalos
176+
script:
177+
- echo \${NICENESS}
178+
`;
179+
180+
expect(writeStreams.stdoutLines.join("\n")).toEqual(expected.trim());
181+
});
182+
183+
it("should have a lower precedence than a local scope", async () => {
184+
const writeStreams = new WriteStreamsMock();
185+
await handler({
186+
preview: true,
187+
file: ".gitlab-ci-2.yml",
188+
cwd: "tests/test-cases/reference",
189+
}, writeStreams);
190+
191+
const expected = `
192+
---
193+
stages:
194+
- .pre
195+
- build
196+
- test
197+
- deploy
198+
- .post
199+
test-job:
200+
variables:
201+
NICENESS: byrdalos
202+
script:
203+
- echo \${NICENESS}
204+
`;
205+
206+
expect(writeStreams.stdoutLines.join("\n")).toEqual(expected.trim());
207+
});

0 commit comments

Comments
 (0)