@ 前方/ 后台- 插脚- 工作流程
为什么?
脚手架工作流程是 后台 这会减轻写锅炉板 几乎任何情况的痛苦.
运行脚手架工作流程 在他们现在的后台位置之外是不可能的, 我们希望运行脚手架工作流程 在任何反应组件 在后台实例.
这种回放提供了做这种事情的构件和使脚手架工作流程在不同情景下运行的组件.
开始
# npm
npm install @backstage/plugin-scaffolder-react
# yarn
yarn add @backstage/plugin-scaffolder-react
#pnpm
pnpm add @backstage/plugin-scaffolder-react
钩子
使用 RunWork 流程 - 踢出脚手架的工作流程, 它返回一个 taskStream 工作流程活动
const templateRef = stringifyEntityRef({
kind: 'Template',
namespace: 'default',
name: 'update-system',
});
const { taskStatus, execute, taskStream } = useRunWorkflow({
templateRef,
onComplete,
onError,
});
使用Stepper 软件 - 跟踪组件实例之外的工作流程步骤:
const templateRef = stringifyEntityRef({
kind: 'Template',
namespace: 'default',
name: 'update-system',
});
const { loading, manifest } = useTemplateParameterSchema(templateRef);
const { currentStep } = useStepper({ manifest });
构成部分
模块工作流程 - 点击链接并按方式运行工作流程表,从而摆脱脚手架工作流程:
<>
{entity?.spec?.system ? entity.spec.system : 'System not specified.'}
<Tooltip title="Assign System">
<IconButton aria-label="Assign System" color="primary" onClick={() => setOpen(true)}>
<SystemUpdateIcon />
</IconButton>
</Tooltip>
<ModalWorkflow
open={open}
onClick={() => {}}
onClose={closeHandler}
onCreate={onCreate}
namespace="default"
templateName="update-system"
initialState={{ url, entityRef, system: entity?.spec?.system ?? '' }}
onError={(_e) => {
// eslint-disable-next-line no-console
console.log('optional error handler')
}}
>
<ScaffolderFieldExtensions>
<EntityPickerFieldExtension />
</ScaffolderFieldExtensions>
<Button
variant="contained"
color="primary"
type="submit"
onClick={onCreate as any}
>
Link
</Button>
</ModalWorkflow>
</>
工作流程按钮 - 如果没有形式元素或不需要用户输入,则可以通过简单的按钮点击执行脚手架工作流程,而按钮有显示状态变化消息的道具:
<WorkflowButton
namespace="default"
templateName="deprecate-component"
components={{
idle: <Idle initialState={{ url, entityRef }} />,
pending: <Pending />,
error: <Error />,
success: <Success />,
modal: <Modal />,
}}
/>
嵌入式脚手架工作流程 - 和传统的脚手架工作流程非常相像,只是它是一个常规组件,可以在后台实例中添加到不同的地方.
export function EntityOnboardingWorkflow(
props: EntityOnboardingWorkflowProps,
): JSX.Element | null {
const { entity } = useEntity();
const entityRef = stringifyEntityRef(entity);
const catalogInfoUrl = entity.metadata?.annotations?.[
ANNOTATION_ORIGIN_LOCATION
].replace(/^url:/, '');
assert(
!!catalogInfoUrl,
`no catalog-info.yaml url in ${ANNOTATION_ORIGIN_LOCATION} annotation`,
);
return (
<EmbeddedScaffolderWorkflow
{...props}
initialState={{ catalogInfoUrl, entityRef }}
/>
);
}