Merge branch 'backstage:master' into master

This commit is contained in:
Ambrish R
2025-05-28 15:33:33 +05:30
committed by GitHub
16 changed files with 154 additions and 699 deletions
+27
View File
@@ -0,0 +1,27 @@
---
'@backstage/plugin-scaffolder-backend': major
---
**BREAKING CHANGES**
Removal of deprecated re-exports from module packages.
The following functions have been re-exported from the `scaffolder-backend` plugin for quite some time, and now it's time to clean them up. They've been moved as follows:
- `createPublishAzureAction` should be imported from `@backstage/plugin-scaffolder-backend-module-azure` instead.
- `createPublishBitbucketCloudAction` should be imported from `@backstage/plugin-scaffolder-backend-module-bitbucket-cloud` instead.
- `createPublishBitbucketServerAction` and `createPublishBitbucketServerPullRequestAction` can be imported from `@backstage/plugin-scaffolder-backend-module-bitbucket-server` instead.
- `createPublishBitbucketAction` should be imported from `@backstage/plugin-scaffolder-backend-module-bitbucket` instead.
- `createPublishGerritAction` and `createPublishGerritReviewAction` can be imported from `@backstage/plugin-scaffolder-backend-module-gerrit` instead.
- `createGithubActionsDispatchAction`, `createGithubDeployKeyAction`, `createGithubEnvironmentAction`, `createGithubIssuesLabelAction`, `CreateGithubPullRequestActionOptions`, `createGithubRepoCreateAction`, `createGithubRepoPushAction`, `createGithubWebhookAction`, and `createPublishGithubAction` can be imported from `@backstage/plugin-scaffolder-backend-module-github` instead.
- `createPublishGitlabAction` should be imported from `@backstage/plugin-scaffolder-backend-module-gitlab` instead.
- `ActionContext`. `createTemplateAction`, `executeShellCommand`, `ExecuteShellCommandOptions`, `fetchContents`, `TaskSecrets`, and `TemplateAction` should be imported from `@backstage/plugin-scaffolder-node` instead.
- `ScaffolderEntitiesProcessor` should be imported from `@backstage/plugin-catalog-backend-module-scaffolder-entity-model` instead.
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/plugin-scaffolder-backend': major
---
**BREAKING ALPHA**: The `/alpha` export no longer exports the plugin. Please use `import('@backstage/plugin-scaffolder-backend')` instead as this has been removed.
**BREAKING CHANGES**: The old `createRouter` function which was used in the old backend system has been removed along with the `RouterOptions` type.
+1 -1
View File
@@ -88,7 +88,6 @@
"@backstage/plugin-scaffolder-node": "workspace:^",
"@backstage/types": "workspace:^",
"@opentelemetry/api": "^1.9.0",
"@types/express": "^4.17.6",
"@types/luxon": "^3.0.0",
"concat-stream": "^2.0.0",
"express": "^4.17.1",
@@ -122,6 +121,7 @@
"@backstage/backend-test-utils": "workspace:^",
"@backstage/cli": "workspace:^",
"@backstage/plugin-scaffolder-node-test-utils": "workspace:^",
"@types/express": "^4.17.6",
"@types/fs-extra": "^11.0.0",
"@types/nunjucks": "^3.1.4",
"@types/supertest": "^2.0.8",
@@ -3,7 +3,6 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
import { BackendFeature } from '@backstage/backend-plugin-api';
import { ConditionalPolicyDecision } from '@backstage/plugin-permission-common';
import { Conditions } from '@backstage/plugin-permission-node';
import { JsonObject } from '@backstage/types';
@@ -26,10 +25,6 @@ export const createScaffolderTemplateConditionalDecision: (
conditions: PermissionCriteria<PermissionCondition<'scaffolder-template'>>,
) => ConditionalPolicyDecision;
// @alpha (undocumented)
const _feature: BackendFeature;
export default _feature;
// @alpha
export const scaffolderActionConditions: Conditions<{
hasActionId: PermissionRule<
+23 -257
View File
@@ -3,59 +3,25 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
import { ActionContext as ActionContext_2 } from '@backstage/plugin-scaffolder-node';
import { AuditorService } from '@backstage/backend-plugin-api';
import { AuthService } from '@backstage/backend-plugin-api';
import { AutocompleteHandler } from '@backstage/plugin-scaffolder-node/alpha';
import { BackendFeature } from '@backstage/backend-plugin-api';
import { BackstageCredentials } from '@backstage/backend-plugin-api';
import { CatalogApi } from '@backstage/catalog-client';
import { Config } from '@backstage/config';
import { CreatedTemplateFilter } from '@backstage/plugin-scaffolder-node/alpha';
import { CreatedTemplateGlobal } from '@backstage/plugin-scaffolder-node/alpha';
import { createGithubActionsDispatchAction as createGithubActionsDispatchAction_2 } from '@backstage/plugin-scaffolder-backend-module-github';
import { createGithubDeployKeyAction as createGithubDeployKeyAction_2 } from '@backstage/plugin-scaffolder-backend-module-github';
import { createGithubEnvironmentAction as createGithubEnvironmentAction_2 } from '@backstage/plugin-scaffolder-backend-module-github';
import { createGithubIssuesLabelAction as createGithubIssuesLabelAction_2 } from '@backstage/plugin-scaffolder-backend-module-github';
import { CreateGithubPullRequestActionOptions as CreateGithubPullRequestActionOptions_2 } from '@backstage/plugin-scaffolder-backend-module-github';
import { createGithubRepoCreateAction as createGithubRepoCreateAction_2 } from '@backstage/plugin-scaffolder-backend-module-github';
import { createGithubRepoPushAction as createGithubRepoPushAction_2 } from '@backstage/plugin-scaffolder-backend-module-github';
import { createGithubWebhookAction as createGithubWebhookAction_2 } from '@backstage/plugin-scaffolder-backend-module-github';
import { createPublishAzureAction as createPublishAzureAction_2 } from '@backstage/plugin-scaffolder-backend-module-azure';
import { createPublishBitbucketAction as createPublishBitbucketAction_2 } from '@backstage/plugin-scaffolder-backend-module-bitbucket';
import { createPublishBitbucketCloudAction as createPublishBitbucketCloudAction_2 } from '@backstage/plugin-scaffolder-backend-module-bitbucket-cloud';
import { createPublishBitbucketServerAction as createPublishBitbucketServerAction_2 } from '@backstage/plugin-scaffolder-backend-module-bitbucket-server';
import { createPublishBitbucketServerPullRequestAction as createPublishBitbucketServerPullRequestAction_2 } from '@backstage/plugin-scaffolder-backend-module-bitbucket-server';
import { createPublishGerritAction as createPublishGerritAction_2 } from '@backstage/plugin-scaffolder-backend-module-gerrit';
import { createPublishGerritReviewAction as createPublishGerritReviewAction_2 } from '@backstage/plugin-scaffolder-backend-module-gerrit';
import { createPublishGithubAction as createPublishGithubAction_2 } from '@backstage/plugin-scaffolder-backend-module-github';
import { createPublishGitlabAction as createPublishGitlabAction_2 } from '@backstage/plugin-scaffolder-backend-module-gitlab';
import { createTemplateAction as createTemplateAction_2 } from '@backstage/plugin-scaffolder-node';
import { DatabaseService } from '@backstage/backend-plugin-api';
import { DiscoveryService } from '@backstage/backend-plugin-api';
import { Duration } from 'luxon';
import { EventsService } from '@backstage/plugin-events-node';
import { executeShellCommand as executeShellCommand_2 } from '@backstage/plugin-scaffolder-node';
import { ExecuteShellCommandOptions } from '@backstage/plugin-scaffolder-node';
import express from 'express';
import { fetchContents as fetchContents_2 } from '@backstage/plugin-scaffolder-node';
import { HttpAuthService } from '@backstage/backend-plugin-api';
import { HumanDuration } from '@backstage/types';
import { IdentityApi } from '@backstage/plugin-auth-node';
import { JsonObject } from '@backstage/types';
import { JsonValue } from '@backstage/types';
import { Knex } from 'knex';
import { LifecycleService } from '@backstage/backend-plugin-api';
import { Logger } from 'winston';
import { PermissionEvaluator } from '@backstage/plugin-permission-common';
import { PermissionRule } from '@backstage/plugin-permission-node';
import { PermissionRuleParams } from '@backstage/plugin-permission-common';
import { PermissionsService } from '@backstage/backend-plugin-api';
import { RESOURCE_TYPE_SCAFFOLDER_ACTION } from '@backstage/plugin-scaffolder-common/alpha';
import { RESOURCE_TYPE_SCAFFOLDER_TEMPLATE } from '@backstage/plugin-scaffolder-common/alpha';
import { ScaffolderEntitiesProcessor as ScaffolderEntitiesProcessor_2 } from '@backstage/plugin-catalog-backend-module-scaffolder-entity-model';
import { SchedulerService } from '@backstage/backend-plugin-api';
import { ScmIntegrationRegistry } from '@backstage/integration';
import { ScmIntegrations } from '@backstage/integration';
import { SerializedTask as SerializedTask_2 } from '@backstage/plugin-scaffolder-node';
import { SerializedTaskEvent as SerializedTaskEvent_2 } from '@backstage/plugin-scaffolder-node';
@@ -66,11 +32,11 @@ import { TaskCompletionState as TaskCompletionState_2 } from '@backstage/plugin-
import { TaskContext as TaskContext_2 } from '@backstage/plugin-scaffolder-node';
import { TaskEventType as TaskEventType_2 } from '@backstage/plugin-scaffolder-node';
import { TaskRecovery } from '@backstage/plugin-scaffolder-common';
import { TaskSecrets as TaskSecrets_2 } from '@backstage/plugin-scaffolder-node';
import { TaskSecrets } from '@backstage/plugin-scaffolder-node';
import { TaskSpec } from '@backstage/plugin-scaffolder-common';
import { TaskSpecV1beta3 } from '@backstage/plugin-scaffolder-common';
import { TaskStatus as TaskStatus_2 } from '@backstage/plugin-scaffolder-node';
import { TemplateAction as TemplateAction_2 } from '@backstage/plugin-scaffolder-node';
import { TemplateAction } from '@backstage/plugin-scaffolder-node';
import { TemplateEntityStepV1beta3 } from '@backstage/plugin-scaffolder-common';
import { TemplateFilter as TemplateFilter_2 } from '@backstage/plugin-scaffolder-node';
import { TemplateGlobal as TemplateGlobal_2 } from '@backstage/plugin-scaffolder-node';
@@ -78,9 +44,6 @@ import { TemplateParametersV1beta3 } from '@backstage/plugin-scaffolder-common';
import { UrlReaderService } from '@backstage/backend-plugin-api';
import { WorkspaceProvider } from '@backstage/plugin-scaffolder-node/alpha';
// @public @deprecated (undocumented)
export type ActionContext<TInput extends JsonObject> = ActionContext_2<TInput>;
// @public (undocumented)
export type ActionPermissionRuleInput<
TParams extends PermissionRuleParams = PermissionRuleParams,
@@ -94,7 +57,7 @@ export type ActionPermissionRuleInput<
// @public
export const createBuiltinActions: (
options: CreateBuiltInActionsOptions,
) => TemplateAction_2[];
) => TemplateAction[];
// @public
export interface CreateBuiltInActionsOptions {
@@ -113,7 +76,7 @@ export function createCatalogRegisterAction(options: {
catalogClient: CatalogApi;
integrations: ScmIntegrations;
auth?: AuthService;
}): TemplateAction_2<
}): TemplateAction<
| {
catalogInfoUrl: string;
optional?: boolean;
@@ -128,7 +91,7 @@ export function createCatalogRegisterAction(options: {
>;
// @public
export function createCatalogWriteAction(): TemplateAction_2<
export function createCatalogWriteAction(): TemplateAction<
{
entity: Record<string, any>;
filePath?: string | undefined;
@@ -138,13 +101,13 @@ export function createCatalogWriteAction(): TemplateAction_2<
>;
// @public
export function createDebugLogAction(): TemplateAction_2<any, any, 'v1'>;
export function createDebugLogAction(): TemplateAction<any, any, 'v1'>;
// @public
export function createFetchCatalogEntityAction(options: {
catalogClient: CatalogApi;
auth?: AuthService;
}): TemplateAction_2<
}): TemplateAction<
{
entityRef?: string | undefined;
entityRefs?: string[] | undefined;
@@ -163,7 +126,7 @@ export function createFetchCatalogEntityAction(options: {
export function createFetchPlainAction(options: {
reader: UrlReaderService;
integrations: ScmIntegrations;
}): TemplateAction_2<
}): TemplateAction<
{
url: string;
targetPath?: string;
@@ -177,7 +140,7 @@ export function createFetchPlainAction(options: {
export function createFetchPlainFileAction(options: {
reader: UrlReaderService;
integrations: ScmIntegrations;
}): TemplateAction_2<
}): TemplateAction<
{
url: string;
targetPath: string;
@@ -193,7 +156,7 @@ export function createFetchTemplateAction(options: {
integrations: ScmIntegrations;
additionalTemplateFilters?: Record<string, TemplateFilter_2>;
additionalTemplateGlobals?: Record<string, TemplateGlobal_2>;
}): TemplateAction_2<
}): TemplateAction<
{
url: string;
targetPath?: string;
@@ -217,7 +180,7 @@ export function createFetchTemplateFileAction(options: {
integrations: ScmIntegrations;
additionalTemplateFilters?: Record<string, TemplateFilter_2>;
additionalTemplateGlobals?: Record<string, TemplateGlobal_2>;
}): TemplateAction_2<
}): TemplateAction<
{
url: string;
targetPath: string;
@@ -233,7 +196,7 @@ export function createFetchTemplateFileAction(options: {
>;
// @public
export const createFilesystemDeleteAction: () => TemplateAction_2<
export const createFilesystemDeleteAction: () => TemplateAction<
{
files: string[];
},
@@ -242,7 +205,7 @@ export const createFilesystemDeleteAction: () => TemplateAction_2<
>;
// @public
export const createFilesystemReadDirAction: () => TemplateAction_2<
export const createFilesystemReadDirAction: () => TemplateAction<
{
recursive: boolean;
paths: string[];
@@ -263,7 +226,7 @@ export const createFilesystemReadDirAction: () => TemplateAction_2<
>;
// @public
export const createFilesystemRenameAction: () => TemplateAction_2<
export const createFilesystemRenameAction: () => TemplateAction<
{
files: Array<{
from: string;
@@ -275,127 +238,10 @@ export const createFilesystemRenameAction: () => TemplateAction_2<
'v1'
>;
// @public @deprecated (undocumented)
export const createGithubActionsDispatchAction: typeof createGithubActionsDispatchAction_2;
// @public @deprecated (undocumented)
export const createGithubDeployKeyAction: typeof createGithubDeployKeyAction_2;
// @public @deprecated (undocumented)
export const createGithubEnvironmentAction: typeof createGithubEnvironmentAction_2;
// @public @deprecated (undocumented)
export const createGithubIssuesLabelAction: typeof createGithubIssuesLabelAction_2;
// @public @deprecated (undocumented)
export type CreateGithubPullRequestActionOptions =
CreateGithubPullRequestActionOptions_2;
// @public @deprecated (undocumented)
export const createGithubRepoCreateAction: typeof createGithubRepoCreateAction_2;
// @public @deprecated (undocumented)
export const createGithubRepoPushAction: typeof createGithubRepoPushAction_2;
// @public @deprecated (undocumented)
export const createGithubWebhookAction: typeof createGithubWebhookAction_2;
// @public @deprecated (undocumented)
export const createPublishAzureAction: typeof createPublishAzureAction_2;
// @public @deprecated (undocumented)
export const createPublishBitbucketAction: typeof createPublishBitbucketAction_2;
// @public @deprecated (undocumented)
export const createPublishBitbucketCloudAction: typeof createPublishBitbucketCloudAction_2;
// @public @deprecated (undocumented)
export const createPublishBitbucketServerAction: typeof createPublishBitbucketServerAction_2;
// @public @deprecated (undocumented)
export const createPublishBitbucketServerPullRequestAction: typeof createPublishBitbucketServerPullRequestAction_2;
// @public @deprecated (undocumented)
export const createPublishGerritAction: typeof createPublishGerritAction_2;
// @public @deprecated (undocumented)
export const createPublishGerritReviewAction: typeof createPublishGerritReviewAction_2;
// @public @deprecated (undocumented)
export const createPublishGithubAction: typeof createPublishGithubAction_2;
// @public @deprecated (undocumented)
export const createPublishGithubPullRequestAction: (
options: CreateGithubPullRequestActionOptions_2,
) => TemplateAction_2<
{
title: string;
branchName: string;
targetBranchName?: string;
description: string;
repoUrl: string;
draft?: boolean;
targetPath?: string;
sourcePath?: string;
token?: string;
reviewers?: string[];
assignees?: string[];
teamReviewers?: string[];
commitMessage?: string;
update?: boolean;
forceFork?: boolean;
gitAuthorName?: string;
gitAuthorEmail?: string;
forceEmptyGitAuthor?: boolean;
createWhenEmpty?: boolean;
},
JsonObject,
'v1'
>;
// @public @deprecated (undocumented)
export const createPublishGitlabAction: typeof createPublishGitlabAction_2;
// @public @deprecated (undocumented)
export const createPublishGitlabMergeRequestAction: (options: {
integrations: ScmIntegrationRegistry;
}) => TemplateAction_2<
{
repoUrl: string;
title: string;
description: string;
branchName: string;
targetBranchName?: string | undefined;
sourcePath?: string | undefined;
targetPath?: string | undefined;
token?: string | undefined;
commitAction?: 'auto' | 'update' | 'delete' | 'create' | 'skip' | undefined;
projectid?: string | undefined;
removeSourceBranch?: boolean | undefined;
assignee?: string | undefined;
reviewers?: string[] | undefined;
assignReviewersFromApprovalRules?: boolean | undefined;
labels?: string | string[] | undefined;
},
{
targetBranchName: string;
projectid: string;
projectPath: string;
mergeRequestUrl: string;
},
'v2'
>;
// @public @deprecated
export function createRouter(options: RouterOptions): Promise<express.Router>;
// @public @deprecated (undocumented)
export const createTemplateAction: typeof createTemplateAction_2;
// @public
export function createWaitAction(options?: {
maxWaitTime?: Duration | HumanDuration;
}): TemplateAction_2<HumanDuration, JsonObject, 'v1'>;
}): TemplateAction<HumanDuration, JsonObject, 'v1'>;
// @public
export type CreateWorkerOptions = {
@@ -415,7 +261,7 @@ export type CreateWorkerOptions = {
// @public
export interface CurrentClaimedTask {
createdBy?: string;
secrets?: TaskSecrets_2;
secrets?: TaskSecrets;
spec: TaskSpec;
state?: JsonObject;
taskId: string;
@@ -508,10 +354,7 @@ export class DatabaseTaskStore implements TaskStore {
targetPath: string;
}): Promise<void>;
// (undocumented)
retryTask?(options: {
secrets?: TaskSecrets_2;
taskId: string;
}): Promise<void>;
retryTask?(options: { secrets?: TaskSecrets; taskId: string }): Promise<void>;
// (undocumented)
saveTaskState(options: { taskId: string; state?: JsonObject }): Promise<void>;
// (undocumented)
@@ -526,73 +369,6 @@ export type DatabaseTaskStoreOptions = {
events?: EventsService;
};
// @public @deprecated
export const executeShellCommand: typeof executeShellCommand_2;
// @public @deprecated
export const fetchContents: typeof fetchContents_2;
// @public @deprecated
export interface RouterOptions {
// (undocumented)
actions?: TemplateAction_2<any, any, any>[];
// (undocumented)
additionalTemplateFilters?:
| Record<string, TemplateFilter_2>
| CreatedTemplateFilter<any, any>[];
// (undocumented)
additionalTemplateGlobals?:
| Record<string, TemplateGlobal_2>
| CreatedTemplateGlobal[];
// (undocumented)
additionalWorkspaceProviders?: Record<string, WorkspaceProvider>;
// (undocumented)
auditor?: AuditorService;
// (undocumented)
auth?: AuthService;
// (undocumented)
autocompleteHandlers?: Record<string, AutocompleteHandler>;
// (undocumented)
catalogClient: CatalogApi;
concurrentTasksLimit?: number;
// (undocumented)
config: Config;
// (undocumented)
database: DatabaseService;
// (undocumented)
discovery?: DiscoveryService;
// (undocumented)
events?: EventsService;
// (undocumented)
httpAuth?: HttpAuthService;
// (undocumented)
identity?: IdentityApi;
// (undocumented)
lifecycle?: LifecycleService;
// (undocumented)
logger: Logger;
// (undocumented)
permissionRules?: Array<
TemplatePermissionRuleInput | ActionPermissionRuleInput
>;
// (undocumented)
permissions?: PermissionsService;
// (undocumented)
reader: UrlReaderService;
// (undocumented)
scheduler?: SchedulerService;
// (undocumented)
taskBroker?: TaskBroker_2;
// @deprecated (undocumented)
taskWorkers?: number;
}
// @public @deprecated
export type RunCommandOptions = ExecuteShellCommandOptions;
// @public @deprecated
export const ScaffolderEntitiesProcessor: typeof ScaffolderEntitiesProcessor_2;
// @public
const scaffolderPlugin: BackendFeature;
export default scaffolderPlugin;
@@ -662,7 +438,7 @@ export class TaskManager implements TaskContext_2 {
targetPath: string;
}): Promise<void>;
// (undocumented)
get secrets(): TaskSecrets_2 | undefined;
get secrets(): TaskSecrets | undefined;
// (undocumented)
serializeWorkspace?(options: { path: string }): Promise<void>;
// (undocumented)
@@ -683,9 +459,6 @@ export class TaskManager implements TaskContext_2 {
): Promise<void>;
}
// @public @deprecated (undocumented)
export type TaskSecrets = TaskSecrets_2;
// @public @deprecated
export type TaskStatus = TaskStatus_2;
@@ -778,10 +551,7 @@ export interface TaskStore {
targetPath: string;
}): Promise<void>;
// (undocumented)
retryTask?(options: {
secrets?: TaskSecrets_2;
taskId: string;
}): Promise<void>;
retryTask?(options: { secrets?: TaskSecrets; taskId: string }): Promise<void>;
// (undocumented)
saveTaskState?(options: {
taskId: string;
@@ -803,7 +573,7 @@ export interface TaskStore {
export type TaskStoreCreateTaskOptions = {
spec: TaskSpec;
createdBy?: string;
secrets?: TaskSecrets_2;
secrets?: TaskSecrets;
};
// @public
@@ -850,18 +620,14 @@ export class TaskWorker {
stop(): Promise<void>;
}
// @public @deprecated (undocumented)
export type TemplateAction<TInput extends JsonObject> =
TemplateAction_2<TInput>;
// @public
export class TemplateActionRegistry {
// (undocumented)
get(actionId: string): TemplateAction_2<any, any, any>;
get(actionId: string): TemplateAction<any, any, any>;
// (undocumented)
list(): TemplateAction_2<any, any, any>[];
list(): TemplateAction<any, any, any>[];
// (undocumented)
register(action: TemplateAction_2<any, any, any>): void;
register(action: TemplateAction<any, any, any>): void;
}
// @public @deprecated (undocumented)
@@ -134,7 +134,6 @@ export const scaffolderPlugin = createBackendPlugin({
permissions: coreServices.permissions,
database: coreServices.database,
auth: coreServices.auth,
discovery: coreServices.discovery,
httpRouter: coreServices.httpRouter,
httpAuth: coreServices.httpAuth,
auditor: coreServices.auditor,
@@ -148,7 +147,6 @@ export const scaffolderPlugin = createBackendPlugin({
reader,
database,
auth,
discovery,
httpRouter,
httpAuth,
catalogClient,
@@ -220,7 +218,6 @@ export const scaffolderPlugin = createBackendPlugin({
additionalTemplateGlobals,
auth,
httpAuth,
discovery,
permissions,
autocompleteHandlers,
additionalWorkspaceProviders,
+1 -7
View File
@@ -13,10 +13,4 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { scaffolderPlugin } from './ScaffolderPlugin';
/** @alpha */
const _feature = scaffolderPlugin;
export default _feature;
export * from './service';
export * from './service/alpha';
@@ -1,86 +0,0 @@
/*
* Copyright 2023 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 {
ActionContext as ActionContextNode,
createTemplateAction as createTemplateActionNode,
TaskSecrets as TaskSecretsNode,
TemplateAction as TemplateActionNode,
executeShellCommand as executeShellCommandNode,
ExecuteShellCommandOptions as ExecuteShellCommandOptionsNode,
fetchContents as fetchContentsNode,
} from '@backstage/plugin-scaffolder-node';
import { JsonObject } from '@backstage/types';
import { ScaffolderEntitiesProcessor as ScaffolderEntitiesProcessorModule } from '@backstage/plugin-catalog-backend-module-scaffolder-entity-model';
/**
* @public
* @deprecated Import from {@link @backstage/plugin-scaffolder-node#ActionContext} instead
*/
export type ActionContext<TInput extends JsonObject> =
ActionContextNode<TInput>;
/**
* @public
* @deprecated Use `createTemplateAction` from `@backstage/plugin-scaffolder-node` instead
*/
export const createTemplateAction = createTemplateActionNode;
/**
* @public
* @deprecated Use `TaskSecrets` from `@backstage/plugin-scaffolder-node` instead
*/
export type TaskSecrets = TaskSecretsNode;
/**
* @public
* @deprecated Use `TemplateAction` from `@backstage/plugin-scaffolder-node` instead
*/
export type TemplateAction<TInput extends JsonObject> =
TemplateActionNode<TInput>;
/**
* Options for {@link executeShellCommand}.
*
* @public
* @deprecated Use `ExecuteShellCommandOptions` from `@backstage/plugin-scaffolder-node` instead
*/
export type RunCommandOptions = ExecuteShellCommandOptionsNode;
/**
* Run a command in a sub-process, normally a shell command.
*
* @public
* @deprecated Use `executeShellCommand` from `@backstage/plugin-scaffolder-node` instead
*/
export const executeShellCommand = executeShellCommandNode;
/**
* A helper function that reads the contents of a directory from the given URL.
* Can be used in your own actions, and also used behind fetch:template and fetch:plain
*
* @public
* @deprecated Use `fetchContents` from `@backstage/plugin-scaffolder-node` instead
*/
export const fetchContents = fetchContentsNode;
/**
* Adds support for scaffolder specific entity kinds to the catalog.
*
* @public
* @deprecated Import from `@backstage/plugin-catalog-backend-module-scaffolder-entity-model` instead
*/
export const ScaffolderEntitiesProcessor = ScaffolderEntitiesProcessorModule;
+4 -3
View File
@@ -22,7 +22,8 @@
export { scaffolderPlugin as default } from './ScaffolderPlugin';
export * from './scaffolder';
export * from './service/router';
export * from './lib';
export * from './deprecated';
export {
type TemplatePermissionRuleInput,
type ActionPermissionRuleInput,
} from './service/permissions';
@@ -1,163 +0,0 @@
/*
* Copyright 2023 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 {
createGithubActionsDispatchAction as githubActionsDispatch,
createGithubDeployKeyAction as githubDeployKey,
createGithubEnvironmentAction as githubEnvironment,
createGithubIssuesLabelAction as githubIssuesLabel,
CreateGithubPullRequestActionOptions as GithubPullRequestActionOptions,
createGithubRepoCreateAction as githubRepoCreate,
createGithubRepoPushAction as githubRepoPush,
createGithubWebhookAction as githubWebhook,
createPublishGithubAction as publishGithub,
createPublishGithubPullRequestAction as publishGithubPullRequest,
} from '@backstage/plugin-scaffolder-backend-module-github';
import {
createPublishGitlabAction as publishGitlab,
createPublishGitlabMergeRequestAction as publishGitlabMergeRequest,
} from '@backstage/plugin-scaffolder-backend-module-gitlab';
import { createPublishAzureAction as publishAzure } from '@backstage/plugin-scaffolder-backend-module-azure';
import { createPublishBitbucketAction as publishBitbucket } from '@backstage/plugin-scaffolder-backend-module-bitbucket';
import { createPublishBitbucketCloudAction as publishBitbucketCloud } from '@backstage/plugin-scaffolder-backend-module-bitbucket-cloud';
import {
createPublishBitbucketServerAction as publishBitbucketServer,
createPublishBitbucketServerPullRequestAction as publishBitbucketServerPullRequest,
} from '@backstage/plugin-scaffolder-backend-module-bitbucket-server';
import {
createPublishGerritAction as publishGerrit,
createPublishGerritReviewAction as publishGerritReview,
} from '@backstage/plugin-scaffolder-backend-module-gerrit';
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-github` instead
*/
export const createGithubActionsDispatchAction = githubActionsDispatch;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-github` instead
*/
export const createGithubDeployKeyAction = githubDeployKey;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-github` instead
*/
export const createGithubEnvironmentAction = githubEnvironment;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-github` instead
*/
export const createGithubIssuesLabelAction = githubIssuesLabel;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-github` instead
*/
export type CreateGithubPullRequestActionOptions =
GithubPullRequestActionOptions;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-github` instead
*/
export const createGithubRepoCreateAction = githubRepoCreate;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-github` instead
*/
export const createGithubRepoPushAction = githubRepoPush;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-github` instead
*/
export const createGithubWebhookAction = githubWebhook;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-github` instead
*/
export const createPublishGithubAction = publishGithub;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-github` instead
*/
export const createPublishGithubPullRequestAction = publishGithubPullRequest;
/**
* @public @deprecated use "createPublishBitbucketCloudAction" from \@backstage/plugin-scaffolder-backend-module-bitbucket-cloud or "createPublishBitbucketServerAction" from \@backstage/plugin-scaffolder-backend-module-bitbucket-server instead
*/
export const createPublishBitbucketAction = publishBitbucket;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-bitbucket-cloud` instead
*/
export const createPublishBitbucketCloudAction = publishBitbucketCloud;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-bitbucket-server` instead
*/
export const createPublishBitbucketServerAction = publishBitbucketServer;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-bitbucket-server` instead
*/
export const createPublishBitbucketServerPullRequestAction =
publishBitbucketServerPullRequest;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-azure` instead
*/
export const createPublishAzureAction = publishAzure;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-gerrit` instead
*/
export const createPublishGerritAction = publishGerrit;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-gerrit` instead
*/
export const createPublishGerritReviewAction = publishGerritReview;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-gitlab` instead
*/
export const createPublishGitlabAction = publishGitlab;
/**
* @public
* @deprecated use import from `@backstage/plugin-scaffolder-backend-module-gitlab` instead
*/
export const createPublishGitlabMergeRequestAction = publishGitlabMergeRequest;
@@ -15,6 +15,5 @@
*/
export * from './builtin';
export * from './deprecated';
export { TemplateActionRegistry } from './TemplateActionRegistry';
@@ -1,17 +0,0 @@
/*
* Copyright 2023 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.
*/
export * from './conditionExports';
@@ -0,0 +1,61 @@
/*
* 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 { PermissionRule } from '@backstage/plugin-permission-node';
import {
TemplateEntityStepV1beta3,
TemplateParametersV1beta3,
} from '@backstage/plugin-scaffolder-common';
import {
RESOURCE_TYPE_SCAFFOLDER_ACTION,
RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,
} from '@backstage/plugin-scaffolder-common/alpha';
import { PermissionRuleParams } from '@backstage/plugin-permission-common';
/**
* @public
*/
export type TemplatePermissionRuleInput<
TParams extends PermissionRuleParams = PermissionRuleParams,
> = PermissionRule<
TemplateEntityStepV1beta3 | TemplateParametersV1beta3,
{},
typeof RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,
TParams
>;
export function isTemplatePermissionRuleInput(
permissionRule: TemplatePermissionRuleInput | ActionPermissionRuleInput,
): permissionRule is TemplatePermissionRuleInput {
return permissionRule.resourceType === RESOURCE_TYPE_SCAFFOLDER_TEMPLATE;
}
/**
*
* @public
*/
export type ActionPermissionRuleInput<
TParams extends PermissionRuleParams = PermissionRuleParams,
> = PermissionRule<
TemplateEntityStepV1beta3 | TemplateParametersV1beta3,
{},
typeof RESOURCE_TYPE_SCAFFOLDER_ACTION,
TParams
>;
export function isActionPermissionRuleInput(
permissionRule: TemplatePermissionRuleInput | ActionPermissionRuleInput,
): permissionRule is ActionPermissionRuleInput {
return permissionRule.resourceType === RESOURCE_TYPE_SCAFFOLDER_ACTION;
}
@@ -32,7 +32,6 @@ import {
stringifyEntityRef,
UserEntity,
} from '@backstage/catalog-model';
import { createRouter, DatabaseTaskStore } from '../index';
import {
TaskBroker,
TemplateFilter,
@@ -66,6 +65,8 @@ import {
extractGlobalValueMetadata,
} from '../util/templating';
import { createDefaultFilters } from '../lib/templating/filters/createDefaultFilters';
import { createRouter } from './router';
import { DatabaseTaskStore } from '../scaffolder/tasks/DatabaseTaskStore';
const mockAccess = jest.fn();
@@ -194,7 +195,6 @@ describe.each([
} as unknown as PermissionEvaluator;
const auth = mockServices.auth();
const httpAuth = mockServices.httpAuth();
const discovery = mockServices.discovery();
const events = {
publish: jest.fn(),
} as unknown as EventsService;
@@ -309,7 +309,6 @@ describe.each([
permissions: permissionApi,
auth,
httpAuth,
discovery,
events,
additionalTemplateFilters,
additionalTemplateGlobals,
@@ -886,7 +885,6 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{
permissions: permissionApi,
auth,
httpAuth,
discovery,
});
app = express().use(router);
@@ -1657,7 +1655,6 @@ data: {"id":1,"taskId":"a-random-id","type":"completion","createdAt":"","body":{
permissions: permissionApi,
auth,
httpAuth,
discovery,
autocompleteHandlers: {
'test-provider': handleAutocompleteRequest,
},
+28 -151
View File
@@ -14,13 +14,11 @@
* limitations under the License.
*/
import { createLegacyAuthAdapters } from '@backstage/backend-common';
import {
AuditorService,
AuthService,
BackstageCredentials,
DatabaseService,
DiscoveryService,
HttpAuthService,
LifecycleService,
PermissionsService,
@@ -37,25 +35,19 @@ import {
UserEntity,
} from '@backstage/catalog-model';
import { Config, readDurationFromConfig } from '@backstage/config';
import { InputError, NotFoundError, stringifyError } from '@backstage/errors';
import { InputError, NotFoundError } from '@backstage/errors';
import { ScmIntegrations } from '@backstage/integration';
import {
IdentityApi,
IdentityApiGetIdentityRequest,
} from '@backstage/plugin-auth-node';
import { EventsService } from '@backstage/plugin-events-node';
import { PermissionRuleParams } from '@backstage/plugin-permission-common';
import {
createConditionAuthorizer,
createPermissionIntegrationRouter,
PermissionRule,
} from '@backstage/plugin-permission-node';
import {
TaskSpec,
TemplateEntityStepV1beta3,
TemplateEntityV1beta3,
templateEntityV1beta3Validator,
TemplateParametersV1beta3,
} from '@backstage/plugin-scaffolder-common';
import {
RESOURCE_TYPE_SCAFFOLDER_ACTION,
@@ -82,7 +74,7 @@ import {
CreatedTemplateGlobal,
WorkspaceProvider,
} from '@backstage/plugin-scaffolder-node/alpha';
import { HumanDuration, JsonObject, JsonValue } from '@backstage/types';
import { HumanDuration, JsonObject } from '@backstage/types';
import express from 'express';
import Router from 'express-promise-router';
import { validate } from 'jsonschema';
@@ -109,7 +101,6 @@ import {
parseStringsParam,
} from './helpers';
import { scaffolderActionRules, scaffolderTemplateRules } from './rules';
import { HostDiscovery } from '@backstage/backend-defaults/discovery';
import {
convertFiltersToRecord,
convertGlobalsToRecord,
@@ -118,48 +109,15 @@ import {
extractGlobalValueMetadata,
} from '../util/templating';
import { createDefaultFilters } from '../lib/templating/filters/createDefaultFilters';
/**
*
* @public
*/
export type TemplatePermissionRuleInput<
TParams extends PermissionRuleParams = PermissionRuleParams,
> = PermissionRule<
TemplateEntityStepV1beta3 | TemplateParametersV1beta3,
{},
typeof RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,
TParams
>;
function isTemplatePermissionRuleInput(
permissionRule: TemplatePermissionRuleInput | ActionPermissionRuleInput,
): permissionRule is TemplatePermissionRuleInput {
return permissionRule.resourceType === RESOURCE_TYPE_SCAFFOLDER_TEMPLATE;
}
/**
*
* @public
*/
export type ActionPermissionRuleInput<
TParams extends PermissionRuleParams = PermissionRuleParams,
> = PermissionRule<
TemplateEntityStepV1beta3 | TemplateParametersV1beta3,
{},
typeof RESOURCE_TYPE_SCAFFOLDER_ACTION,
TParams
>;
function isActionPermissionRuleInput(
permissionRule: TemplatePermissionRuleInput | ActionPermissionRuleInput,
): permissionRule is ActionPermissionRuleInput {
return permissionRule.resourceType === RESOURCE_TYPE_SCAFFOLDER_ACTION;
}
import {
ActionPermissionRuleInput,
isActionPermissionRuleInput,
isTemplatePermissionRuleInput,
TemplatePermissionRuleInput,
} from './permissions';
/**
* RouterOptions
*
* @public
* @deprecated Please migrate to the new backend system as this will be removed in the future.
*/
export interface RouterOptions {
logger: Logger;
@@ -170,11 +128,6 @@ export interface RouterOptions {
catalogClient: CatalogApi;
scheduler?: SchedulerService;
actions?: TemplateAction<any, any, any>[];
/**
* @deprecated taskWorkers is deprecated in favor of concurrentTasksLimit option with a single TaskWorker
* @defaultValue 1
*/
taskWorkers?: number;
/**
* Sets the number of concurrent tasks that can be run at any given time on the TaskWorker
* @defaultValue 10
@@ -192,10 +145,8 @@ export interface RouterOptions {
permissionRules?: Array<
TemplatePermissionRuleInput | ActionPermissionRuleInput
>;
auth?: AuthService;
httpAuth?: HttpAuthService;
identity?: IdentityApi;
discovery?: DiscoveryService;
auth: AuthService;
httpAuth: HttpAuthService;
events?: EventsService;
auditor?: AuditorService;
autocompleteHandlers?: Record<string, AutocompleteHandler>;
@@ -205,70 +156,6 @@ function isSupportedTemplate(entity: TemplateEntityV1beta3) {
return entity.apiVersion === 'scaffolder.backstage.io/v1beta3';
}
/*
* @deprecated This function remains as the DefaultIdentityClient behaves slightly differently to the pre-existing
* scaffolder behaviour. Specifically if the token fails to parse, the DefaultIdentityClient will raise an error.
* The scaffolder did not raise an error in this case. As such we chose to allow it to behave as it did previously
* until someone explicitly passes an IdentityApi. When we have reasonable confidence that most backstage deployments
* are using the IdentityApi, we can remove this function.
*/
function buildDefaultIdentityClient(options: RouterOptions): IdentityApi {
return {
getIdentity: async ({ request }: IdentityApiGetIdentityRequest) => {
const header = request.headers.authorization;
const { logger } = options;
if (!header) {
return undefined;
}
try {
const token = header.match(/^Bearer\s(\S+\.\S+\.\S+)$/i)?.[1];
if (!token) {
throw new TypeError('Expected Bearer with JWT');
}
const [_header, rawPayload, _signature] = token.split('.');
const payload: JsonValue = JSON.parse(
Buffer.from(rawPayload, 'base64').toString(),
);
if (
typeof payload !== 'object' ||
payload === null ||
Array.isArray(payload)
) {
throw new TypeError('Malformed JWT payload');
}
const sub = payload.sub;
if (typeof sub !== 'string') {
throw new TypeError('Expected string sub claim');
}
if (sub === 'backstage-server') {
return undefined;
}
// Check that it's a valid ref, otherwise this will throw.
parseEntityRef(sub);
return {
identity: {
userEntityRef: sub,
ownershipEntityRefs: [],
type: 'user',
},
token,
};
} catch (e) {
logger.error(`Invalid authorization header: ${stringifyError(e)}`);
return undefined;
}
},
};
}
const readDuration = (
config: Config,
key: string,
@@ -282,8 +169,6 @@ const readDuration = (
/**
* A method to create a router for the scaffolder backend plugin.
* @public
* @deprecated Please migrate to the new backend system as this will be removed in the future.
*/
export async function createRouter(
options: RouterOptions,
@@ -299,26 +184,19 @@ export async function createRouter(
database,
catalogClient,
actions,
taskWorkers,
scheduler,
additionalTemplateFilters,
additionalTemplateGlobals,
additionalWorkspaceProviders,
permissions,
permissionRules,
discovery = HostDiscovery.fromConfig(config),
identity = buildDefaultIdentityClient(options),
autocompleteHandlers = {},
events: eventsService,
auth,
httpAuth,
auditor,
} = options;
const { auth, httpAuth } = createLegacyAuthAdapters({
...options,
identity,
discovery,
});
const concurrentTasksLimit =
options.concurrentTasksLimit ??
options.config.getOptionalNumber('scaffolder.concurrentTasksLimit');
@@ -391,21 +269,20 @@ export async function createRouter(
'scaffolder.EXPERIMENTAL_gracefulShutdown',
);
for (let i = 0; i < (taskWorkers || 1); i++) {
const worker = await TaskWorker.create({
taskBroker,
actionRegistry,
integrations,
logger,
auditor,
workingDirectory,
concurrentTasksLimit,
permissions,
gracefulShutdown,
...templateExtensions,
});
workers.push(worker);
}
const worker = await TaskWorker.create({
taskBroker,
actionRegistry,
integrations,
logger,
auditor,
workingDirectory,
concurrentTasksLimit,
permissions,
gracefulShutdown,
...templateExtensions,
});
workers.push(worker);
}
const actionsToRegister = Array.isArray(actions)