对于我正在思考的更好方法的可能性,我想首先解释我的要求(问题从分隔线开始)。
鉴于我有以下GitLab组结构:
- main-group
- sub-group-project-templates
- project-template-1
- sub-group-projects
在main-group/sub-group-project-templates
中,有多个项目可用作任务的初始项目。
如果有人想要执行这样的任务,我想在组project-template-1
中拥有相应项目模板(例如sub-group-projects
)的分支,并将该人员的名称作为项目名称。
鉴于此人的姓名是John Doe想要开始project-template-1
的任务,应该有一个新项目main-group/sub-group-projects/john_doe_project-template-1
。
John Doe应该只能看到(读/写)存储库john_doe_project-template-1
而不能看到项目的其余部分(其他分支......)。
我的解决方案是将模板项目分叉到子组,然后添加新的贡献者。
但是我已经在第一步失败了(用一个新名称将项目分配到子组中)。
我的第一眼就是看着:
POST http://gitlab.com/api/v4/projects/project_id/fork
但我不知道如何定义目标目录并设置新fork的名称。 以下是行不通的:
POST http://gitlab.com/api/v4/projects/project_id/fork?namespace=main-group%2Fsub-group-projects%2Fjohn_doe_project-template-1
“message”:“找不到404目标命名空间”
这样的事情是可能的,还是我能做到这一点?
答案 0 :(得分:0)
假设您在子组project-template-1
中对项目sub-group-project-templates
进行了以下配置:
可以在多个API请求中完成,但有以下功能正在进行中:
但是这两个问题有解决方法,例如只需执行一个额外的请求来获取命名空间id(1)并在分叉后执行编辑项目请求(2)
步骤如下:
sub-group-projects
的main-group/sub-group-project-templates/project-template-1
到ID为$namespace_id
&的名称空间获取已创建项目的项目ID $project_id
的{li> rename project从project-template-1
到:johndoe_project-template-1
johndoe_project-template-1
的$user_id
请注意,要添加成员,您需要我认为您要在第4步中搜索的用户ID,但如果您已经拥有该步骤,则可能不需要此步骤
以下是执行所有这些步骤的bash脚本,它使用curl& jq:
#!/bin/bash
set -e
gitlab_host=gitlab.your.host
access_token=YOUR_ACCESS_TOKEN
username=johndoe
project=project-template-1
user_access=30
group=main-group
namespace_src=sub-group-project-templates
namespace_dest=sub-group-projects
new_project_name=${username}_${project}
project_src=$group/$namespace_src/$project
encoded_project=$(echo $project_src | sed 's/\//%2F/g')
echo "1 - get namespace id for $namespace_dest"
#https://docs.gitlab.com/ce/api/namespaces.html
namespace_id=$(curl -s "https://$gitlab_host/api/v4/namespaces?search=$namespace_dest" \
-H "Private-Token: $access_token" | jq -r '.[0].id')
echo "2 - fork project $project_src to namespace with id $namespace_id"
#https://docs.gitlab.com/ce/api/projects.html#fork-project
project_id=$(curl -s -X POST "https://$gitlab_host/api/v4/projects/$encoded_project/fork?namespace=$namespace_id" \
-H "Private-Token: $access_token" | jq '.id')
if [ -z $project_id ]; then
echo "fork failed"
exit 1
fi
echo "3 - rename project with id $project_id from $project to : $new_project_name"
#https://docs.gitlab.com/ce/api/projects.html#edit-project
curl -s -X PUT "https://$gitlab_host/api/v4/projects/$project_id" \
-H "Content-Type: application/json" \
-d "{\"path\": \"$new_project_name\",\"name\": \"$new_project_name\" }" \
-H "Private-Token: $access_token" > /dev/null
echo "4 - get user id for : $username"
#https://docs.gitlab.com/ce/api/users.html
user_id=$(curl -s "https://$gitlab_host/api/v4/users?username=johndoe" \
-H "Private-Token: $access_token" | \
jq -r '.[] | select(.name == "johndoe") | .id')
echo "5 - edit project member : add user with id $user_id"
#https://docs.gitlab.com/ce/api/members.html#add-a-member-to-a-group-or-project
curl -s "https://$gitlab_host/api/v4/projects/$project_id/members" \
-H "Private-Token: $access_token" \
-d "user_id=$user_id&access_level=$user_access" > /dev/null
在第二步(fork项目)中,项目源命名空间是URL编码的,因此您可能希望使用正确的方式对其进行编码(在这种情况下,我们只需要用/
替换%2F
)