Gerrit-Gerrit与GitLab集成

Gerrit-Gerrit与GitLab集成
1 - 简介
虽然Gerrit 本⾝提供 Code Review和 Git 仓库的两⼤功能,但实际上很多项⽬⽤的是其他的Git仓库,例如GitLab和GitHub。
⼀般情况下,Gerrit位于最终代码库的前⾯⼀层,⽤于代码的⼈⼯审核和对CI任务的触发进⾏验证。
这⾥以GitLab为例
Gerrit和GitLab集成后,在Gerrit上的项⽬仓库有变化时,会⾃动同步到GitLab上对应的项⽬仓库中。
但Gerrit和GitLab的同步只能是单向同步(Gerrit--》GitLab),也就是说直接在GitLab上项⽬仓库的变动不会⾃动同步到Gerrit上。
因此建议在Gerrit和GitLab集成后,所有的操作都在Gerrit上完成。
Replication插件
如果想要将Gerrit上的改动⾃动同步到GitLab上,就需要⽤到Gerrit的Replication插件。
Replication 插件可以同时对接已有的 Git 仓库系统,通常⽤于提供 changes 的镜像或者热备份,⾃动地将 Gerrit Code Review创建的任何改动 push 到另外⼀个系统⾥。
2 - 权限配置
2.1 配置Gerrit访问GitLab
将Gerrit的公钥添加到GitLab的管理员账号后,Gerrit服务可以通过SSH拉取GitLab上任意项⽬的代码。
特别注意:gerrit⽤户和root⽤户的公钥都要添加!
[gerrit@mt101 ~]$ pwd
/home/gerrit
[gerrit@mt101 ~]$ whoami
gerrit
[gerrit@mt101 ~]$ pwd
/home/gerrit
[gerrit@mt101 ~]$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCE36kKv9cRTR/UU+7c620a6sYwptzVCRa8KBWBVijXNME+te4Nt2ZKp1uVvVOYKWv4akR/E5wMMTa9sYiE7EZJsC0cfg+FSuvc7WeoyT0hWYEWAabqp1cAApZUKSm7c06829dSTAPLj4M [gerrit@mt101 ~]$
[gerrit@mt101 ~]$ su - root
Password:
Last login: Fri Dec 13 23:15:07 CST 2019 on pts/0
ABRT has detected 1 problem(s). For more info run: abrt-cli list --since 1576224692
[root@mt101 ~]#
[root@mt101 ~]# pwd
/root
[root@mt101 ~]# whoami
root
[root@mt101 ~]# ll .ssh
total 8
-rw------- 1 root root 1679 Dec 11 23:10 id_rsa
-rw-r--r-- 1 root root  392 Dec 11 23:10 id_rsa.pub
[root@mt101 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDkUOVXJ49OolxX34Lh/qlLmdEtYbPWlELx/Kxk6EWfmuGI6eYYVIOSE4b43nEXP0T0DM8j0jat75dZ4Zc+Z21PVplJ4uUuruBV/JMfOzx2vUD2zAFELq0TX4IMRJpPjYrk6asx1KYQUr/lQIxgqUbFs [root@mt101 ~]#
[root@mt101 ~]# exit
logout
[gerrit@mt101 ~]$
root账户登录GitLab:Settings---》SSH Keys---》添加并保存。
2.2 配置GitLab访问Gerrit
GitLab:192.168.16.102
[root@mt102 ~]# pwd
/root
[root@mt102 ~]# whoami
root
[root@mt102 ~]# ll .ssh
total 8
-rw------- 1 root root 1679 Dec 11 15:37 id_rsa
-
rw-r--r-- 1 root root  392 Dec 11 15:37 id_rsa.pub
[root@mt102 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGiLcDnAaj2gOemJKcnlGnGmy0cb9N2uaqyuzWdPZai+blPq7Mqt4DICnRKeU0MAoeEuSM8ST01zItwrTlsPZNMKEjJ60PqAohWhHHtJuHu0sl6fs2gdrgtGtjBeqRJ9C4iRTlD3PWCqzA9M7+vZhfP [root@mt102 ~]#
[root@mt102 ~]#
[root@mt102 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.16.101
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.16.101 (192.168.16.101)' can't be established.
ECDSA key fingerprint is SHA256:oShRek8kc5ZO9vmSnwSPuWxKieGfPuTG8VorbWM6CiE.
ECDSA key fingerprint is MD5:94:44:a1:ea:8c:c9:2b:fd:85:5e:a5:78:2d:1e:b4:53.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.16.101's password:
Number of key(s) added: 1
Now try logging into the machine, with:  "ssh 'root@192.168.16.101'"
四川人口与计划生育条例
and check to make sure that only the key(s) you wanted were added.
[root@mt102 ~]#
[root@mt102 ~]# ssh 192.168.16.101
Last login: Fri Dec 13 23:20:42 2019
[root@mt101 ~]# exit
logout辟谣百科
Connection to 192.168.16.101 closed.
[root@mt102 ~]#
[root@mt102 ~]# ll .ssh
total 12
-rw------- 1 root root 1679 Dec 11 15:37 id_rsa
-rw-r--r-- 1 root root  392 Dec 11 15:37 id_rsa.pub
-rw-r--r-- 1 root root  176 Dec 13 23:27 known_hosts
[root@mt102 ~]#
[root@mt102 ~]# cat .ssh/known_hosts
192.168.16.101 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMtkxCPeK5boH0UWlpVYqNv3fIqsZSTj+9iW1l6XV6QHavtFg3QPpB37hAd3PIRPdOzIvwEoTWvk3vks2vzTPMI=
[root@mt102 ~]#
Gerrit:192.168.16.101
[gerrit@mt101 ~]$
[gerrit@mt101 ~]$ su - root
Password:
Last login: Fri Dec 13 23:27:49 CST 2019 from 192.168.16.102 on pts/1
[root@mt101 ~]#
total 12
-rw------- 1 root root  392 Dec 13 23:27 authorized_keys
-rw------- 1 root root 1679 Dec 11 23:10 id_rsa
-rw-r--r-- 1 root root  392 Dec 11 23:10 id_rsa.pub
[root@mt101 ~]#
[root@mt101 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.16.102
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.16.102 (192.168.16.102)' can't be established.
ECDSA key fingerprint is SHA256:oShRek8kc5ZO9vmSnwSPuWxKieGfPuTG8VorbWM6CiE.
ECDSA key fingerprint is MD5:94:44:a1:ea:8c:c9:2b:fd:85:5e:a5:78:2d:1e:b4:53.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.16.102's password:
Number of key(s) added: 1
Now try logging into the machine, with:  "ssh 'root@192.168.16.102'"
and check to make sure that only the key(s) you wanted were added.
[root@mt101 ~]#
[root@mt101 ~]# ssh 192.168.16.102
Last login: Fri Dec 13 23:12:23 2019
[root@mt102 ~]# exit
logout
Connection to 192.168.16.102 closed.
[root@mt101 ~]#
[root@mt101 ~]# ll .ssh/
total 16
-rw------- 1 root root  392 Dec 13 23:27 authorized_keys
-rw------- 1 root root 1679 Dec 11 23:10 id_rsa
-rw-r--r-- 1 root root  392 Dec 11 23:10 id_rsa.pub
-rw-r--r-- 1 root root  176 Dec 13 23:31 known_hosts
[root@mt101 ~]#
[root@mt101 ~]# cat .ssh/known_hosts
192.168.16.102 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMtkxCPeK5boH0UWlpVYqNv3fIqsZSTj+9iW1l6XV6QHavtFg3QPpB37hAd3PIRPdOzIvwEoTWvk3vks2vzTPMI= [root@mt101 ~]#
在Gerrit服务器上编辑⽤户同步Gitlab的配置⽂件,需要⼿动创建
[gerrit@mt101 ~]$ cd gerrit_testsite/etc/
[gerrit@mt101 etc]$ pwd
/home/gerrit/gerrit_testsite/etc
[gerrit@mt101 etc]$
[gerrit@mt101 etc]$ vim .ssh/config
[gerrit@mt101 etc]$ cat .ssh/config
Host 192.168.16.102
IdentityFile ~/.ssh/id_rsa
PreferredAuthentications publickey
[gerrit@mt101 etc]$
[gerrit@mt101 etc]$ ll .ssh/config
-rw------- 1 gerrit gerrit 86 Dec 13 23:37 .ssh/config
[gerrit@mt101 etc]$
3 - 更新Gerrit配置⽂件
在Gerrit配置⽂件中添加关于的设置。
replication插件⽤于实现Gerrit和远程代码仓库的⾃动同步。
[plugins]
allowRemoteAdmin = true
添加并重启Gerrit服务
[gerrit@mt101 ~]$ sudo vim gerrit_testsite/fig
[gerrit@mt101 ~]$ sudo cat gerrit_testsite/fig
[gerrit]
basePath = git
canonicalWebUrl = 192.168.16.101:8083/
serverId = 0b911b9e-195a-46b0-a5cd-b407b776b344
[container]
javaOptions = "-Dflogger.backend_lemon.flogger.backend.log4j.Log4jBackendFactory#getInstance"
javaOptions = "-Dflogger.logging_le.gerrit.server.logging.LoggingContext#getInstance"
user = root
javaHome = /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre
[index]
type = lucene
[auth]
type = HTTP
[receive]
enableSignedPush = false
[sendemail]
smtpServer = localhost
[sshd]
listenAddress = *:29418
[httpd]
listenUrl = 192.168.16.101:8083/
[cache]
directory = cache
西方普世价值观
[gitweb]
type = gitweb
cgi = /var/www/i
[plugins]
allowRemoteAdmin = true
[gerrit@mt101 ~]$
[gerrit@mt101 ~]$ sudo sh gerrit_testsite/bin/gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK
[gerrit@mt101 ~]$
4 - 在Gerrit中创建项⽬
4.1 在GitLab中创建⼀个项⽬
kh560
关闭Auto DevOps:Settings---》CI/CD---》Auto DevOps,去除勾选---》Save changes
添加ReadMe⽂件
git@192.168.16.102:root/testrepo.git
4.2 在Gerrit创建⼀个空项⽬并同步GitLab医蛭
删除⾃动创建的⽬录:sudo rm -rf testrepo.git/
重新从GitLab复制:git clone --bare git@192.168.16.102:root/testrepo.git
[gerrit@mt101 git]$ pwd
/home/gerrit/gerrit_testsite/git
[gerrit@mt101 git]$
[gerrit@mt101 git]$ ll
total 0
drwxr-xr-x 7 gerrit gerrit 119 Dec 10 14:43 All-Projects.git
drwxr-xr-x 7 gerrit gerrit 119 Dec 11 12:26 All-Users.git
drwxr-xr-x 7 root  root  100 Dec 12 14:57 testrepo.git
[gerrit@mt101 git]$
[gerrit@mt101 git]$ sudo rm -rf testrepo.git/
[gerrit@mt101 git]$
lcu[gerrit@mt101 git]$ git clone --bare git@192.168.16.102:root/testrepo.git
Cloning into bare repository 'testrepo.git'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
[gerrit@mt101 git]$
[gerrit@mt101 git]$ ll
total 0
drwxr-xr-x 7 gerrit gerrit 119 Dec 10 14:43 All-Projects.git
drwxr-xr-x 7 gerrit gerrit 119 Dec 11 12:26 All-Users.git
drwxrwxr-x 7 gerrit gerrit 138 Dec 12 15:04 testrepo.git
[gerrit@mt101 git]$
[gerrit@mt101 git]$ ll testrepo.git/
total 16
drwxrwxr-x 2 gerrit gerrit  6 Dec 12 15:04 branches
-rw-rw-r-- 1 gerrit gerrit 128 Dec 12 15:04 config
-rw-rw-r-- 1 gerrit gerrit  73 Dec 12 15:04 description
-rw-rw-r-- 1 gerrit gerrit  23 Dec 12 15:04 HEAD
drwxrwxr-x 2 gerrit gerrit 242 Dec 12 15:04 hooks
drwxrwxr-x 2 gerrit gerrit  21 Dec 12 15:04 info
drwxrwxr-x 4 gerrit gerrit  30 Dec 12 15:04 objects
-rw-rw-r-- 1 gerrit gerrit  98 Dec 12 15:04 packed-refs
drwxrwxr-x 4 gerrit gerrit  31 Dec 12 15:04 refs
[gerrit@mt101 git]$
[gerrit@mt101 git]$ cat  testrepo.git/config
[core]
repositoryformatversion = 0
filemode = true
bare = true
[remote "origin"]
url = git@192.168.16.102:root/testrepo.git
[gerrit@mt101 git]$
5 - 配置Grerrit与GitLab的同步
5.1 replication插件
通过Gerrit的replication插件来实现。
确认插件状态:已安装、已启⽤。
[gerrit@mt101 git]$ ssh -p 29418 admin@192.168.16.101 gerrit plugin ls |grep replication
replication                    v3.1.0    ENABLED  replication.jar
[gerrit@mt101 git]$
5.2 配置插件
在/home/gerrit/gerrit_testsite/etc⽬录下创建fig⽂件⽤于代码同步。
特别注意:以后每创建⼀个新的项⽬,都要在该配置⽂件中添加对应的配置。
[gerrit@mt101 etc]$ pwd
/home/gerrit/gerrit_testsite/etc
[gerrit@mt101 etc]$
[gerrit@mt101 etc]$ fig
[gerrit@mt101 etc]$
[gerrit@mt101 etc]$ fig
[remote "testrepo"]
projects = testrepo
url = git@192.168.16.102:root/testrepo.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/changes/*:refs/changes/*
threads = 3
[gerrit@mt101 etc]$
[gerrit@mt101 etc]$ ssh -p 29418 admin@192.168.16.101 gerrit plugin reload replication
[gerrit@mt101 etc]$
6 - 本地代码提交测试
6.1 本地设置
本地Git⽤户配置要和Gerrit⽤户信息⼀致
本地公钥已添加到Gerrit⽤户配置中
本地Git版本不能太低,否则会出现未知的错误
Anliven@Anliven-PC /d/Project/testrepo (master)
λ git config --global user.name "admin"
Anliven@Anliven-PC /d/Project/testrepo (master)
λ git config --ail "anliven@126"
Anliven@Anliven-PC /d/Project
λ git config --list |grep user
user.name=admin
Anliven@Anliven-PC /d/Project
λ
Anliven@Anliven-PC /d/Project
λ git --version
git version 2.19.0.windows.1
Anliven@Anliven-PC /d/Project
λ
Anliven@Anliven-PC /d/Project
λ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDQSFpwR9eBCTKfTbPEE8TWIo75KfX3AczpXK6nTKGH248pxjfq7cDe2cGj1VOSqknMqvg0g1LLiXrgbIGbtclt49UKSFXxWnVm04rZHVsz9rtfzxuF/NmSqSv7isYLZvwaI4aGXkLwILOemqwCbPR Anliven@Anliven-PC /d/Project
λ
6.2 下拉代码
这⾥使⽤了SSH⽅式下的Clone with commit-msg hook模式
Anliven@Anliven-PC /d/Project
λ pwd
/d/Project
Anliven@Anliven-PC /d/Project
λ ll
total 0
drwxr-xr-x 1 Anliven 197121 0 ⼗⼀ 28 00:05 testproject/
Anliven@Anliven-PC /d/Project
λ
Anliven@Anliven-PC /d/Project
λ ll
total 0
drwxr-xr-x 1 Anliven 197121 0 ⼗⼀ 28 00:05 testproject/
Anliven@Anliven-PC /d/Project
λ git clone "ssh://admin@192.168.16.101:29418/testrepo" && scp -p -P 29418 admin@192.168.16.101:hooks/commit-msg "testrepo/.git/hooks/" Cloning into 'testrepo'...
remote: Counting objects: 12, done
remote: Finding sources: 100% (12/12)
remote: Total 12 (delta 0), reused 12 (delta 0)
Receiving objects: 100% (12/12), done.
commit-msg                                                            100% 1790  297.0KB/s  00:00
Anliven@Anliven-PC /d/Project
λ
Anliven@Anliven-PC /d/Project
λ ll
total 0
drwxr-xr-x 1 Anliven 197121 0 ⼗⼀ 28 00:05 testproject/
drwxr-xr-x 1 Anliven 197121 0 ⼗⼆ 13 23:49 testrepo/
Anliven@Anliven-PC /d/Project
λ ll testrepo/
total 3
-rw-r--r-- 1 Anliven 197121 31 ⼗⼆ 13 23:49 README.md
-rw-r--r-- 1 Anliven 197121 41 ⼗⼆ 13 23:
-rw-r--r-- 1 Anliven 197121  9 ⼗⼆ 13 23:
Anliven@Anliven-PC /d/Project
λ
6.3 改动
Anliven@Anliven-PC /d/Project
λ cd testrepo/
Anliven@Anliven-PC /d/Project/testrepo (master)
λ echo "1234567890" >>
Anliven@Anliven-PC /d/Project/testrepo (master)
λ git add *
warning: LF will be replaced by CRLF
The file will have its original line endings in your working directory
Anliven@Anliven-PC /d/Project/testrepo (master)
λ git commit -m "update testlog"
[master 6c8f1d2] update testlog
1 file changed, 1 insertion(+)
Anliven@Anliven-PC /d/Project/testrepo (master)
λ
Anliven@Anliven-PC /d/Project/testrepo (master)
λ cat 
This is the first change from local PC.
1234567890
Anliven@Anliven-PC /d/Project/testrepo (master)
λ
6.4 提交改动
特别注意:
提交的命令变为“git push -u origin HEAD:refs/for/”格式。
“refs/for/*”会将变更提交放到暂存区中,等待代码审核和集成验证
Anliven@Anliven-PC /d/Project/testrepo (master)
λ git push -u origin HEAD:refs/for/master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 387 bytes | 387.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Processing changes: refs: 1, new: 1, done
remote:
remote: SUCCESS
remote:
remote:  192.168.16.101:8083/c/testrepo/+/61 update testlog [NEW]
remote:
To ssh://192.168.16.101:29418/testrepo
* [new branch]      HEAD -> refs/for/master
Anliven@Anliven-PC /d/Project/testrepo (master)
λ
Anliven@Anliven-PC /d/Project/testrepo (master)
λ git log -1
commit 6c8f1d20f23697d1d677ac86c30120fdd7d20c43 (HEAD -> master)
Author: admin <anliven@126>
Date:  Fri Dec 13 23:53:08 2019 +0800
update testlog
Change-Id: I3513942d2b6d2b951b3470946170eb706c4ab8d6
Anliven@Anliven-PC /d/Project/testrepo (master)
λ
6.5 在Gerrit查看提交的改动
在登录界⾯的CHANGES栏⽬下可以看到提交的状态(Open、Merged和Abandoned)
这⾥可以看到改动正处于Open状态下。
点击“first change”这个Subject,可以看到具体信息
6.6 在Gerrit进⾏⼈⼯审核
默认只有Project Owners和Administrator组⽤户拥有“Code-Review”选项+2的权限(提交通过)
普通⽤户的“Code-Review”选项只能选择+1(审核建议)
代码审核⽆误,点击“Code-Review+2”按钮
点击“Summit”按钮才能进⼊代码库
查看提交的最终状态
如果提交成功,页⾯History部分会出现“Change has been successfully merged”信息
点击页⾯中gitweb链接,可以直观的看到相关具体信息
CHANGES下的Merged信息
6.7 在GitLab确认同步信息
在GitLab的Master分⽀确认代码是否同步
6.8 Replication⽇志
可以从Replication⽇志获取同步状态信息。
[gerrit@mt101 ~]$ pwd
/home/gerrit
[gerrit@mt101 ~]$ ll gerrit_testsite/logs/replication_log
-rw-r--r-- 1 root root 1982 Dec 14 00:02 gerrit_testsite/logs/replication_log
[gerrit@mt101 ~]$
成功同步的⽇志
[2019-12-14 00:02:01,017] [c17c270d] Replication to git@192.168.16.102:root/testrepo.
[2019-12-14 00:02:01,020] [c17c270d] Push to git@192.168.16.102:root/testrepo.git references: [RemoteRefUpdate[remoteName=refs/changes/61/61/meta, NOT_ATTEMPTED, (null)...6f1717ea24e438692c05ce9cb20255506e8167e6, srcRef=refs [2019-12-14 00:02:22,332] [c17c270d] Replication to git@192.168.16.102:root/testrepo.git completed in 21314ms, 15003ms delay, 0 retries
7 - 问题处理
7.1 问题1 - 执⾏git commit命令报错
问题现象:执⾏git commit命令时报错“git: 'interpret-trailers' is not a git command. See 'git --help'.”
[gerrit@mt101 testrepo]$ git commit -m "a new file"
git: 'interpret-trailers' is not a git command. See 'git --help'.
cannot insert change-id line in .git/COMMIT_EDITMSG
[gerrit@mt101 testrepo]$
[gerrit@mt101 testrepo]$ git --version
git version 1.8.3.1
[gerrit@mt101 testrepo]$
7.2 问题2:在本地执⾏“git clone”命令拉取代码时报错
问题现象:提⽰“Could not read from remote repository.  ”
Anliven@Anliven-PC /d/Project
λ git clone "ssh://admin@192.168.16.101:29418/testrepo"
Cloning into 'testrepo'...
ssh: connect to host 192.168.16.101 port 29418: Connection timed out
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
问题分析:经排查,确认防⽕墙未开放端⼝,⽹络不通导致。
处理⽅法:防⽕墙开放端⼝,重新拉取代码。
[gerrit@mt101 ~]$ sudo firewall-cmd --zone=public --permanent --add-port=29418/tcp
success
[gerrit@mt101 ~]$ sudo firewall-cmd --reload
success
[gerrit@mt101 ~]$
8 - 参考信息
部署gerrit环境完整记录:
部署Gitlab环境完整记录:
部署Jenkins完整记录:

本文发布于:2024-09-23 08:19:26,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/549785.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:代码   添加   提交
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议