iBiz建模:为iBizPLM构建GitLab集成插件

为iBizPLM构建GitLab集成插件

概述

本文详细介绍了如何开发一个专为iBizPLM系统设计的GitLab集成插件。该插件能够将GitLab代码仓库与iBizPLM系统深度集成,实现代码提交与PLM工作项的自动关联、状态同步和双向追溯,满足研发流程自动化、代码追溯和项目管理等业务场景需求。

一、背景与需求

1.1 项目背景

iBizPLM系统作为产品生命周期管理的核心平台,管理着产品从概念到退市的完整生命周期。在研发过程中,大量的代码资产存储在GitLab版本控制系统中。企业需要建立代码与PLM工作项之间的关联关系,实现研发过程的透明化和可追溯性,确保每个代码变更都有明确的需求依据。

1.2 核心需求

  • 双向关联:支持从GitLab提交记录关联到PLM工作项,同时支持从PLM工作项跳转到相关代码
  • 状态同步:当代码提交关联工作项时,自动更新PLM工作项状态为"开发完成"
  • 权限控制:插件操作权限与PLM系统本身的权限体系保持一致
  • 实时响应:基于Webhook机制实现代码变更的实时捕获和处理

二、系统设计

该插件是一个具备前后端完整功能的iBizPLM系统插件,通过扩展实体和界面行为增强系统能力。

2.1 全局配置

在系统管理界面提供GitLab集成全局配置功能,包括:

  • Webhook端点配置
  • GitLab实例连接设置
  • 仓库和分支的集中管理
  • PLM项目与GitLab分支的映射关系

2.2 项目级配置

在每个PLM项目后台管理页提供GitLab集成配置:

  • 关联GitLab仓库选择
  • 监控分支配置
  • 提交记录查看界面
  • 关联状态统计展示

2.3 提交关联自动化

