Devops系列之对接Gerrit的计划与实现(三)-- Java编程实现 ...

农民  论坛元老 | 2025-4-12 02:35:20 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1580|帖子 1580|积分 4740

一、配景

上文讲述了怎样使用shell下令实现创建gerrit项目,本文介绍怎样使用java语言编程实现。
二、java语言实现

1、引入jar包

  1.         <dependency>
  2.             <groupId>com.urswolfer.gerrit.client.rest</groupId>
  3.             <artifactId>gerrit-rest-java-client</artifactId>
  4.             <version>0.9.3</version>
  5.         </dependency>
复制代码
核心类GroupApiRestClient.java

2、配置

  1. project:
  2.   gerrit:
  3.     host: http://192.168.5.60:8080
  4.     login: admin
  5.     password: 123456
  6.     # 负责人
  7.     groupOwnerId: 34dd8f718972d73c9a3474b2sfad2d52x2cf596f
复制代码
3、实现类



  • 配置类GerritProperties.java
  1. import lombok.Data;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.cloud.context.config.annotation.RefreshScope;
  4. import org.springframework.context.annotation.Configuration;
  5. /**
  6. * gerrit配置
  7. *
  8. * @author xxx
  9. */
  10. @RefreshScope
  11. @Data
  12. @Configuration
  13. @ConfigurationProperties(prefix = "project.gerrit")
  14. public class GerritProperties {
  15.     /**
  16.      * 地址
  17.      */
  18.     private String host;
  19.     /**
  20.      * 用户名
  21.      */
  22.     private String login;
  23.     /**
  24.      * 密码
  25.      */
  26.     private String password;
  27.     /**
  28.      * 所属的组ID
  29.      */
  30.     private String groupOwnerId;
  31. }
复制代码


  • 总体实现
  1. import com.google.common.collect.Lists;
  2. import com.google.common.collect.Maps;
  3. import com.google.gerrit.extensions.api.GerritApi;
  4. import com.google.gerrit.extensions.api.access.AccessSectionInfo;
  5. import com.google.gerrit.extensions.api.access.PermissionInfo;
  6. import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
  7. import com.google.gerrit.extensions.api.access.ProjectAccessInput;
  8. import com.google.gerrit.extensions.api.groups.GroupInput;
  9. import com.google.gerrit.extensions.api.projects.ProjectApi;
  10. import com.google.gerrit.extensions.api.projects.ProjectInput;
  11. import com.google.gerrit.extensions.client.SubmitType;
  12. import com.google.gerrit.extensions.common.GroupBaseInfo;
  13. import com.google.gerrit.extensions.common.GroupInfo;
  14. import com.google.gerrit.extensions.common.ProjectInfo;
  15. import com.urswolfer.gerrit.client.rest.GerritAuthData;
  16. import com.urswolfer.gerrit.client.rest.GerritRestApiFactory;
  17. import com.urswolfer.gerrit.client.rest.http.HttpStatusException;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Service;
  21. import javax.annotation.PostConstruct;
  22. import java.util.Map;
  23. /**
  24. * gerrit api
  25. * <p>
  26. * 1.创建负责人组
  27. * 2.创建开发人组
  28. * 3.创建工程
  29. * 4.设置权限
  30. * </p>
  31. *
  32. * @author xxx
  33. */
  34. @Slf4j
  35. @Service
  36. public class GerritService {
  37.     private GerritRestApiFactory gerritRestApiFactory;
  38.     private GerritAuthData.Basic authData;
  39.     private GerritApi gerritApi;
  40.     @Autowired
  41.     private GerritProperties gerritProperties;
  42.     @PostConstruct
  43.     public void init() {
  44.         gerritRestApiFactory = new GerritRestApiFactory();
  45.         authData = new GerritAuthData.Basic(gerritProperties.getHost(), gerritProperties.getLogin(), gerritProperties.getPassword());
  46.         gerritApi = gerritRestApiFactory.create(authData);
  47.     }
  48.     /**
  49.      * 新建gerrit项目及组、权限
  50.      *
  51.      * @param group       项目组
  52.      * @param projectName 项目名称,比如:root/watch-answering-server
  53.      */
  54.     public void create(String group, String projectName) {
  55.         String ownerGroupName = projectName + "-owner";
  56.         String devGroupName = projectName + "-dev";
  57.         try {
  58.             // 创建负责人分组
  59.             GroupBaseInfo ownerGroupBaseInfo = this.createGroup(ownerGroupName, gerritProperties.getGroupOwnerId());
  60.             String ownerGroupId = ownerGroupBaseInfo.id;
  61.             log.info("负责人分组ID:{}", ownerGroupId);
  62.             // 创建开发者分组
  63.             GroupBaseInfo devGroupBaseInfo = this.createGroup(devGroupName, ownerGroupId);
  64.             String devGroupId = devGroupBaseInfo.id;
  65.             log.info("开发者分组ID:{}", devGroupId);
  66.             // 创建工程
  67.             ProjectInfo projectInfo = this.createProject(projectName, ownerGroupName);
  68.             log.info("项目的详情是:{}", JsonUtils.toJsonString(projectInfo));
  69.             // 赋权限项
  70.             if (null != projectInfo) {
  71.                 this.setAccess(projectName, ownerGroupId, devGroupId);
  72.             }
  73.         } catch (Exception e) {
  74.             log.error("创建组、工程、赋权出现了异常, projectName={}", projectName, e);
  75.         }
  76.     }
  77. }
