对接gerrit的编码实现

2022-11-21  本文已影响0人  天草二十六_简村人

一、引入gerrit api的jar包

        <dependency>
            <groupId>com.urswolfer.gerrit.client.rest</groupId>
            <artifactId>gerrit-rest-java-client</artifactId>
            <version>0.9.3</version>
        </dependency>

二、整体流程

1、创建负责人组

如果组已存在,则直接返回;如果不存在,则新增。

这里传入的所属组ID,最好是管理员所在的组,管理员方便验证。

2、创建开发者组

如果组已存在,则直接返回;如果不存在,则新增。和上一步的区别是所属组的ID不同。

开发者组所属的组ID,即上一步创建的组ID。

image.png

3、创建项目

如果项目已存在,则直接返回;如果不存在,则新增。

这里的owners即负责人组的组名称,注意不是组ID。

4、给项目赋权限

围绕着入参对象ProjectAccessInput拼接,具体权限项,根据你的需要而定。

image.png

开发者权限一般比负责人权限要小:

image.png

三、源码示例

1、创建组

private GroupBaseInfo createGroup(String groupName, String ownerId) throws Exception {
        GroupBaseInfo groupBaseInfo = new GroupBaseInfo();

        GroupInfo groupInfo;
        try {
            groupInfo = gerritApi.groups().id(groupName).get();
            log.warn("组{}已存在,请勿重复创建", groupName);
        } catch (HttpStatusException e) {
            // 不存在,则重新创建

            GroupInput groupInput = new GroupInput();
            groupInput.name = groupName;
            groupInput.description = groupName;
            groupInput.ownerId = ownerId;
            groupInput.visibleToAll = false;

            groupInfo = gerritApi.groups().create(groupInput).get();
            if (null == groupInfo) {
                throw new IllegalArgumentException("创建组出现异常");
            }

            log.info("组创建成功, groupInput={}", JsonUtils.toJsonString(groupInput));

            groupBaseInfo.id = groupInfo.id;
            groupBaseInfo.name = groupInfo.name;
            return groupBaseInfo;
        }

        groupBaseInfo.id = groupInfo.id;
        groupBaseInfo.name = groupInfo.name;
        return groupBaseInfo;
    }

2、创建项目

private ProjectInfo createProject(String projectName, String ownerGroupName) throws Exception {
        try {
            ProjectApi projectApi = gerritApi.projects().name(projectName);

            ProjectInfo projectInfo = projectApi.get();
            if (null != projectInfo) {
                log.warn("工程{}已存在,请勿重复创建", projectName);
                return projectInfo;
            }
        } catch (Exception e) {
            ProjectInput request = new ProjectInput();
            request.name = projectName;
            request.description = projectName;
            request.submitType = SubmitType.INHERIT;
            request.owners = Lists.newArrayList(ownerGroupName);

            log.info("新建gerrit工程成功, request={}", JsonUtils.toJsonString(request));

            return gerritApi.projects().create(request).get();
        }

        return null;
    }

3、赋权限

