feat: fix actions

Signed-off-by: ElaineDeMattosSilvaB <elaine.de-mattos-silva-bezerra@deutschebahn.com>
This commit is contained in:
ElaineDeMattosSilvaB
2024-10-07 23:14:20 +02:00
parent d10337b935
commit a771c791d6
6 changed files with 64 additions and 75 deletions
@@ -15,16 +15,16 @@
*/
import { ContainerRunner } from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';
import { JsonObject } from '@backstage/types';
import { ScmIntegrations } from '@backstage/integration';
import { UrlReaderService } from '@backstage/backend-plugin-api';
import { createMockDirectory } from '@backstage/backend-test-utils';
import { createFetchCookiecutterAction } from './cookiecutter';
import { join } from 'path';
import { ConfigReader } from '@backstage/config';
import { ScmIntegrations } from '@backstage/integration';
import type { ActionContext } from '@backstage/plugin-scaffolder-node';
import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils';
import { Writable } from 'stream';
import { UrlReaderService } from '@backstage/backend-plugin-api';
import { JsonObject } from '@backstage/types';
import { join } from 'path';
import { Logger } from 'winston';
import { createFetchCookiecutterAction } from './cookiecutter';
const executeShellCommand = jest.fn();
const commandExists = jest.fn();
@@ -168,7 +168,7 @@ describe('fetch:cookiecutter', () => {
join(mockTmpDir, 'template'),
'--verbose',
],
logStream: expect.any(Writable),
logger: expect.any(Logger),
}),
);
});
@@ -189,7 +189,7 @@ describe('fetch:cookiecutter', () => {
},
workingDir: '/input',
envVars: { HOME: '/tmp' },
logStream: expect.any(Writable),
logger: expect.any(Logger),
}),
);
});
@@ -19,18 +19,18 @@ import {
UrlReaderService,
resolveSafeChildPath,
} from '@backstage/backend-plugin-api';
import { JsonObject, JsonValue } from '@backstage/types';
import { InputError } from '@backstage/errors';
import { ScmIntegrations } from '@backstage/integration';
import {
createTemplateAction,
executeShellCommand,
fetchContents,
} from '@backstage/plugin-scaffolder-node';
import { JsonObject, JsonValue } from '@backstage/types';
import commandExists from 'command-exists';
import fs from 'fs-extra';
import path, { resolve as resolvePath } from 'path';
import { PassThrough, Writable } from 'stream';
import {
createTemplateAction,
fetchContents,
executeShellCommand,
} from '@backstage/plugin-scaffolder-node';
import { Logger } from 'winston';
import { examples } from './cookiecutter.examples';
export class CookiecutterRunner {
@@ -57,14 +57,14 @@ export class CookiecutterRunner {
public async run({
workspacePath,
values,
logStream,
logger,
imageName,
templateDir,
templateContentsDir,
}: {
workspacePath: string;
values: JsonObject;
logStream: Writable;
logger: Logger;
imageName?: string;
templateDir: string;
templateContentsDir: string;
@@ -99,7 +99,7 @@ export class CookiecutterRunner {
await executeShellCommand({
command: 'cookiecutter',
args: ['--no-input', '-o', intermediateDir, templateDir, '--verbose'],
logStream,
logger,
});
} else {
if (this.containerRunner === undefined) {
@@ -116,7 +116,7 @@ export class CookiecutterRunner {
// 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,
logger,
});
}
@@ -247,15 +247,10 @@ export function createFetchCookiecutterAction(options: {
_extensions: ctx.input.extensions,
};
const logStream = new PassThrough();
logStream.on('data', chunk => {
ctx.logger.info(chunk.toString());
});
// Will execute the template in ./template and put the result in ./result
await cookiecutter.run({
workspacePath: workDir,
logStream,
logger: ctx.logger,
values: values,
imageName: ctx.input.imageName,
templateDir: templateDir,
@@ -28,15 +28,15 @@ jest.mock('./railsNewRunner', () => {
});
import { ContainerRunner } from '@backstage/backend-common';
import { UrlReaderService } from '@backstage/backend-plugin-api';
import { createMockDirectory } from '@backstage/backend-test-utils';
import { ConfigReader } from '@backstage/config';
import { ScmIntegrations } from '@backstage/integration';
import { resolve as resolvePath } from 'path';
import { createFetchRailsAction } from './index';
import { fetchContents } from '@backstage/plugin-scaffolder-node';
import { createMockDirectory } from '@backstage/backend-test-utils';
import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils';
import { Writable } from 'stream';
import { UrlReaderService } from '@backstage/backend-plugin-api';
import { resolve as resolvePath } from 'path';
import { Logger } from 'winston';
import { createFetchRailsAction } from './index';
describe('fetch:rails', () => {
const mockDir = createMockDirectory();
@@ -106,7 +106,7 @@ describe('fetch:rails', () => {
expect(mockRailsTemplater.run).toHaveBeenCalledWith({
workspacePath: mockContext.workspacePath,
logStream: expect.any(Writable),
logger: expect.any(Logger),
values: mockContext.input.values,
});
});
@@ -122,7 +122,7 @@ describe('fetch:rails', () => {
expect(mockRailsTemplater.run).toHaveBeenCalledWith({
workspacePath: mockContext.workspacePath,
logStream: expect.any(Writable),
logger: expect.any(Logger),
values: {
...mockContext.input.values,
imageName: 'foo/rails-custom-image',
@@ -15,20 +15,19 @@
*/
import { ContainerRunner } from '@backstage/backend-common';
import { JsonObject } from '@backstage/types';
import { InputError } from '@backstage/errors';
import { ScmIntegrations } from '@backstage/integration';
import fs from 'fs-extra';
import {
createTemplateAction,
fetchContents,
} from '@backstage/plugin-scaffolder-node';
import { JsonObject } from '@backstage/types';
import fs from 'fs-extra';
import { resolve as resolvePath } from 'path';
import { RailsNewRunner } from './railsNewRunner';
import { PassThrough } from 'stream';
import { examples } from './index.examples';
import { UrlReaderService } from '@backstage/backend-plugin-api';
import { resolve as resolvePath } from 'path';
import { examples } from './index.examples';
import { RailsNewRunner } from './railsNewRunner';
/**
* Creates the `fetch:rails` Scaffolder action.
@@ -219,15 +218,10 @@ export function createFetchRailsAction(options: {
throw new Error(`Image ${imageName} is not allowed`);
}
const logStream = new PassThrough();
logStream.on('data', chunk => {
ctx.logger.info(chunk.toString());
});
// Will execute the template in ./template and put the result in ./result
await templateRunner.run({
workspacePath: workDir,
logStream,
logger: ctx.logger,
values: { ...ctx.input.values, imageName },
});
@@ -28,10 +28,10 @@ jest.mock(
);
import { ContainerRunner } from '@backstage/backend-common';
import path from 'path';
import { PassThrough } from 'stream';
import { RailsNewRunner } from './railsNewRunner';
import { createMockDirectory } from '@backstage/backend-test-utils';
import path from 'path';
import { Logger } from 'winston';
import { RailsNewRunner } from './railsNewRunner';
describe('Rails Templater', () => {
const containerRunner: jest.Mocked<ContainerRunner> = {
@@ -47,7 +47,7 @@ describe('Rails Templater', () => {
describe('when running on docker', () => {
it('should run the correct bindings for the volumes', async () => {
const logStream = new PassThrough();
const logger = new Logger();
const values = {
owner: 'angeliski',
storePath: 'https://github.com/angeliski/rails-project',
@@ -65,7 +65,7 @@ describe('Rails Templater', () => {
await templater.run({
workspacePath: mockDir.path,
values,
logStream,
logger,
});
expect(containerRunner.runContainer).toHaveBeenCalledWith({
@@ -78,12 +78,12 @@ describe('Rails Templater', () => {
[path.join(mockDir.path, 'intermediate')]: '/output',
},
workingDir: '/input',
logStream: logStream,
logger: logger,
});
});
it('should use the provided imageName', async () => {
const logStream = new PassThrough();
const logger = new Logger();
const values = {
owner: 'angeliski',
storePath: 'https://github.com/angeliski/rails-project',
@@ -101,7 +101,7 @@ describe('Rails Templater', () => {
await templater.run({
workspacePath: mockDir.path,
values,
logStream,
logger,
});
expect(containerRunner.runContainer).toHaveBeenCalledWith(
@@ -112,7 +112,7 @@ describe('Rails Templater', () => {
});
it('should pass through the streamer to the run docker helper', async () => {
const stream = new PassThrough();
const logger = new Logger();
const values = {
owner: 'angeliski',
@@ -131,7 +131,7 @@ describe('Rails Templater', () => {
await templater.run({
workspacePath: mockDir.path,
values,
logStream: stream,
logger,
});
expect(containerRunner.runContainer).toHaveBeenCalledWith({
@@ -144,12 +144,12 @@ describe('Rails Templater', () => {
[path.join(mockDir.path, 'intermediate')]: '/output',
},
workingDir: '/input',
logStream: stream,
logger,
});
});
it('update the template path to correct location', async () => {
const logStream = new PassThrough();
const logger = new Logger();
const values = {
owner: 'angeliski',
storePath: 'https://github.com/angeliski/rails-project',
@@ -168,7 +168,7 @@ describe('Rails Templater', () => {
await templater.run({
workspacePath: mockDir.path,
values,
logStream,
logger,
});
expect(containerRunner.runContainer).toHaveBeenCalledWith({
@@ -186,14 +186,14 @@ describe('Rails Templater', () => {
[path.join(mockDir.path, 'intermediate')]: '/output',
},
workingDir: '/input',
logStream: logStream,
logger,
});
});
});
describe('when rails is available', () => {
it('use the binary', async () => {
const stream = new PassThrough();
const logger = new Logger();
const values = {
owner: 'angeliski',
@@ -213,7 +213,7 @@ describe('Rails Templater', () => {
await templater.run({
workspacePath: mockDir.path,
values,
logStream: stream,
logger,
});
expect(executeShellCommand).toHaveBeenCalledWith({
@@ -222,12 +222,12 @@ describe('Rails Templater', () => {
'new',
path.join(mockDir.path, 'intermediate', 'rails-project'),
]),
logStream: stream,
logger,
});
});
it('update the template path to correct location', async () => {
const stream = new PassThrough();
const logger = new Logger();
const values = {
owner: 'angeliski',
@@ -248,7 +248,7 @@ describe('Rails Templater', () => {
await templater.run({
workspacePath: mockDir.path,
values,
logStream: stream,
logger,
});
expect(executeShellCommand).toHaveBeenCalledWith({
@@ -259,14 +259,14 @@ describe('Rails Templater', () => {
'--template',
path.join(mockDir.path, './something.rb'),
]),
logStream: stream,
logger,
});
});
});
describe('when nothing was generated', () => {
it('throws an error', async () => {
const stream = new PassThrough();
const logger = new Logger();
mockDir.setContent({
intermediate: {},
@@ -282,7 +282,7 @@ describe('Rails Templater', () => {
name: 'rails-project',
imageName: 'foo/rails-custom-image',
},
logStream: stream,
logger,
}),
).rejects.toThrow(/No data generated by rails/);
});
@@ -15,16 +15,16 @@
*/
import { ContainerRunner } from '@backstage/backend-common';
import { executeShellCommand } from '@backstage/plugin-scaffolder-node';
import { JsonObject } from '@backstage/types';
import commandExists from 'command-exists';
import fs from 'fs-extra';
import path from 'path';
import { executeShellCommand } from '@backstage/plugin-scaffolder-node';
import commandExists from 'command-exists';
import { Logger } from 'winston';
import {
railsArgumentResolver,
RailsRunOptions,
} from './railsArgumentResolver';
import { JsonObject } from '@backstage/types';
import { Writable } from 'stream';
export class RailsNewRunner {
private readonly containerRunner?: ContainerRunner;
@@ -36,11 +36,11 @@ export class RailsNewRunner {
public async run({
workspacePath,
values,
logStream,
logger,
}: {
workspacePath: string;
values: JsonObject;
logStream: Writable;
logger: Logger;
}): Promise<void> {
const intermediateDir = path.join(workspacePath, 'intermediate');
await fs.ensureDir(intermediateDir);
@@ -71,7 +71,7 @@ export class RailsNewRunner {
`${intermediateDir}${path.sep}${name}`,
...arrayExtraArguments,
],
logStream,
logger,
});
} else {
if (!imageName) {
@@ -96,7 +96,7 @@ export class RailsNewRunner {
// 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,
logger,
});
}