From 68575f368908480d9890935692b40590d7c0d44b Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Sat, 6 Mar 2021 13:11:36 +0100 Subject: [PATCH] Update techdocs/scaffolder with new function parameters of runDockerContainer Signed-off-by: Himanshu Mishra --- .../src/stages/generate/techdocs.ts | 16 ++++++++++++-- .../stages/templater/cookiecutter.test.ts | 21 +++++++++++++++---- .../stages/templater/cookiecutter.ts | 15 +++++++++++-- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/packages/techdocs-common/src/stages/generate/techdocs.ts b/packages/techdocs-common/src/stages/generate/techdocs.ts index ff7b866a56..ab7b730106 100644 --- a/packages/techdocs-common/src/stages/generate/techdocs.ts +++ b/packages/techdocs-common/src/stages/generate/techdocs.ts @@ -16,6 +16,7 @@ import { runDockerContainer } from '@backstage/backend-common'; import { Config } from '@backstage/config'; +import fs from 'fs-extra'; import path from 'path'; import { PassThrough } from 'stream'; import { Logger } from 'winston'; @@ -78,6 +79,14 @@ export class TechdocsGenerator implements GeneratorBase { ); } + // Directories to bind on container + const mountDirs = new Map([ + // Need to use realpath here as Docker mounting does not like + // symlinks for binding volumes + [await fs.realpath(inputDir), '/input'], + [await fs.realpath(outputDir), '/output'], + ]); + try { switch (this.options.runGeneratorIn) { case 'local': @@ -98,8 +107,11 @@ export class TechdocsGenerator implements GeneratorBase { imageName: 'spotify/techdocs', args: ['build', '-d', '/output'], logStream, - inputDir, - outputDir, + mountDirs, + workingDir: '/input', + // Set the home directory inside the container as something that applications can + // write to, otherwise they will just fail trying to write to / + envVars: ['HOME=/tmp'], dockerClient, }); this.logger.info( diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.test.ts b/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.test.ts index eb73081568..a48a117639 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.test.ts @@ -136,6 +136,11 @@ describe('CookieCutter Templater', () => { }; jest.spyOn(fs, 'readdir').mockResolvedValueOnce(['newthing']); + jest + .spyOn(fs, 'realpath') + .mockImplementation((filePath: string | Buffer) => + Promise.resolve(filePath as string), + ); const templater = new CookieCutter(); await templater.run({ @@ -154,8 +159,12 @@ describe('CookieCutter Templater', () => { '/input', '--verbose', ], - inputDir: path.join('tempdir', 'template'), - outputDir: path.join('tempdir', 'intermediate'), + envVars: ['HOME=/tmp'], + mountDirs: new Map([ + [path.join('tempdir', 'template'), '/input'], + [path.join('tempdir', 'intermediate'), '/output'], + ]), + workingDir: '/input', logStream: undefined, dockerClient: mockDocker, }); @@ -193,8 +202,12 @@ describe('CookieCutter Templater', () => { '/input', '--verbose', ], - inputDir: path.join('tempdir', 'template'), - outputDir: path.join('tempdir', 'intermediate'), + envVars: ['HOME=/tmp'], + mountDirs: new Map([ + [path.join('tempdir', 'template'), '/input'], + [path.join('tempdir', 'intermediate'), '/output'], + ]), + workingDir: '/input', logStream: stream, dockerClient: mockDocker, }); diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.ts b/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.ts index a71af1d3bf..39e6d7be42 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.ts @@ -58,6 +58,14 @@ export class CookieCutter implements TemplaterBase { await fs.writeJSON(path.join(templateDir, 'cookiecutter.json'), cookieInfo); + // Directories to bind on container + const mountDirs = new Map([ + // Need to use realpath here as Docker mounting does not like + // symlinks for binding volumes + [await fs.realpath(templateDir), '/input'], + [await fs.realpath(intermediateDir), '/output'], + ]); + const cookieCutterInstalled = await commandExists('cookiecutter'); if (cookieCutterInstalled) { await runCommand({ @@ -76,8 +84,11 @@ export class CookieCutter implements TemplaterBase { '/input', '--verbose', ], - inputDir: templateDir, - outputDir: intermediateDir, + mountDirs, + workingDir: '/input', + // Set the home directory inside the container as something that applications can + // write to, otherwise they will just fail trying to write to / + envVars: ['HOME=/tmp'], logStream, dockerClient, });