diff --git a/.changeset/breezy-coats-sort.md b/.changeset/breezy-coats-sort.md new file mode 100644 index 0000000000..862d60e4fc --- /dev/null +++ b/.changeset/breezy-coats-sort.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-github': patch +--- + +Updates to allow users to subscribe to the newly created repository within GitHub to mimic similar functionality found within the GitHub UI. diff --git a/plugins/scaffolder-backend-module-github/report.api.md b/plugins/scaffolder-backend-module-github/report.api.md index 60ed9db5ef..935886bf14 100644 --- a/plugins/scaffolder-backend-module-github/report.api.md +++ b/plugins/scaffolder-backend-module-github/report.api.md @@ -279,6 +279,7 @@ export function createGithubRepoCreateAction(options: { [key: string]: string; } | undefined; + subscribe?: boolean | undefined; }, JsonObject >; @@ -441,6 +442,7 @@ export function createPublishGithubAction(options: { [key: string]: string; } | undefined; + subscribe?: boolean | undefined; }, JsonObject >; diff --git a/plugins/scaffolder-backend-module-github/src/actions/github.test.ts b/plugins/scaffolder-backend-module-github/src/actions/github.test.ts index f2f36e263a..2f629622d0 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/github.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/github.test.ts @@ -74,6 +74,9 @@ const mockOctokit = { createOrUpdateRepoSecret: jest.fn(), getRepoPublicKey: jest.fn(), }, + activity: { + setRepoSubscription: jest.fn(), + }, }, request: jest.fn(), }; @@ -1796,4 +1799,26 @@ describe('publish:github', () => { }); }, ); + + it('should add user subscription', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'Organization' }, + }); + mockOctokit.rest.repos.createInOrg.mockResolvedValue({ data: {} }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + subscribe: true, + }, + }); + + expect(mockOctokit.rest.activity.setRepoSubscription).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repo', + subscribed: true, + ignored: false, + }); + }); }); diff --git a/plugins/scaffolder-backend-module-github/src/actions/github.ts b/plugins/scaffolder-backend-module-github/src/actions/github.ts index 6d8e0046c2..e3a9ff3352 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/github.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/github.ts @@ -117,6 +117,7 @@ export function createPublishGithubAction(options: { requiredCommitSigning?: boolean; requiredLinearHistory?: boolean; customProperties?: { [key: string]: string }; + subscribe?: boolean; }>({ id: 'publish:github', description: @@ -168,6 +169,7 @@ export function createPublishGithubAction(options: { requiredCommitSigning: inputProps.requiredCommitSigning, requiredLinearHistory: inputProps.requiredLinearHistory, customProperties: inputProps.customProperties, + subscribe: inputProps.subscribe, }, }, output: { @@ -218,6 +220,7 @@ export function createPublishGithubAction(options: { oidcCustomization, token: providedToken, customProperties, + subscribe = false, requiredCommitSigning = false, requiredLinearHistory = false, } = ctx.input; @@ -260,6 +263,7 @@ export function createPublishGithubAction(options: { secrets, oidcCustomization, customProperties, + subscribe, ctx.logger, ); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts index 66d54366c5..864c5b729f 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts @@ -55,6 +55,9 @@ const mockOctokit = { createOrUpdateRepoSecret: jest.fn(), getRepoPublicKey: jest.fn(), }, + activity: { + setRepoSubscription: jest.fn(), + }, }, request: jest.fn(), }; @@ -754,4 +757,26 @@ describe('github:repo:create', () => { 'https://github.com/clone/url.git', ); }); + + it('should subscribe user to repository', async () => { + mockOctokit.rest.users.getByUsername.mockResolvedValue({ + data: { type: 'Organization' }, + }); + mockOctokit.rest.repos.createInOrg.mockResolvedValue({ data: {} }); + + await action.handler({ + ...mockContext, + input: { + ...mockContext.input, + subscribe: true, + }, + }); + + expect(mockOctokit.rest.activity.setRepoSubscription).toHaveBeenCalledWith({ + owner: 'owner', + repo: 'repo', + subscribed: true, + ignored: false, + }); + }); }); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts index 61dea32c35..b4608e57de 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts @@ -102,6 +102,7 @@ export function createGithubRepoCreateAction(options: { requireCommitSigning?: boolean; requiredLinearHistory?: boolean; customProperties?: { [key: string]: string }; + subscribe?: boolean; }>({ id: 'github:repo:create', description: 'Creates a GitHub repository.', @@ -143,6 +144,7 @@ export function createGithubRepoCreateAction(options: { requiredCommitSigning: inputProps.requiredCommitSigning, requiredLinearHistory: inputProps.requiredLinearHistory, customProperties: inputProps.customProperties, + subscribe: inputProps.subscribe, }, }, output: { @@ -176,6 +178,7 @@ export function createGithubRepoCreateAction(options: { secrets, oidcCustomization, customProperties, + subscribe, token: providedToken, } = ctx.input; @@ -217,6 +220,7 @@ export function createGithubRepoCreateAction(options: { secrets, oidcCustomization, customProperties, + subscribe, ctx.logger, ); diff --git a/plugins/scaffolder-backend-module-github/src/actions/helpers.ts b/plugins/scaffolder-backend-module-github/src/actions/helpers.ts index 9bba0ca359..242f95ce34 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/helpers.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/helpers.ts @@ -149,6 +149,7 @@ export async function createGithubRepoWithCollaboratorsAndTopics( } | undefined, customProperties: { [key: string]: string } | undefined, + subscribe: boolean | undefined, logger: LoggerService, ) { // eslint-disable-next-line testing-library/no-await-sync-queries @@ -330,6 +331,15 @@ export async function createGithubRepoWithCollaboratorsAndTopics( ); } + if (subscribe) { + await client.rest.activity.setRepoSubscription({ + subscribed: true, + ignored: false, + owner, + repo, + }); + } + return newRepo; } diff --git a/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts b/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts index 2c86cf492e..8b30168225 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts @@ -317,6 +317,12 @@ const customProperties = { type: 'object', }; +const subscribe = { + title: 'Subscribe to repository', + description: `Subscribe to the repository. The default value is 'false'`, + type: 'boolean', +}; + export { access }; export { allowMergeCommit }; export { allowRebaseMerge }; @@ -357,3 +363,4 @@ export { repoVariables }; export { secrets }; export { oidcCustomization }; export { customProperties }; +export { subscribe };