diff --git a/.changeset/young-apes-thank.md b/.changeset/young-apes-thank.md new file mode 100644 index 0000000000..570316b2e2 --- /dev/null +++ b/.changeset/young-apes-thank.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-github': minor +--- + +Allow empty author info in createPullRequest action for Github diff --git a/plugins/scaffolder-backend-module-github/api-report.md b/plugins/scaffolder-backend-module-github/api-report.md index b1a1c80af5..2bb4342bbf 100644 --- a/plugins/scaffolder-backend-module-github/api-report.md +++ b/plugins/scaffolder-backend-module-github/api-report.md @@ -392,6 +392,7 @@ export const createPublishGithubPullRequestAction: ( forceFork?: boolean | undefined; gitAuthorName?: string | undefined; gitAuthorEmail?: string | undefined; + forceEmptyGitAuthor?: boolean | undefined; }, JsonObject >; diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts index 485f7dec14..ccb1efa29b 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts @@ -1026,5 +1026,40 @@ describe('createPublishGithubPullRequestAction', () => { ], }); }); + it('discards author name and email if forceEmptyGitAuthor is set', async () => { + input.forceEmptyGitAuthor = true; + const clientFactory = jest.fn(async () => fakeClient as any); + const githubCredentialsProvider: GithubCredentialsProvider = { + getCredentials: jest.fn(), + }; + + const instanceWithConfig = createPublishGithubPullRequestAction({ + integrations, + githubCredentialsProvider, + clientFactory, + }); + + await instanceWithConfig.handler(ctx); + + expect(fakeClient.createPullRequest).toHaveBeenCalledWith({ + owner: 'myorg', + repo: 'myrepo', + title: 'Create my new app', + head: 'new-app', + body: 'This PR is really good', + changes: [ + { + commit: 'Create my new app', + files: { + 'file.txt': { + content: Buffer.from('Hello there!').toString('base64'), + encoding: 'base64', + mode: '100644', + }, + }, + }, + ], + }); + }); }); }); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts index 213d24eca7..7fe9d8e401 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts @@ -146,6 +146,7 @@ export const createPublishGithubPullRequestAction = ( forceFork?: boolean; gitAuthorName?: string; gitAuthorEmail?: string; + forceEmptyGitAuthor?: boolean; }>({ id: 'publish:github:pull-request', examples, @@ -246,6 +247,12 @@ export const createPublishGithubPullRequestAction = ( description: "Sets the default author email for the commit. The default value is the authenticated user or 'scaffolder@backstage.io'", }, + forceEmptyGitAuthor: { + type: 'boolean', + title: 'Force Empty Git Author', + description: + 'Forces the author to be empty. This is useful when using a Github App, it permit the commit to be verified on Github', + }, }, }, output: { @@ -287,6 +294,7 @@ export const createPublishGithubPullRequestAction = ( forceFork, gitAuthorEmail, gitAuthorName, + forceEmptyGitAuthor, } = ctx.input; const { owner, repo, host } = parseRepoUrl(repoUrl, integrations); @@ -384,23 +392,25 @@ export const createPublishGithubPullRequestAction = ( config?.getOptionalString('scaffolder.defaultAuthor.email'), }; - if (gitAuthorInfo.name || gitAuthorInfo.email) { - if (Array.isArray(createOptions.changes)) { - createOptions.changes = createOptions.changes.map(change => ({ - ...change, - author: { - name: gitAuthorInfo.name || 'Scaffolder', - email: gitAuthorInfo.email || 'scaffolder@backstage.io', - }, - })); - } else { - createOptions.changes = { - ...createOptions.changes, - author: { - name: gitAuthorInfo.name || 'Scaffolder', - email: gitAuthorInfo.email || 'scaffolder@backstage.io', - }, - }; + if (!forceEmptyGitAuthor) { + if (gitAuthorInfo.name || gitAuthorInfo.email) { + if (Array.isArray(createOptions.changes)) { + createOptions.changes = createOptions.changes.map(change => ({ + ...change, + author: { + name: gitAuthorInfo.name || 'Scaffolder', + email: gitAuthorInfo.email || 'scaffolder@backstage.io', + }, + })); + } else { + createOptions.changes = { + ...createOptions.changes, + author: { + name: gitAuthorInfo.name || 'Scaffolder', + email: gitAuthorInfo.email || 'scaffolder@backstage.io', + }, + }; + } } } diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index c141733ec4..4c7b11ea43 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -289,6 +289,7 @@ export const createPublishGithubPullRequestAction: ( forceFork?: boolean | undefined; gitAuthorName?: string | undefined; gitAuthorEmail?: string | undefined; + forceEmptyGitAuthor?: boolean | undefined; }, JsonObject >;