From cfe3a7d5a5165788b6fce028ea6cce901d592e7c Mon Sep 17 00:00:00 2001 From: Benjamin Janssens Date: Fri, 31 Jan 2025 13:44:33 +0100 Subject: [PATCH] refactor(scaffolder): move getOctokitOptions to separate util file Signed-off-by: Benjamin Janssens --- .../src/actions/github.ts | 2 +- .../src/actions/githubActionsDispatch.ts | 2 +- .../src/actions/githubAutolinks.ts | 2 +- .../src/actions/githubBranchProtection.ts | 2 +- .../src/actions/githubDeployKey.ts | 2 +- .../src/actions/githubEnvironment.ts | 2 +- .../githubIssuesLabel.examples.test.ts | 2 +- .../src/actions/githubIssuesLabel.test.ts | 2 +- .../src/actions/githubIssuesLabel.ts | 2 +- .../src/actions/githubPagesEnable.ts | 2 +- .../src/actions/githubPullRequest.ts | 2 +- .../src/actions/githubRepoCreate.ts | 6 +- .../src/actions/githubRepoPush.ts | 3 +- .../src/actions/githubWebhook.ts | 2 +- .../src/actions/helpers.ts | 77 +--------------- .../src/actions/index.ts | 2 - .../src/index.ts | 1 + .../src/util.ts | 92 +++++++++++++++++++ 18 files changed, 110 insertions(+), 95 deletions(-) create mode 100644 plugins/scaffolder-backend-module-github/src/util.ts diff --git a/plugins/scaffolder-backend-module-github/src/actions/github.ts b/plugins/scaffolder-backend-module-github/src/actions/github.ts index da54b7c8cb..4c04087670 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/github.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/github.ts @@ -27,9 +27,9 @@ import { } from '@backstage/plugin-scaffolder-node'; import { createGithubRepoWithCollaboratorsAndTopics, - getOctokitOptions, initRepoPushAndProtect, } from './helpers'; +import { getOctokitOptions } from '../util'; import * as inputProps from './inputProperties'; import * as outputProps from './outputProperties'; import { examples } from './github.examples'; diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.ts b/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.ts index 4c83f538ce..93f89a565c 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.ts @@ -24,7 +24,7 @@ import { parseRepoUrl, } from '@backstage/plugin-scaffolder-node'; import { Octokit } from 'octokit'; -import { getOctokitOptions } from './helpers'; +import { getOctokitOptions } from '../util'; import { examples } from './githubActionsDispatch.examples'; /** diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.ts b/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.ts index 2037287fad..b55811630b 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.ts @@ -25,7 +25,7 @@ import { } from '@backstage/plugin-scaffolder-node'; import { Octokit } from 'octokit'; import { examples } from './githubAutolinks.examples'; -import { getOctokitOptions } from './helpers'; +import { getOctokitOptions } from '../util'; /** * Create an autolink reference for a repository diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts index b8716a3f8f..5d5366a7b1 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts @@ -22,7 +22,7 @@ import { import { ScmIntegrationRegistry } from '@backstage/integration'; import { examples } from './githubBranchProtection.examples'; import * as inputProps from './inputProperties'; -import { getOctokitOptions } from './helpers'; +import { getOctokitOptions } from '../util'; import { Octokit } from 'octokit'; import { enableBranchProtectionOnDefaultRepoBranch } from './gitHelpers'; diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.ts b/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.ts index c9a881c6b1..6a7a2f86c6 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.ts @@ -20,7 +20,7 @@ import { parseRepoUrl, } from '@backstage/plugin-scaffolder-node'; import { ScmIntegrationRegistry } from '@backstage/integration'; -import { getOctokitOptions } from './helpers'; +import { getOctokitOptions } from '../util'; import { Octokit } from 'octokit'; import Sodium from 'libsodium-wrappers'; import { examples } from './githubDeployKey.examples'; diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts index 736b562d54..5d3817ee6d 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts @@ -20,7 +20,7 @@ import { parseRepoUrl, } from '@backstage/plugin-scaffolder-node'; import { ScmIntegrationRegistry } from '@backstage/integration'; -import { getOctokitOptions } from './helpers'; +import { getOctokitOptions } from '../util'; import { Octokit } from 'octokit'; import Sodium from 'libsodium-wrappers'; import { examples } from './gitHubEnvironment.examples'; diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.examples.test.ts index 75ac6025ce..8230053fda 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.examples.test.ts @@ -25,7 +25,7 @@ import { import { createGithubIssuesLabelAction } from './githubIssuesLabel'; import yaml from 'yaml'; import { examples } from './githubIssuesLabel.examples'; -import { getOctokitOptions } from './helpers'; +import { getOctokitOptions } from '../util'; jest.mock('./helpers', () => { return { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.test.ts index 13c7df68cb..1340a28d14 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.test.ts @@ -23,7 +23,7 @@ import { import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; import { ConfigReader } from '@backstage/config'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; -import { getOctokitOptions } from './helpers'; +import { getOctokitOptions } from '../util'; jest.mock('./helpers', () => { return { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.ts b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.ts index 7814429bd7..0ce6642f39 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.ts @@ -24,7 +24,7 @@ import { } from '@backstage/plugin-scaffolder-node'; import { assertError, InputError } from '@backstage/errors'; import { Octokit } from 'octokit'; -import { getOctokitOptions } from './helpers'; +import { getOctokitOptions } from '../util'; import { examples } from './githubIssuesLabel.examples'; /** diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts index f8df207638..54bcfbcc43 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts @@ -25,7 +25,7 @@ import { parseRepoUrl, } from '@backstage/plugin-scaffolder-node'; import { examples } from './githubPagesEnable.examples'; -import { getOctokitOptions } from '@backstage/plugin-scaffolder-backend-module-github'; +import { getOctokitOptions } from '../util'; /** * Creates a new action that enables GitHub Pages for a repository. diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts index 63496133f1..44830b3047 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts @@ -28,7 +28,7 @@ import { import { Octokit } from 'octokit'; import { CustomErrorBase, InputError } from '@backstage/errors'; import { createPullRequest } from 'octokit-plugin-create-pull-request'; -import { getOctokitOptions } from './helpers'; +import { getOctokitOptions } from '../util'; import { examples } from './githubPullRequest.examples'; import { LoggerService, diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts index a3a758e005..b103dffb15 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts @@ -24,10 +24,8 @@ import { createTemplateAction, parseRepoUrl, } from '@backstage/plugin-scaffolder-node'; -import { - createGithubRepoWithCollaboratorsAndTopics, - getOctokitOptions, -} from './helpers'; +import { createGithubRepoWithCollaboratorsAndTopics } from './helpers'; +import { getOctokitOptions } from '../util'; import * as inputProps from './inputProperties'; import * as outputProps from './outputProperties'; import { examples } from './githubRepoCreate.examples'; diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts index b11c4b8f5c..dcb159806c 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts @@ -25,7 +25,8 @@ import { createTemplateAction, parseRepoUrl, } from '@backstage/plugin-scaffolder-node'; -import { getOctokitOptions, initRepoPushAndProtect } from './helpers'; +import { initRepoPushAndProtect } from './helpers'; +import { getOctokitOptions } from '../util'; import * as inputProps from './inputProperties'; import * as outputProps from './outputProperties'; import { examples } from './githubRepoPush.examples'; diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.ts b/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.ts index 0289d3c69b..13200a56d0 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.ts @@ -25,7 +25,7 @@ import { import { emitterEventNames } from '@octokit/webhooks'; import { assertError, InputError } from '@backstage/errors'; import { Octokit } from 'octokit'; -import { getOctokitOptions } from './helpers'; +import { getOctokitOptions } from '../util'; import { examples } from './githubWebhook.examples'; /** diff --git a/plugins/scaffolder-backend-module-github/src/actions/helpers.ts b/plugins/scaffolder-backend-module-github/src/actions/helpers.ts index 45e4229e73..8e6e521c29 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/helpers.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/helpers.ts @@ -15,13 +15,7 @@ */ import { Config } from '@backstage/config'; -import { assertError, InputError, NotFoundError } from '@backstage/errors'; -import { - DefaultGithubCredentialsProvider, - GithubCredentialsProvider, - ScmIntegrationRegistry, -} from '@backstage/integration'; -import { OctokitOptions } from '@octokit/core/dist-types/types'; +import { assertError, NotFoundError } from '@backstage/errors'; import { Octokit } from 'octokit'; import { @@ -36,75 +30,6 @@ import { } from './gitHelpers'; import { LoggerService } from '@backstage/backend-plugin-api'; -const DEFAULT_TIMEOUT_MS = 60_000; - -/** - * Helper for generating octokit configuration options for given repoUrl. - * If no token is provided, it will attempt to get a token from the credentials provider. - * @public - */ -export async function getOctokitOptions(options: { - integrations: ScmIntegrationRegistry; - credentialsProvider?: GithubCredentialsProvider; - host: string; - owner?: string; - repo?: string; - token?: string; -}): Promise { - const { integrations, credentialsProvider, host, owner, repo, token } = - options; - - const requestOptions = { - // set timeout to 60 seconds - timeout: DEFAULT_TIMEOUT_MS, - }; - - const integrationConfig = integrations.github.byHost(host)?.config; - - if (!integrationConfig) { - throw new InputError(`No integration for host ${host}`); - } - - // short circuit the `githubCredentialsProvider` if there is a token provided by the caller already - if (token) { - return { - auth: token, - baseUrl: integrationConfig.apiBaseUrl, - previews: ['nebula-preview'], - request: requestOptions, - }; - } - - if (!owner || !repo) { - throw new InputError( - `No owner and/or owner provided, which is required if a token is not provided`, - ); - } - - const githubCredentialsProvider = - credentialsProvider ?? - DefaultGithubCredentialsProvider.fromIntegrations(integrations); - - const { token: credentialProviderToken } = - await githubCredentialsProvider.getCredentials({ - url: `https://${host}/${encodeURIComponent(owner)}/${encodeURIComponent( - repo, - )}`, - }); - - if (!credentialProviderToken) { - throw new InputError( - `No token available for host: ${host}, with owner ${owner}, and repo ${repo}. Make sure GitHub auth is configured correctly. See https://backstage.io/docs/auth/github/provider for more details.`, - ); - } - - return { - auth: credentialProviderToken, - baseUrl: integrationConfig.apiBaseUrl, - previews: ['nebula-preview'], - }; -} - export async function createGithubRepoWithCollaboratorsAndTopics( client: Octokit, repo: string, diff --git a/plugins/scaffolder-backend-module-github/src/actions/index.ts b/plugins/scaffolder-backend-module-github/src/actions/index.ts index c758415e1d..7cf4109e6b 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/index.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/index.ts @@ -29,5 +29,3 @@ export { createPublishGithubAction } from './github'; export { createGithubAutolinksAction } from './githubAutolinks'; export { createGithubPagesEnableAction } from './githubPagesEnable'; export { createGithubBranchProtectionAction } from './githubBranchProtection'; - -export { getOctokitOptions } from './helpers'; diff --git a/plugins/scaffolder-backend-module-github/src/index.ts b/plugins/scaffolder-backend-module-github/src/index.ts index 219ba54dbb..cf0bc003cb 100644 --- a/plugins/scaffolder-backend-module-github/src/index.ts +++ b/plugins/scaffolder-backend-module-github/src/index.ts @@ -22,3 +22,4 @@ export * from './actions'; export { githubModule as default } from './module'; +export { getOctokitOptions } from './util'; diff --git a/plugins/scaffolder-backend-module-github/src/util.ts b/plugins/scaffolder-backend-module-github/src/util.ts new file mode 100644 index 0000000000..575ad8c6ed --- /dev/null +++ b/plugins/scaffolder-backend-module-github/src/util.ts @@ -0,0 +1,92 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { InputError } from '@backstage/errors'; +import { + DefaultGithubCredentialsProvider, + GithubCredentialsProvider, + ScmIntegrationRegistry, +} from '@backstage/integration'; +import { OctokitOptions } from '@octokit/core/dist-types/types'; + +const DEFAULT_TIMEOUT_MS = 60_000; + +/** + * Helper for generating octokit configuration options for given repoUrl. + * If no token is provided, it will attempt to get a token from the credentials provider. + * @public + */ +export async function getOctokitOptions(options: { + integrations: ScmIntegrationRegistry; + credentialsProvider?: GithubCredentialsProvider; + host: string; + owner?: string; + repo?: string; + token?: string; +}): Promise { + const { integrations, credentialsProvider, host, owner, repo, token } = + options; + + const requestOptions = { + // set timeout to 60 seconds + timeout: DEFAULT_TIMEOUT_MS, + }; + + const integrationConfig = integrations.github.byHost(host)?.config; + + if (!integrationConfig) { + throw new InputError(`No integration for host ${host}`); + } + + // short circuit the `githubCredentialsProvider` if there is a token provided by the caller already + if (token) { + return { + auth: token, + baseUrl: integrationConfig.apiBaseUrl, + previews: ['nebula-preview'], + request: requestOptions, + }; + } + + if (!owner || !repo) { + throw new InputError( + `No owner and/or owner provided, which is required if a token is not provided`, + ); + } + + const githubCredentialsProvider = + credentialsProvider ?? + DefaultGithubCredentialsProvider.fromIntegrations(integrations); + + const { token: credentialProviderToken } = + await githubCredentialsProvider.getCredentials({ + url: `https://${host}/${encodeURIComponent(owner)}/${encodeURIComponent( + repo, + )}`, + }); + + if (!credentialProviderToken) { + throw new InputError( + `No token available for host: ${host}, with owner ${owner}, and repo ${repo}. Make sure GitHub auth is configured correctly. See https://backstage.io/docs/auth/github/provider for more details.`, + ); + } + + return { + auth: credentialProviderToken, + baseUrl: integrationConfig.apiBaseUrl, + previews: ['nebula-preview'], + }; +}