Skip to content

Commit 2dae0c9

Browse files
authored
Implement include:template support (#95)
1 parent 7eceea2 commit 2dae0c9

File tree

4 files changed

+40
-5
lines changed

4 files changed

+40
-5
lines changed

src/parser.ts

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -344,8 +344,8 @@ export class Parser {
344344

345345
static async downloadIncludeFile(cwd: string, project: string, ref: string, file: string, gitRemoteDomain: string): Promise<void> {
346346
const time = process.hrtime();
347-
fs.ensureDirSync(`${cwd}/.gitlab-ci-local/includes/${project}/${ref}/`);
348-
await Utils.spawn(`git archive --remote=git@${gitRemoteDomain}:${project}.git ${ref} ${file} | tar -xC .gitlab-ci-local/includes/${project}/${ref}/`, cwd);
347+
fs.ensureDirSync(`${cwd}/.gitlab-ci-local/includes/${gitRemoteDomain}/${project}/${ref}/`);
348+
await Utils.spawn(`git archive --remote=git@${gitRemoteDomain}:${project}.git ${ref} ${file} | tar -xC .gitlab-ci-local/includes/${gitRemoteDomain}/${project}/${ref}/`, cwd);
349349
const endTime = process.hrtime(time);
350350
const remoteUrl = `${gitRemoteDomain}/${project}/${file}`;
351351
process.stdout.write(`${cyan('downloaded')} ${magentaBright(remoteUrl)} in ${magenta(prettyHrtime(endTime))}\n`);
@@ -376,11 +376,16 @@ export class Parser {
376376

377377
// Find files to fetch from remote and place in .gitlab-ci-local/includes
378378
for (const value of gitlabData["include"] || []) {
379-
if (!value["file"] || tabCompletionPhase) {
379+
if (tabCompletionPhase) {
380380
continue;
381381
}
382+
if (value["file"]) {
383+
promises.push(Parser.downloadIncludeFile(cwd, value["project"], value["ref"] || "master", value["file"], gitRemote.domain));
384+
} else if (value["template"]) {
385+
const {project, ref, file, domain} = Parser.parseTemplateInclude(value['template']);
386+
promises.push(Parser.downloadIncludeFile(cwd, project, ref, file, domain));
387+
}
382388

383-
promises.push(Parser.downloadIncludeFile(cwd, value["project"], value["ref"] || "master", value["file"], gitRemote.domain));
384389
}
385390

386391
await Promise.all(promises);
@@ -390,7 +395,11 @@ export class Parser {
390395
const localDoc = await Parser.loadYaml(`${cwd}/${value.local}`);
391396
includeDatas = includeDatas.concat(await Parser.prepareIncludes(localDoc, cwd, gitRemote, tabCompletionPhase));
392397
} else if (value["file"]) {
393-
const fileDoc = await Parser.loadYaml(`${cwd}/.gitlab-ci-local/includes/${value["project"]}/${value["ref"] || "master"}/${value["file"]}`);
398+
const fileDoc = await Parser.loadYaml(`${cwd}/.gitlab-ci-local/includes/${gitRemote.domain}/${value["project"]}/${value["ref"] || "master"}/${value["file"]}`);
399+
includeDatas = includeDatas.concat(await Parser.prepareIncludes(fileDoc, cwd, gitRemote, tabCompletionPhase));
400+
} else if (value['template']) {
401+
const {project, ref, file, domain} = Parser.parseTemplateInclude(value['template']);
402+
const fileDoc = await Parser.loadYaml(`${cwd}/.gitlab-ci-local/includes/${domain}/${project}/${ref}/${file}`);
394403
includeDatas = includeDatas.concat(await Parser.prepareIncludes(fileDoc, cwd, gitRemote, tabCompletionPhase));
395404
} else {
396405
throw new ExitError(`Didn't understand include ${JSON.stringify(value)}`);
@@ -400,4 +409,13 @@ export class Parser {
400409
includeDatas.push(gitlabData);
401410
return includeDatas;
402411
}
412+
413+
static parseTemplateInclude(template: string): {project: string, ref: string, file: string, domain: string} {
414+
return {
415+
domain: "gitlab.com",
416+
project: "gitlab-org/gitlab",
417+
ref: "master",
418+
file: `lib/gitlab/ci/templates/${template}`
419+
}
420+
}
403421
}

tests/cases.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,15 @@ test('include <deploy-job>', async () => {
290290
expect(mockProcessExit).toBeCalledTimes(0);
291291
});
292292

293+
test('include-template <test-job>', async () => {
294+
await defaultCmd.handler({
295+
cwd: 'tests/test-cases/include-template',
296+
job: 'test-job'
297+
});
298+
expect(mockProcessStdout).toHaveBeenCalledWith("Test Something\n");
299+
expect(mockProcessExit).toBeCalledTimes(0);
300+
});
301+
293302
test('manual <build-job>', async () => {
294303
await defaultCmd.handler({
295304
cwd: 'tests/test-cases/manual',
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[remote "origin"]
2+
url = git@gitlab.com/gcl/include-template.git
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
include:
2+
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
3+
4+
test-job:
5+
script:
6+
- echo "Test Something"

0 commit comments

Comments
 (0)