复制代码


  • 创建组的实当代码
  1.     /**
  2.      * 创建组.
  3.      *
  4.      * @param groupName 组名
  5.      * @param ownerId   所属组
  6.      * @return
  7.      * @throws Exception
  8.      */
  9.     private GroupBaseInfo createGroup(String groupName, String ownerId) throws Exception {
  10.         GroupBaseInfo groupBaseInfo = new GroupBaseInfo();
  11.         GroupInfo groupInfo;
  12.         try {
  13.             groupInfo = gerritApi.groups().id(groupName).get();
  14.             log.warn("组{}已存在,请勿重复创建", groupName);
  15.         } catch (HttpStatusException e) {
  16.             // 不存在,则重新创建
  17.             GroupInput groupInput = new GroupInput();
  18.             groupInput.name = groupName;
  19.             groupInput.description = groupName;
  20.             groupInput.ownerId = ownerId;
  21.             groupInput.visibleToAll = false;
  22.             groupInfo = gerritApi.groups().create(groupInput).get();
  23.             if (null == groupInfo) {
  24.                 throw new IllegalArgumentException("创建组出现异常");
  25.             }
  26.             log.info("组创建成功, groupInput={}", JsonUtils.toJsonString(groupInput));
  27.             groupBaseInfo.id = groupInfo.id;
  28.             groupBaseInfo.name = groupInfo.name;
  29.             return groupBaseInfo;
  30.         }
  31.         groupBaseInfo.id = groupInfo.id;
  32.         groupBaseInfo.name = groupInfo.name;
  33.         return groupBaseInfo;
  34.     }
复制代码


  • 创建工程的实当代码
  1. /**
  2.      * 新建工程.
  3.      *
  4.      * @param projectName    工程名
  5.      * @param ownerGroupName 所属组
  6.      * @return
  7.      * @throws Exception
  8.      */
  9.     private ProjectInfo createProject(String projectName, String ownerGroupName) throws Exception {
  10.         try {
  11.             ProjectApi projectApi = gerritApi.projects().name(projectName);
  12.             ProjectInfo projectInfo = projectApi.get();
  13.             if (null != projectInfo) {
  14.                 log.warn("工程{}已存在,请勿重复创建", projectName);
  15.                 return projectInfo;
  16.             }
  17.         } catch (Exception e) {
  18.             ProjectInput request = new ProjectInput();
  19.             request.name = projectName;
  20.             request.description = projectName;
  21.             request.submitType = SubmitType.INHERIT;
  22.             request.owners = Lists.newArrayList(ownerGroupName);
  23.             log.info("新建gerrit工程成功, request={}", JsonUtils.toJsonString(request));
  24.             return gerritApi.projects().create(request).get();
  25.         }
  26.         return null;
  27.     }