private void setAccess(String projectName, String ownerGroupId, String devGroupId) throws Exception {
        try {
            ProjectApi projectApi = gerritApi.projects().name(projectName);

            ProjectAccessInput projectAccessInput = new ProjectAccessInput();
            Map<String, AccessSectionInfo> addMap = Maps.newHashMap();
            addMap.put("refs/*", buildAccessSectionInfo(ownerGroupId, devGroupId));
            addMap.put("refs/tags/*", buildTagsAccessSectionInfo(devGroupId));
            addMap.put("refs/heads/*", buildHeadsAccessSectionInfo(ownerGroupId, devGroupId));

            log.info("权限列表是:{}", JsonUtils.toJsonString(addMap));

            projectAccessInput.add = addMap;

            projectApi.access(projectAccessInput);
        } catch (HttpStatusException e) {
            log.error("赋权限出现异常, projectName={}, ownerGroupId={}, devGroupId={}", projectName, ownerGroupId, devGroupId, e);
        }
    }


    private AccessSectionInfo buildAccessSectionInfo(String ownerGroupId, String devGroupId) {
        AccessSectionInfo accessSectionInfo = new AccessSectionInfo();

        Map<String, PermissionInfo> permissions = Maps.newHashMap();

        permissions.put("read", buildPermissionInfo("", devGroupId));
        permissions.put("label-Code-Review", buildReviewPermissionInfo("Code-Review", ownerGroupId, devGroupId));
        permissions.put("label-Verified", buildReviewPermissionInfo("Verified", ownerGroupId, devGroupId));
        permissions.put("labelAs-Verified", buildReviewPermissionInfo("Verified", ownerGroupId, devGroupId));
        permissions.put("forgeServerAsCommitter", buildPermissionInfo("", ownerGroupId, devGroupId));
        permissions.put("forgeAuthor", buildPermissionInfo("", ownerGroupId, devGroupId));
        permissions.put("removeReviewer", buildPermissionInfo("", ownerGroupId, devGroupId));
        permissions.put("delete", buildPermissionInfo("", ownerGroupId));
        permissions.put("viewPrivateChanges", buildPermissionInfo("", ownerGroupId));
        permissions.put("createTag", buildPermissionInfo("", ownerGroupId));
        permissions.put("createSignedTag", buildPermissionInfo("", ownerGroupId));
        permissions.put("editHashtags", buildPermissionInfo("", ownerGroupId));
        permissions.put("deleteOwnChanges", buildPermissionInfo("", devGroupId));
        permissions.put("editTopicName", buildPermissionInfo("", devGroupId));
        permissions.put("abandon", buildPermissionInfo("", devGroupId));
        permissions.put("push", buildPermissionInfo("", devGroupId));
        permissions.put("addPatchSet", buildPermissionInfo("", devGroupId));
        permissions.put("forgeCommitter", buildPermissionInfo("", devGroupId));
        permissions.put("pushMerge", buildPermissionInfo("", devGroupId));
        permissions.put("rebase", buildPermissionInfo("", devGroupId));
        permissions.put("submit", buildPermissionInfo("", ownerGroupId));
        permissions.put("submitAs", buildPermissionInfo("", ownerGroupId));

        accessSectionInfo.permissions = permissions;

        return accessSectionInfo;
    }

    private AccessSectionInfo buildTagsAccessSectionInfo(String devGroupId) {
        AccessSectionInfo accessSectionInfo = new AccessSectionInfo();

        Map<String, PermissionInfo> permissions = Maps.newHashMap();

        permissions.put("createSignedTag", buildPermissionInfo("", devGroupId));
        permissions.put("createTag", buildPermissionInfo("", devGroupId));

        accessSectionInfo.permissions = permissions;

        return accessSectionInfo;
    }

    private AccessSectionInfo buildHeadsAccessSectionInfo(String ownerGroupId, String devGroupId) {
        AccessSectionInfo accessSectionInfo = new AccessSectionInfo();

        Map<String, PermissionInfo> permissions = Maps.newHashMap();

        permissions.put("forgeCommitter", buildPermissionInfo("", devGroupId));
        permissions.put("label-Code-Review", buildReviewPermissionInfo("Code-Review", ownerGroupId, devGroupId));
        permissions.put("forgeAuthor", buildPermissionInfo("", devGroupId));
        permissions.put("editTopicName", buildPermissionInfo("", devGroupId));
        permissions.put("create", buildPermissionInfo("", devGroupId));
        permissions.put("push", buildPermissionInfo("", devGroupId));
        permissions.put("submit", buildPermissionInfo("", ownerGroupId));

        accessSectionInfo.permissions = permissions;

        return accessSectionInfo;
    }

    private PermissionInfo buildPermissionInfo(String label, String groupId) {
        PermissionInfo permissionInfo = new PermissionInfo(label, false);

        Map<String, PermissionRuleInfo> rules = buildRules(groupId);
        permissionInfo.rules = rules;

        return permissionInfo;
    }

    private PermissionInfo buildPermissionInfo(String label, String ownerGroupId, String devGroupId) {
        PermissionInfo permissionInfo = new PermissionInfo(label, false);

        Map<String, PermissionRuleInfo> rules = buildRules(ownerGroupId, devGroupId);
        permissionInfo.rules = rules;

        return permissionInfo;
    }

    private PermissionInfo buildReviewPermissionInfo(String label, String ownerGroupId, String devGroupId) {
        PermissionInfo permissionInfo = new PermissionInfo(label, false);

        Map<String, PermissionRuleInfo> rules = buildReviewRules(ownerGroupId, devGroupId);
        permissionInfo.rules = rules;

        return permissionInfo;
    }

    private Map<String, PermissionRuleInfo> buildRules(String groupId) {
        Map<String, PermissionRuleInfo> rules = Maps.newHashMap();

        PermissionRuleInfo permissionRuleInfo = buildPermissionRuleInfo();
        rules.put(groupId, permissionRuleInfo);

        return rules;
    }

    private Map<String, PermissionRuleInfo> buildRules(String ownerGroupId, String devGroupId) {
        Map<String, PermissionRuleInfo> rules = Maps.newHashMap();

        PermissionRuleInfo permissionRuleInfo = buildPermissionRuleInfo();
        rules.put(ownerGroupId, permissionRuleInfo);
        rules.put(devGroupId, permissionRuleInfo);

        return rules;
    }

    private Map<String, PermissionRuleInfo> buildReviewRules(String ownerGroupId, String devGroupId) {
        Map<String, PermissionRuleInfo> rules = Maps.newHashMap();

        PermissionRuleInfo permissionRuleInfo = buildPermissionRuleInfo();
        permissionRuleInfo.max = 2;
        permissionRuleInfo.min = -2;
        rules.put(ownerGroupId, permissionRuleInfo);

        permissionRuleInfo = buildPermissionRuleInfo();
        permissionRuleInfo.max = 1;
        permissionRuleInfo.min = -1;
        rules.put(devGroupId, permissionRuleInfo);

        return rules;
    }

    private PermissionRuleInfo buildPermissionRuleInfo() {
        PermissionRuleInfo permissionRuleInfo = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);

        return permissionRuleInfo;
    }