在GitLab提交信息中识别PLM工作项编号(如#0001 #0002),自动建立关联并更新状态:
Git提交 GitLab Webhook 插件处理服务 解析工作项编号 更新PLM工作项状态 建立双向关联

三、建模开发

3.1 WebHook准备

建立WebHook实体

建立WEBHOOK_TOKEN实体,提供GitLab Webhook管理能力

WebHook插件

通过自定义WebHook插件,完成了后台接口的注册,其核心功能直接集成自平台(使用 net.ibizsys.central.plugin.util.sysutil.WebhookTokenDESyncUtilRuntime)。

WebHook功能

进行系统功能配置,通过承接上文已配置的插件与实体,并指定util名称及logicId(WebHook回调的处理逻辑ID),以此实现完整的WebHook功能。

当用户在PLM管理界面维护WebHook配置时,系统会同时将相关参数更新至Nacos。

3.2 WebHook回调

WebHook在准备阶段会调用由 DevOps.repository.gitlab_webhook 这一标识符所定义的回调逻辑。其中,DevOps 代表实体模块,repository 代表实体,gitlab_webhook 代表处理逻辑。下文将详细介绍该回调逻辑的配置。

建立 代码仓库[REPOSITORY] 实体
建立处理逻辑并引用回调插件
自定义回调插件

自定义回调插件(cn.ibizlab.plm.plugin.groovy.dataentity.logic.GitlabWebhookDELogicRuntime),插件使用groovy语言,支持热编译及预编译两种模式,可在开发工具中进行代码调试。

下面代码示例GitlabWebhookDELogicRuntime,完整代码请点击访问建模系统

groovy 复制代码
package cn.ibizlab.plm.plugin.groovy.dataentity.logic

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.data.domain.Page

import groovy.util.logging.Slf4j
import java.util.regex.Matcher
import java.util.regex.Pattern
import net.ibizsys.central.ISystemRuntime
import net.ibizsys.central.cloud.core.dataentity.logic.DELogicRuntime
import net.ibizsys.central.util.IEntityDTO
import net.ibizsys.runtime.util.DateUtils

@Slf4j
class GitlabWebhookDELogicRuntime extends DELogicRuntime {

	@Autowired
	ISystemRuntime sys

	String regex = "#[a-zA-Z0-9]*\\d+";
	Pattern pattern = Pattern.compile(regex);

	@Override
	protected Object onExecute(Object[] args) throws Throwable {
		Map body = args[0]
		String event_name = body?.event_name;
		if(!event_name) {
			return "未传入事件名称";
		}

		if(event_name == "push") {
			return onPush(body);
		}
		return "";
	}

	protected Object onPush(Map body) throws Throwable {

		Map project = body?.project;
		if(!project) {
			return "未传入项目";
		}
		def git_http_url = project?.git_http_url;
		if(!git_http_url) {
			return "未传入项目路径";
		}
		String ref = body?.ref;
		if(!ref) {
			return "未传入分支";
		}
		def branch_name = ref.substring(11);
		List commits = body?.commits;
		if(!commits) {
			return "未传入提交";
		}


		//查询相关的仓库
		def REPOSITORY = sys.dataentity("REPOSITORY");
		def filter = REPOSITORY.filter().all().count(false);
		filter.eq("gitpath", git_http_url)
		Page repository_page = filter.fetch();
		if(repository_page.getContent().size() == 0) {
			return "未找到对应的仓库";
		}

		def BRANCH = sys.dataentity("BRANCH");
		for(IEntityDTO item : repository_page) {
			def branch_filter = BRANCH.filter().all().count(false);
			branch_filter.eq("repository_id", item.get("id"));
			branch_filter.eq("name", branch_name);
			Page branch_page = branch_filter.fetch();
			if(branch_page.getContent().size() == 0) {
				return ;
			}
		}


		def COMMIT = sys.dataentity("COMMIT");
		def commit_list = new ArrayList();
		for(Map item : commits) {
			def commit = COMMIT.createEntity()
			commit.set("sha", item?.id)
			commit.set("message", item?.message)
			def timestamp = item?.timestamp;
			if(timestamp){
				commit.set("create_time", DateUtils.parse(timestamp));
			}
			else {
				commit.set("create_time", DateUtils.getCurTime());
			}
			Map author = item?.author;
			if(author) {
				def user_name = author?.name;
				commit.set("create_man", user_name);
			}

			commit_list.add(commit);
		}
		COMMIT.rawCreate(commit_list, true)

		def BRANCH_REF_COMMIT = sys.dataentity("BRANCH_REF_COMMIT");
		def COMMON_FLOW = sys.dataentity("COMMON_FLOW");
		for(IEntityDTO item : repository_page) {
			def branch_filter = BRANCH.filter().all().count(false);
			branch_filter.eq("repository_id", item.get("id"));
			branch_filter.eq("name", branch_name);
			Page branch_page = branch_filter.fetch();
			if(branch_page.getContent().size() == 0) {
				continue;
			}

			for(IEntityDTO branch : branch_page) {
				def project_id =  branch.get("project_id");
				if(project_id){
					for(IEntityDTO commit : commit_list) {
						IEntityDTO branch_ref_commit = BRANCH_REF_COMMIT.createEntity();
						branch_ref_commit.set("repository_id", item.get("id"));
						branch_ref_commit.set("meta_id", branch.get("id"));
						branch_ref_commit.set("sha", commit.get("sha"));
						BRANCH_REF_COMMIT.create(branch_ref_commit, false)
					}
				}
			}
            COMMON_FLOW.notify("SCM_COMMIT", "SCM_COMMIT", commit_list, null, null, null);
		}
		return "成功";
	}
}

3.3 自动化逻辑

在WebHook回调的最后是引用了监控事件为"SCM_COMMIT"的自动化逻辑COMMON_FLOW.notify()。下文将详细介绍该自动化逻辑的配置。

导入 规则模板[TEMPLATE_FLOW] 实体
建立监控事件为"SCM_COMMIT"的自动化逻辑


自动化逻辑在PLM中的应用

3.4 功能界面配置

最后,完成各实体对应的表单、表格及页面配置,并将所有这些模块集成,最终构建出完整的GitLab插件系统。

建立 DevOps模块其他实体,代码分支[BRANCH]、代码提交[COMMIT] 等
配置表单
配置表格
配置页面

四、市场及安装

4.1 将插件加入iBizPLM市场

在iBizPLM的市场定义文件(如 projects.yml)中注册此插件。

4.2 插件安装

在iBizPLM系统"应用市场"进行插件安装

五、插件效果

全局-Webhooks管理

  • 创建PLM Webhook 进入PLM后台管理界面,配置GitLab Webhook;填写令牌值,并复制生成的 Webhook URL。

  • 配置GitLab Webhook 进入 GitLab 项目的 Webhook 配置页面,填写 URL(粘贴之前复制的 Webhook URL),触发事件选择"推送事件",取消勾选"SSL 验证",最后点击"Add webhook"。

全局-仓库与分支管理

  • 统一管理所有已集成的 GitLab 仓库和分支。

全局-分支关联PLM项目

  • GitLab 分支与 PLM 项目进行关联映射,支持查看所有分支的提交历史记录。

项目级配置

  • 支持以 PLM 项目为视角,关联对应的 GitLab 仓库和监控分支,并可查看各项目分支的提交历史记录。

自动化流程

  • 基于模板创建规则 进入 PLM 自动化 → 模板,选择"DevOps"模板,使用该模板创建规则。

  • 应用自动化规则 进入 PLM 自动化 → 规则,启用已创建的自动化规则。

自动化效果

  • 工作项关联与状态更新 系统自动解析提交信息中的 PLM 工作项编号(如 #0001、#0002),并与相应工作项建立关联,同时将其状态更新为"开发完成"。

六、iBizLab开放平台

关于iBizModeling平台、iBiz开源产品请访问iBiz开放平台获取更多。

相关推荐
普普通通的南瓜18 小时前
金融交易防护:国密 SSL 证书在网银与移动支付中的核心作用
网络·网络协议·安全·arcgis·gitlab·ssl·源代码管理
玩电脑的辣条哥1 天前
绿联NAS怎么部署Gitlab或Gitea?
gitlab·gitea
谢尔登2 天前
【GitLab/CI】前端 CI
前端·ci/cd·gitlab
ityangs2 天前
GitLab 私服(基于 Docker)搭建方案
git·docker·容器·gitlab
半梦半醒*4 天前
ELK3——kibana
linux·运维·elasticsearch·centos·gitlab
老年DBA4 天前
Kubernetes 上的 GitLab + ArgoCD 实践(二):使用自建 GitLab Runner 完善 CI 流程
kubernetes·gitlab·argocd
sunyanchun5 天前
gitlab上传新仓库,保留原仓库提交记录,原仓库远程地址已经失效,只有本机还有提交记录
gitlab·1024程序员节
Dreamboat-L5 天前
从零开始在云服务器上部署Gitlab
运维·服务器·gitlab
Gss7777 天前
gitlab介绍与部署
gitlab