Merge pull request #2799 from taras/scaffolder-add-github-auth-to-preparer

fix: Add authentication to GitHub preparer
This commit is contained in:
Marcus Eide
2020-10-08 15:29:34 +02:00
committed by GitHub
5 changed files with 52 additions and 7 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'example-backend': patch
---
Pass GitHub token into Scaffolder GitHub Preparer
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Add authentication token to Scaffolder GitHub Preparer
+5 -2
View File
@@ -47,13 +47,12 @@ export default async function createPlugin({
templaters.register('cra', craTemplater);
const filePreparer = new FilePreparer();
const githubPreparer = new GithubPreparer();
const gitlabPreparer = new GitlabPreparer(config);
const azurePreparer = new AzurePreparer(config);
const preparers = new Preparers();
preparers.register('file', filePreparer);
preparers.register('github', githubPreparer);
preparers.register('gitlab', gitlabPreparer);
preparers.register('gitlab/api', gitlabPreparer);
preparers.register('azure/api', azurePreparer);
@@ -75,6 +74,10 @@ export default async function createPlugin({
token: githubToken,
repoVisibility,
});
const githubPreparer = new GithubPreparer({ token: githubToken });
preparers.register('github', githubPreparer);
publishers.register('file', githubPublisher);
publishers.register('github', githubPublisher);
} catch (e) {
@@ -90,7 +90,6 @@ describe('GitHubPreparer', () => {
{},
);
});
it('return the temp directory with the path to the folder if it is specified', async () => {
const preparer = new GithubPreparer();
mockEntity.spec.path = './template/test/1/2/3';
@@ -100,4 +99,20 @@ describe('GitHubPreparer', () => {
/\/template\/test\/1\/2\/3$/,
);
});
it('calls the clone command with the token when provided', async () => {
const preparer = new GithubPreparer({ token: 'abc' });
await preparer.prepare(mockEntity);
expect(mocks.Clone.clone).toHaveBeenNthCalledWith(
1,
'https://github.com/benjdlambert/backstage-graphql-template',
expect.any(String),
{
fetchOpts: {
callbacks: {
credentials: expect.any(Function),
},
},
},
);
});
});
@@ -21,11 +21,18 @@ import { parseLocationAnnotation } from '../helpers';
import { InputError } from '@backstage/backend-common';
import { PreparerBase } from './types';
import GitUriParser from 'git-url-parse';
import { Clone } from 'nodegit';
import { Clone, Cred } from 'nodegit';
export class GithubPreparer implements PreparerBase {
token?: string;
constructor(params: { token?: string } = {}) {
this.token = params.token;
}
async prepare(template: TemplateEntityV1alpha1): Promise<string> {
const { protocol, location } = parseLocationAnnotation(template);
const { token } = this;
if (protocol !== 'github') {
throw new InputError(
@@ -45,9 +52,19 @@ export class GithubPreparer implements PreparerBase {
template.spec.path ?? '.',
);
await Clone.clone(repositoryCheckoutUrl, tempDir, {
// TODO(blam): Maybe need some auth here?
});
const cloneOptions = token
? {
fetchOpts: {
callbacks: {
credentials() {
return Cred.userpassPlaintextNew(token, 'x-oauth-basic');
},
},
},
}
: {};
await Clone.clone(repositoryCheckoutUrl, tempDir, cloneOptions);
return path.resolve(tempDir, templateDirectory);
}