将项目分成小组以获得新的贡献者(API)

时间:2017-11-27 14:07:48

标签: gitlab git-fork gitlab-api

对于我正在思考的更好方法的可能性,我想首先解释我的要求(问题从分隔线开始)。

鉴于我有以下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目标命名空间”

这样的事情是可能的,还是我能做到这一点?

1 个答案:

答案 0 :(得分:0)

假设您在子组project-template-1中对项目sub-group-project-templates进行了以下配置:

enter image description here

可以在多个API请求中完成,但有以下功能正在进行中:

但是这两个问题有解决方法,例如只需执行一个额外的请求来获取命名空间id(1)并在分叉后执行编辑项目请求(2)

步骤如下:

    子网sub-group-projects
  • get namespace id
  • fork project main-group/sub-group-project-templates/project-template-1到ID为$namespace_id&的名称空间获取已创建项目的项目ID
  • 标识$project_id的{​​li> rename projectproject-template-1到:johndoe_project-template-1
  • get user id用户johndoe
  • 项目johndoe_project-template-1
  • add project member:添加ID为$user_id
  • 的用户

请注意,要添加成员,您需要我认为您要在第4步中搜索的用户ID,但如果您已经拥有该步骤,则可能不需要此步骤

以下是执行所有这些步骤的bash脚本,它使用&

#!/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