复制代码


  • 赋权限的实当代码
  1.    
  2.     /**
  3.      * 赋权限.
  4.      *
  5.      * @param projectName  项目名称
  6.      * @param ownerGroupId 负责人组ID
  7.      * @param devGroupId   开发组ID
  8.      * @throws Exception
  9.      */
  10.     private void setAccess(String projectName, String ownerGroupId, String devGroupId) throws Exception {
  11.         try {
  12.             ProjectApi projectApi = gerritApi.projects().name(projectName);
  13.             ProjectAccessInput projectAccessInput = new ProjectAccessInput();
  14.             Map<String, AccessSectionInfo> addMap = Maps.newHashMap();
  15.             addMap.put("refs/*", buildAccessSectionInfo(ownerGroupId, devGroupId));
  16.             addMap.put("refs/tags/*", buildTagsAccessSectionInfo(devGroupId));
  17.             addMap.put("refs/heads/*", buildHeadsAccessSectionInfo(ownerGroupId, devGroupId));
  18.             log.info("权限列表是:{}", JsonUtils.toJsonString(addMap));
  19.             projectAccessInput.add = addMap;
  20.             projectApi.access(projectAccessInput);
  21.         } catch (HttpStatusException e) {
  22.             log.error("赋权限出现异常, projectName={}, ownerGroupId={}, devGroupId={}", projectName, ownerGroupId, devGroupId, e);
  23.         }
  24.     }
  25.     private AccessSectionInfo buildAccessSectionInfo(String ownerGroupId, String devGroupId) {
  26.         AccessSectionInfo accessSectionInfo = new AccessSectionInfo();
  27.         Map<String, PermissionInfo> permissions = Maps.newHashMap();
  28.         permissions.put("read", buildPermissionInfo("", devGroupId));
  29.         permissions.put("label-Code-Review", buildReviewPermissionInfo("Code-Review", ownerGroupId, devGroupId));
  30.         permissions.put("label-Verified", buildReviewPermissionInfo("Verified", ownerGroupId, devGroupId));
  31.         permissions.put("labelAs-Verified", buildReviewPermissionInfo("Verified", ownerGroupId, devGroupId));
  32.         permissions.put("forgeServerAsCommitter", buildPermissionInfo("", ownerGroupId, devGroupId));
  33.         permissions.put("forgeAuthor", buildPermissionInfo("", ownerGroupId, devGroupId));
  34.         permissions.put("removeReviewer", buildPermissionInfo("", ownerGroupId, devGroupId));
  35.         permissions.put("delete", buildPermissionInfo("", ownerGroupId));
  36.         permissions.put("viewPrivateChanges", buildPermissionInfo("", ownerGroupId));
  37.         permissions.put("createTag", buildPermissionInfo("", ownerGroupId));
  38.         permissions.put("createSignedTag", buildPermissionInfo("", ownerGroupId));
  39.         permissions.put("editHashtags", buildPermissionInfo("", ownerGroupId));
  40.         permissions.put("deleteOwnChanges", buildPermissionInfo("", devGroupId));
  41.         permissions.put("editTopicName", buildPermissionInfo("", devGroupId));
  42.         permissions.put("abandon", buildPermissionInfo("", devGroupId));
  43.         permissions.put("push", buildPermissionInfo("", devGroupId));
  44.         permissions.put("addPatchSet", buildPermissionInfo("", devGroupId));
  45.         permissions.put("forgeCommitter", buildPermissionInfo("", devGroupId));
  46.         permissions.put("pushMerge", buildPermissionInfo("", devGroupId));
  47.         permissions.put("rebase", buildPermissionInfo("", devGroupId));
  48.         permissions.put("submit", buildPermissionInfo("", ownerGroupId));
  49.         permissions.put("submitAs", buildPermissionInfo("", ownerGroupId));
  50.         accessSectionInfo.permissions = permissions;
  51.         return accessSectionInfo;
  52.     }
  53.     private AccessSectionInfo buildTagsAccessSectionInfo(String devGroupId) {
  54.         AccessSectionInfo accessSectionInfo = new AccessSectionInfo();
  55.         Map<String, PermissionInfo> permissions = Maps.newHashMap();
  56.         permissions.put("createSignedTag", buildPermissionInfo("", devGroupId));
  57.         permissions.put("createTag", buildPermissionInfo("", devGroupId));
  58.         accessSectionInfo.permissions = permissions;
  59.         return accessSectionInfo;
  60.     }
  61.     private AccessSectionInfo buildHeadsAccessSectionInfo(String ownerGroupId, String devGroupId) {
  62.         AccessSectionInfo accessSectionInfo = new AccessSectionInfo();
  63.         Map<String, PermissionInfo> permissions = Maps.newHashMap();
  64.         permissions.put("forgeCommitter", buildPermissionInfo("", devGroupId));
  65.         permissions.put("label-Code-Review", buildReviewPermissionInfo("Code-Review", ownerGroupId, devGroupId));
  66.         permissions.put("forgeAuthor", buildPermissionInfo("", devGroupId));
  67.         permissions.put("editTopicName", buildPermissionInfo("", devGroupId));
  68.         permissions.put("create", buildPermissionInfo("", devGroupId));
  69.         permissions.put("push", buildPermissionInfo("", devGroupId));
  70.         permissions.put("submit", buildPermissionInfo("", ownerGroupId));
  71.         accessSectionInfo.permissions = permissions;
  72.         return accessSectionInfo;
  73.     }
  74.     private PermissionInfo buildPermissionInfo(String label, String groupId) {
  75.         PermissionInfo permissionInfo = new PermissionInfo(label, false);
  76.         Map<String, PermissionRuleInfo> rules = buildRules(groupId);
  77.         permissionInfo.rules = rules;
  78.         return permissionInfo;
  79.     }
  80.     private PermissionInfo buildPermissionInfo(String label, String ownerGroupId, String devGroupId) {
  81.         PermissionInfo permissionInfo = new PermissionInfo(label, false);
  82.         Map<String, PermissionRuleInfo> rules = buildRules(ownerGroupId, devGroupId);
  83.         permissionInfo.rules = rules;
  84.         return permissionInfo;
  85.     }
  86.     private PermissionInfo buildReviewPermissionInfo(String label, String ownerGroupId, String devGroupId) {
  87.         PermissionInfo permissionInfo = new PermissionInfo(label, false);
  88.         Map<String, PermissionRuleInfo> rules = buildReviewRules(ownerGroupId, devGroupId);
  89.         permissionInfo.rules = rules;
  90.         return permissionInfo;
  91.     }
  92.     private Map<String, PermissionRuleInfo> buildRules(String groupId) {
  93.         Map<String, PermissionRuleInfo> rules = Maps.newHashMap();
  94.         PermissionRuleInfo permissionRuleInfo = buildPermissionRuleInfo();
  95.         rules.put(groupId, permissionRuleInfo);
  96.         return rules;
  97.     }
  98.     private Map<String, PermissionRuleInfo> buildRules(String ownerGroupId, String devGroupId) {
  99.         Map<String, PermissionRuleInfo> rules = Maps.newHashMap();
  100.         PermissionRuleInfo permissionRuleInfo = buildPermissionRuleInfo();
  101.         rules.put(ownerGroupId, permissionRuleInfo);
  102.         rules.put(devGroupId, permissionRuleInfo);
  103.         return rules;
  104.     }
  105.     private Map<String, PermissionRuleInfo> buildReviewRules(String ownerGroupId, String devGroupId) {
  106.         Map<String, PermissionRuleInfo> rules = Maps.newHashMap();
  107.         PermissionRuleInfo permissionRuleInfo = buildPermissionRuleInfo();
  108.         permissionRuleInfo.max = 2;
  109.         permissionRuleInfo.min = -2;
  110.         rules.put(ownerGroupId, permissionRuleInfo);
  111.         permissionRuleInfo = buildPermissionRuleInfo();
  112.         permissionRuleInfo.max = 1;
  113.         permissionRuleInfo.min = -1;
  114.         rules.put(devGroupId, permissionRuleInfo);
  115.         return rules;
  116.     }
  117.     private PermissionRuleInfo buildPermissionRuleInfo() {
  118.         PermissionRuleInfo permissionRuleInfo = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
  119.         return permissionRuleInfo;
  120.     }
复制代码
三、测试

  1.     @Autowired
  2.     private GerritService gerritService;
  3.     @ApiOperation(value = "新建gerrit工程")
  4.     @PostMapping(value = "/api/gerrit/create/{projectName}")
  5.     public ResponseEntity<?> createProject(@NotNull @PathVariable String projectName) {
  6.         // 新建gerrit工程
  7.         gerritService.create("", "root/" + projectName);
  8.         return ResponseEntity.ok("SUCCESS");
  9.     }
复制代码
四、写在最后的话

   制止到现在,对接gerrit的计划与具体实现均已完整梳理,后文将解决代码提交的消息提醒。
  本文只实现了主动创建gerrit项目以及权限项,创建了owner组和dev组。由于缺少信息–每个组里应该添加哪些人。
后期将实现给组里加人的操纵。
也就是说,gerrit工程创建后,申请新项目的人,假如不在上面的owner组内,你会看不到已创建好的gerrti工程!!
不要慌,让owner组里的人员把你参加进组里。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表