对接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。

3、创建项目
如果项目已存在,则直接返回;如果不存在,则新增。
这里的owners即负责人组的组名称,注意不是组ID。
4、给项目赋权限
围绕着入参对象ProjectAccessInput拼接,具体权限项,根据你的需要而定。

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

三、源码示例
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
}
}
}
}
}
}