4、定义变量

    private GerritRestApiFactory gerritRestApiFactory;
    private GerritAuthData.Basic authData;
    private GerritApi gerritApi;

    @Autowired
    private GerritProperties gerritProperties;

    @PostConstruct
    public void init() {
        gerritRestApiFactory = new GerritRestApiFactory();
        authData = new GerritAuthData.Basic(gerritProperties.getHost(), gerritProperties.getLogin(), gerritProperties.getPassword());
        gerritApi = gerritRestApiFactory.create(authData);
    }

四、权限项的json示例

负责人分组ID: cebc8f9fb64f0841632a9117c7885452b109ae26
开发者分组ID: 7e66fcf4460228cb2a8d299947889b3bc375524c

rsp=$(curl -u $GERRIT_USER_PWD -s -X POST "${GERRIT_ADDR}/projects/${project_name}/access" \
    -H "content-type: application/json" \
    -d "... ..."

echo $rsp
{
    "refs/tags/*":{
        "permissions":{
            "createTag":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "createSignedTag":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            }
        }
    },
    "refs/heads/*":{
        "permissions":{
            "label-Code-Review":{
                "label":"Code-Review",
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false,
                        "min":-1,
                        "max":1
                    },
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false,
                        "min":-2,
                        "max":2
                    }
                }
            },
            "editTopicName":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "forgeAuthor":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "submit":{
                "exclusive":false,
                "rules":{
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "create":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "forgeCommitter":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "push":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            }
        }
    },
    "refs/*":{
        "permissions":{
            "label-Code-Review":{
                "label":"Code-Review",
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false,
                        "min":-1,
                        "max":1
                    },
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false,
                        "min":-2,
                        "max":2
                    }
                }
            },
            "rebase":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "read":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "forgeAuthor":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    },
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "submit":{
                "exclusive":false,
                "rules":{
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "submitAs":{
                "exclusive":false,
                "rules":{
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "labelAs-Verified":{
                "label":"Verified",
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false,
                        "min":-1,
                        "max":1
                    },
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false,
                        "min":-2,
                        "max":2
                    }
                }
            },
            "forgeServerAsCommitter":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    },
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "removeReviewer":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    },
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "delete":{
                "exclusive":false,
                "rules":{
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "deleteOwnChanges":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "push":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "viewPrivateChanges":{
                "exclusive":false,
                "rules":{
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "editTopicName":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "label-Verified":{
                "label":"Verified",
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false,
                        "min":-1,
                        "max":1
                    },
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false,
                        "min":-2,
                        "max":2
                    }
                }
            },
            "createTag":{
                "exclusive":false,
                "rules":{
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "abandon":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "pushMerge":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "createSignedTag":{
                "exclusive":false,
                "rules":{
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "addPatchSet":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "editHashtags":{
                "exclusive":false,
                "rules":{
                    "cebc8f9fb64f0841632a9117c7885452b109ae26":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            },
            "forgeCommitter":{
                "exclusive":false,
                "rules":{
                    "7e66fcf4460228cb2a8d299947889b3bc375524c":{
                        "action":"ALLOW",
                        "force":false
                    }
                }
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读