云原生DevOps运维【免费下载链接】devtronThe only Kubernetes dashboard you need项目地址https://gitcode.com/gh_mirrors/dev/devtron点击查看免费下载Devtron 的全局插件Global Plugin体系允许开发者以纯 SQL 的方式在数据库中注册一个可复用的自动化能力——从插件元数据、标签、执行脚本、步骤到步骤变量与执行条件全部通过一组结构化的数据表描述随后即可在 CI/CD 流水线的 Pre/Post 阶段中像内置能力一样被引用。本文以仓库开发者指南文档 developers-guide/PluginCreationStep.md 为骨架结合 建表迁移脚本 与真实插件示例如 Terraform CLI 插件完整讲解创建一个新插件的 7 个步骤并补充服务层源码pkg/plugin与变量运行时流转机制帮助你从数据库层彻底理解插件的定义与执行链路。插件体系与数据表全景Devtron 插件的元数据分布在 8 张核心表中其中 7 张由本文主线步骤覆盖另有plugin_stage_mapping用于声明插件可用的阶段类型。建表与初始种子数据见迁移文件 scripts/sql/49_plugin_integration.up.sql。表名作用创建步骤plugin_metadata插件本体名称、描述、类型、图标步骤 1plugin_tag插件标签Load testing、Code quality、Security 等步骤 2plugin_tag_relation标签与插件的多对多关联步骤 3plugin_pipeline_script步骤执行的脚本本体及挂载方式步骤 4script_path_arg_port_mapping脚本的文件路径/命令参数/端口映射步骤 4plugin_step插件内的步骤定义INLINE / REF_PLUGIN步骤 5plugin_step_variable步骤的输入/输出变量步骤 6plugin_step_condition变量上绑定的执行条件步骤 7plugin_stage_mapping插件适用的阶段类型CI / CD / CI_CD / SCANNER补充步骤从源码看这些枚举值都有对应的常量定义见 pkg/plugin/repository/GlobalPluginRepository.go插件类型SHARED、PRESET脚本类型SHELL、DOCKERFILE、CONTAINER_IMAGE映射类型FILE_PATH、DOCKER_ARG、PORT步骤类型INLINE、REF_PLUGIN变量类型INPUT、OUTPUT取值类型NEW、FROM_PREVIOUS_STEP、GLOBAL条件类型SKIP、TRIGGER、SUCCESS、FAIL变量格式STRING、NUMBER、BOOL、DATE。每张业务表都携带审计字段created_on、created_by、updated_on、updated_by与软删除标记deletedf表示未删除、t表示已删除这与仓库全局的审计与软删除规范保持一致。步骤 1在 plugin_metadata 中登记插件元数据任何插件都从一条元数据记录开始。参照真实插件 Terraform CLI 的写法见 scripts/sql/198_terraform_cli.up.sql插入语句如下INSERT INTO plugin_metadata (id, name, description, type, icon, deleted, created_on, created_by, updated_on, updated_by) VALUES (nextval(id_seq_plugin_metadata), name_of_plugin, description_of_plugin, SHARED, link_to_icon, f, now(), user_id, now(), user_id);字段说明id使用序列id_seq_plugin_metadata自增生成该序列在 建表脚本 中创建name插件名称服务层校验要求长度在 3~100 之间见 pkg/plugin/bean/bean.go 中的validate:required,min3,max100,global-entity-name同名的插件会直接报错PluginWithSameNameExistErrortypeSHARED或PRESET。PRESET指随产品内置的预置插件如 K6、Sonarqube、Terraform CLISHARED指共享给所有用户的自建插件icon图标链接服务层会实际请求该链接并校验其可访问性与大小上限 2MB见 pkg/plugin/bean/bean.go 的PluginIconMaxSizeInBytes与 pkg/plugin/utils/utils.go 的FetchIconAndCheckSizedeleted软删除标记f表示有效。注意当前版本的仓库还引入了插件版本化能力plugin_parent_metadata、plugin_metadata中的plugin_version、is_latest等字段定义见 GlobalPluginRepository.go。通过CreatePluginOrVersions接口创建插件时会为插件生成唯一标识identifier由插件名小写化并替换特殊字符得到见 utils.go 的CreateUniqueIdentifier并校验版本号遵循 SemVer 规范ValidatePluginVersion。因此更推荐通过 UI 或 API 完成元数据创建本文的 SQL 方式更适用于理解数据模型与批量初始化。步骤 2为插件添加标签plugin_tag标签用于对插件分类如Load testing、Code quality、Security。若目标标签尚不存在先插入标签本身并记录其id供步骤 3 使用INSERT INTO plugin_tag (id, name, deleted, created_on, created_by, updated_on, updated_by) VALUES (nextval(id_seq_plugin_tag), name_of_tag, f, now(), user_id, now(), user_id);初始种子数据在 49_plugin_integration.up.sql 中可以看到三个预置标签Load testing、Code quality、Security的 id 分别为 1、2、3。步骤 3建立插件与标签的关联plugin_tag_relationplugin_tag_relation是标签与插件的多对多关联表外键定义见 建表脚本。一个插件可以关联多个标签每条关联单独一行INSERT INTO plugin_tag_relation (id, tag_id, plugin_id, created_on, created_by, updated_on, updated_by) VALUES (nextval(id_seq_plugin_tag_relation), id_from_table-plugin_tag, id_from_table-plugin_metadata, now(), user_id, now(), user_id);从真实数据看Sonarqube 插件同时关联了Code quality与Security两个标签见 49_plugin_integration.up.sql印证了一个插件可挂多个标签的规则。服务层在列出插件时会通过getPluginIdTagsMap将标签聚合到插件上见 pkg/plugin/GlobalPluginService.go。步骤 4创建步骤执行脚本与映射plugin_pipeline_script4.1 插入脚本本体对于插件中的每一个自定义INLINE步骤都需要先创建执行脚本INSERT INTO plugin_pipeline_script (id, script, store_script_at, mount_code_to_container, mount_code_to_container_path, mount_directory_from_host, type, deleted, created_on, created_by, updated_on, updated_by) VALUES (nextval(id_seq_plugin_pipeline_script), script, mount_code_at-field-on-UI, true/false, path_if_yes_in_previous_field, true/false, SHELL/CONTAINER_IMAGE, f, now(), user_id, now(), user_id);字段说明对应结构体定义见 GlobalPluginRepository.goscript脚本内容。SHELL类型即一段 shell 脚本真实示例见 Terraform 插件的脚本198_terraform_cli.up.sql其中通过环境变量TERRAFORM_IMAGE、ARGS、WORKINGDIR等驱动docker run执行terraform init与后续命令typeSHELL或CONTAINER_IMAGE另有DOCKERFILE常量见 常量定义。CONTAINER_IMAGE类型的脚本直接以镜像路径 参数运行mount_code_to_containermount_code_to_container_path是否将代码目录挂载进容器以及挂载目标路径mount_directory_from_host是否挂载宿主目录store_script_at脚本存放位置后续版本还扩展了container_image_path、image_pull_secret_typeCONTAINER_REGISTRY/SECRET_PATH、image_pull_secret等字段用于指定容器镜像与拉取密钥。4.2 为脚本补充路径/参数/端口映射若脚本存在文件路径映射mount_directory_from_host场景、命令参数或端口映射则需要逐条写入script_path_arg_port_mappingINSERT INTO script_path_arg_port_mapping (id, type_of_mapping, file_path_on_disk, file_path_on_container, command, args, port_on_local, port_on_container, script_id, deleted, created_on, created_by, updated_on, updated_by) VALUES (nextval(id_seq_script_path_arg_port_mapping), FILE_PATH/DOCKER_ARG/PORT, file_path_mapping_entry, file_path_mapping_entry, command, array_of_args, port_on_local, port_on_container, id-from-script-table, f, now(), user_id, now(), user_id);要点type_of_mapping取值FILE_PATH、DOCKER_ARG、PORT常量见 GlobalPluginRepository.goargs是 PostgreSQL 数组类型建表时定义为text[]见 49_plugin_integration.up.sql对应 Go 结构体中的Args []string一个脚本存在多个映射文件或端口时每条映射都需要单独一行记录外键script_id指向plugin_pipeline_script.id见 建表约束。服务层读取脚本时会将映射聚合到脚本下GetScriptMappingDetailByScriptId与GetScriptMappingDetailByScriptIds见 GlobalPluginRepository.go。步骤 5创建插件步骤plugin_step脚本就绪后即可创建步骤INSERT INTO plugin_step (id, plugin_id, name, description, index, step_type, script_id, ref_plugin_id, deleted, created_on, created_by, updated_on, updated_by) VALUES (nextval(id_seq_plugin_step), id-from-plugin_metadata, name_of_step, description_of_step, index_of_step-start-from-1, INLINE/REF_PLUGIN, id_from_script_table, id-of-ref-plugin-get-from-plugin_metadata, f, now(), user_id, now(), user_id);字段说明结构体见 GlobalPluginRepository.goplugin_id所属插件 id来自plugin_metadataindex步骤在插件内的顺序从 1 开始后续步骤可依赖前一步骤dependent_on_step字段保存前一步名称step_typeINLINE自带脚本执行或REF_PLUGIN引用另一个插件作为步骤。REF_PLUGIN时填写ref_plugin_idscript_id为空INLINE时反之版本化后还扩展了output_directory_path步骤输出目录text[]数组、dependent_on_step等字段。真实示例中Terraform 插件只有一个 INLINE 步骤198_terraform_cli.up.sql其script_id直接取自序列id_seq_plugin_pipeline_script的last_value保证了步骤与刚插入的脚本一一对应。在流水线侧pipeline_stage_step表复用了相同的步骤模型当用户在流水线阶段中添加步骤时INLINE 步骤会按同样方式创建脚本与映射PipelineStageService.go 的CreateStageSteps中先创建脚本再创建步骤REF_PLUGIN 步骤则会深拷贝引用插件的定义BuildRefPluginStepData见 PipelineStageService.go。步骤 6创建步骤变量plugin_step_variable步骤中的输入/输出变量是插件的核心数据契约INSERT INTO plugin_step_variable (id, plugin_step_id, name, format, description, is_exposed, allow_empty_value, variable_type, value_type, previous_step_index, default_value, variable_step_index, deleted, created_on, created_by, updated_on, updated_by) VALUES (nextval(id_seq_plugin_step_variable), id-from-plugin_step, name_of_variable, STRING/BOOL/DATE/NUMBER, description_of_variable, true/false, true/false, INPUT/OUTPUT, NEW/FROM_PREVIOUS_STEP/GLOBAL, index_of_step_of_ref_variable, default_value-nullable, index_of_step_variable_is_present_in, f, now(), user_id, now(), user_id);字段语义结构体见 GlobalPluginRepository.goformat变量格式STRING/NUMBER/BOOL/DATEvariable_typeINPUT用户在流水线中填写或OUTPUT步骤执行后产生供后续步骤消费value_type值的来源NEW用户新填写的值、FROM_PREVIOUS_STEP引用前序步骤输出、GLOBAL引用 Devtron 全局变量is_exposed是否暴露给流水线用户填写对于 REF_PLUGIN 引用场景只有is_exposed true的变量会展示给用户allow_empty_value是否允许空值服务层校验见 pkg/plugin/bean/bean.go 的IsEmptyValueAllowed/IsEmptyValue输出变量恒允许空值previous_step_index当value_type FROM_PREVIOUS_STEP时指明被引用变量所在步骤的 indexdefault_value可空变量未填值时使用variable_step_index变量所在步骤的 index版本化后还扩展了variable_step_index_in_pluginREF_PLUGIN 场景下变量在插件内的步骤 index与reference_variable_name引用变量的名称。真实示例198_terraform_cli.up.sql中Terraform 插件的步骤 1 定义了 8 个 INPUT 变量HTTP_PROXY、HTTPS_PROXY、NO_PROXY、TERRAFORM_IMAGE、WORKINGDIR、ARGS、RUN_TERRAFORM_INITBOOL默认值true、ADDITIONALPARAMS全部为NEW类型——这正好对应脚本中引用的环境变量。另外Devtron 还提供了一批开箱即用的全局变量value_type GLOBAL时可引用定义在 pkg/plugin/GlobalPluginService.go 的GetAllGlobalVariables中例如CI 阶段WORKING_DIRECTORYgit 材料克隆目录仓库 home 路径 WORKING_DIRECTORY CHECKOUT_PATH、DOCKER_IMAGE_TAG、DOCKER_REPOSITORY、DOCKER_REGISTRY_URL、DOCKER_IMAGE、TRIGGER_BY_AUTHOR、APP_NAME/JOB_NAMECD 阶段CD_PIPELINE_ENV_NAME、CD_PIPELINE_CLUSTER_NAME、DOCKER_IMAGE、APP_NAME、DEPLOYMENT_RELEASE_ID、DEPLOYMENT_UNIQUE_ID、CD_TRIGGERED_BY、CD_TRIGGER_TIME、GIT_METADATA含GIT_COMMIT_HASH、GIT_SOURCE_TYPE、GIT_SOURCE_VALUE、APP_LABEL_METADATA、CHILD_CD_METADATA。步骤 7为变量创建执行条件plugin_step_condition条件用于控制步骤在满足/不满足某个变量取值时的行为INSERT INTO plugin_step_condition (id, plugin_step_id, condition_variable_id, condition_type, conditional_operator, conditional_value, deleted, created_on, created_by, updated_on, updated_by) VALUES (nextval(id_seq_plugin_step_condition), id-from-plugin_step, id-of-variable-on-which-condition-is-applied, SKIP/TRIGGER/SUCCESS/FAILURE, conditional_operator, conditional_value, f, now(), user_id, now(), user_id);字段说明结构体见 GlobalPluginRepository.gocondition_variable_id被施加条件的变量 id指向plugin_step_variable.id外键见 建表脚本condition_typeSKIP跳过该步骤、TRIGGER触发该步骤、SUCCESS成功条件、FAIL失败条件——注意原文档写的是FAILURE而源码常量定义为FAILGlobalPluginRepository.go建表注释中同时出现两种写法实际入库应以源码常量为准conditional_operator比较运算符如等于、不等于等conditional_value比较的目标值。服务层在创建/更新插件时会对条件做差分处理新增create、删除delete与更新update三种场景分别处理见 pkg/plugin/GlobalPluginService.go 的saveDeepStepVariableConditionsData、deleteDeepStepVariableConditionsData、updateDeepStepVariableConditionsData。流水线阶段步骤同样拥有独立的条件表pipeline_stage_step_condition运行时通过BuildVariableAndConditionDataByStepId将变量与条件组装成 DTOPipelineStageService.go。补充声明插件适用的阶段plugin_stage_mapping部分场景还需要把插件绑定到特定阶段类型。plugin_stage_mapping的建表与初始化见 scripts/sql/159_create_plugin_stage_mapping.up.sqlstage_type取值对应常量CI(1)、CD(2)、CI_CD(3)、SCANNER(4)GlobalPluginRepository.go。例如 Terraform 插件被映射到stage_type 0对应 CI见 198_terraform_cli.up.sql。服务层通过GetMetaDataForPluginWithStageType按阶段过滤插件列表。从数据到执行变量的运行时流转创建好的插件变量最终会随工作流请求下发到 CI runner。仓库配套文档 developers-guide/PluginIntegrationVariableInfoFlow.md 给出了精确的映射逻辑流水线步骤变量Inline 场景——ValueType到 runner 侧VariableType的映射NEW → VALUE GLOBAL → REF_GLOBAL FROM_PREVIOUS_STEP → 若 ReferenceVariableStage POST_CI 则 REF_POST_CI若 PRE_CI 则 REF_PRE_CI插件变量RefPlugin 场景随refPlugins字段下发——FROM_PREVIOUS_STEP一律映射为REF_PLUGIN。Value 的取值规则Inline 步骤用户有值则取用户值否则取默认值Inline 无默认值概念空即为空RefPlugin若变量无默认值则取用户值因为必须暴露若有默认值且变量已暴露则用户值保存在pipeline_stage_step_variable中取用户值否则取默认值。这套逻辑保证了插件作者定义的默认值与流水线用户填写的覆盖值在运行时正确合流是插件体系可用性的关键一环。创建插件后的验证清单完成 7 个步骤后可对照以下清单检查数据完整性plugin_metadata中存在一条deleted f的插件记录且名称/图标通过服务层校验标签与插件关联plugin_tag_relation正确插件列表页可看到对应分类每个INLINE步骤都有对应的plugin_pipeline_script脚本引用的每个环境变量都已在plugin_step_variable中定义对比 Terraform 示例存在文件/端口映射时script_path_arg_port_mapping中每条映射独立一行且script_id正确REF_PLUGIN步骤的ref_plugin_id指向真实存在的插件需要控制执行时机时plugin_step_condition的condition_variable_id指向真实变量condition_type使用SKIP/TRIGGER/SUCCESS/FAIL需要限定使用阶段时在plugin_stage_mapping中声明stage_type。如需在代码层面验证插件装配逻辑可从 pkg/plugin/GlobalPluginService.go插件 CRUD 与列表装配、pkg/plugin/repository/GlobalPluginRepository.go数据模型与仓储接口以及 pkg/pipeline/PipelineStageService.go流水线阶段步骤构建三个文件入手继续深入。赞分享云原生DevOps运维【免费下载链接】devtronThe only Kubernetes dashboard you need项目地址https://gitcode.com/gh_mirrors/dev/devtron点击查看免费下载相关推荐5个步骤轻松搞定AI绘画插件从安装到创作全流程5个步骤轻松搞定AI绘画插件从安装到创作全流程 还在羡慕别人能用AI绘画创作出惊艳作品吗其实AI绘画插件的安装和使用比你想象的要简单得多今天我就带你用最轻AI 应用媒体生成本地部署rsuite Steps 步骤条组件完全指南从基础用法到动态流程编排rsuite Steps 步骤条组件完全指南从基础用法到动态流程编排 本指南以 rsuite 官方文档 Steps 步骤条组件文档 https://link.前端UI组件Obsidian Git插件完全指南从安装到高级使用的7个关键步骤你是否曾在编辑重要笔记时担心数据丢失是否希望像程序员一样管理你的知识库版本Obsidian Git插件正是你需要的解决方案。作为Obsidian社区中最受欢开发工具版本控制上一篇【亲测免费】 探秘未来游戏体验GPCS4 PlayStation 4 模拟器下一篇Manga OCR技术培训营实战型OCR开发人才培养创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考