GitLab上で、誰がどのプロジェクトを参照可能かを一覧化したかったので、GitLabのAPIを利用して一覧化してみます。
GitLab Community Editionを利用して確認しました。
GItLabのAPI
APIの情報は下記ドキュメントにまとまっています。
認証方法はいくつかありますが、今回はPersonal access tokenを利用してアクセスしてみます。Personal access tokenはUser Settingsから作成可能です。
Scopeはapiにしました。
グループメンバーの取得
プロジェクトを参照できるのは、下記の2パターンとなります。
- 上位のグループのメンバー
- プロジェクトのメンバー
そのため、単にプロジェクトのメンバーの情報だけでアクセス可否が決まるのではなく、グループのメンバーの情報も考慮する必要があります。
ということで、まずはAPIでグループ一覧を取得します。
GET http://gitlab.example.com/api/v4/groups?access_token=<access token>
下記のようにグループ一覧が取得できました。
[ { "id": 5, "web_url": "http://gitlab.example.com/groups/group1", "name": "group1", "path": "group1", "description": "", "visibility": "private", "share_with_group_lock": false, "require_two_factor_authentication": false, "two_factor_grace_period": 48, "project_creation_level": "developer", "auto_devops_enabled": null, "subgroup_creation_level": "maintainer", "emails_disabled": null, "lfs_enabled": true, "avatar_url": null, "request_access_enabled": true, "full_name": "group1", "full_path": "group1", "parent_id": null }, { "id": 6, "web_url": "http://gitlab.example.com/groups/group2", "name": "group2", "path": "group2", "description": "", "visibility": "private", "share_with_group_lock": false, "require_two_factor_authentication": false, "two_factor_grace_period": 48, "project_creation_level": "developer", "auto_devops_enabled": null, "subgroup_creation_level": "maintainer", "emails_disabled": null, "lfs_enabled": true, "avatar_url": null, "request_access_enabled": true, "full_name": "group2", "full_path": "group2", "parent_id": null } ]
ここからさらにグループのメンバーを取得します。
GET http://gitlab.example.com/api/v4/groups/5/members?access_token=<access token>
[ { "id": 1, "name": "Administrator", "username": "root", "state": "active", "avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", "web_url": "http://gitlab.example.com/root", "access_level": 50, "expires_at": null }, { "id": 3, "name": "user2", "username": "user2", "state": "active", "avatar_url": "https://www.gravatar.com/avatar/ab53a2911ddf9b4817ac01ddcd3d975f?s=80&d=identicon", "web_url": "http://gitlab.example.com/user2", "access_level": 30, "expires_at": null } ]
これを繰り返し取得することによって、各グループのメンバー一覧が作成できます。
プロジェクトメンバーの取得
プロジェクト一覧を取得します。なお、グループから辿っていく方法もありますが、ユーザが持つプロジェクトも含めたかったので、プロジェクト一覧から辿るようにしました。
GET http://gitlab.example.com/api/v4/projects?simple=true&access_token=<access token>
プロジェクト一覧は下記のようになります。
[ { "id": 3, "description": "", "name": "my-project", "name_with_namespace": "Administrator / my-project", "path": "my-project", "path_with_namespace": "root/my-project", "created_at": "2019-11-16T13:48:47.727Z", "default_branch": null, "tag_list": [], "ssh_url_to_repo": "git@gitlab.example.com:root/my-project.git", "http_url_to_repo": "http://gitlab.example.com/root/my-project.git", "web_url": "http://gitlab.example.com/root/my-project", "readme_url": null, "avatar_url": null, "star_count": 0, "forks_count": 0, "last_activity_at": "2019-11-16T13:48:47.727Z", "namespace": { "id": 1, "name": "Administrator", "path": "root", "kind": "user", "full_path": "root", "parent_id": null, "avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", "web_url": "http://gitlab.example.com/root" } }, { "id": 2, "description": "", "name": "project-b", "name_with_namespace": "group1 / project-b", "path": "project-b", "path_with_namespace": "group1/project-b", "created_at": "2019-11-16T13:48:11.161Z", "default_branch": null, "tag_list": [], "ssh_url_to_repo": "git@gitlab.example.com:group1/project-b.git", "http_url_to_repo": "http://gitlab.example.com/group1/project-b.git", "web_url": "http://gitlab.example.com/group1/project-b", "readme_url": null, "avatar_url": null, "star_count": 0, "forks_count": 0, "last_activity_at": "2019-11-16T13:48:11.161Z", "namespace": { "id": 5, "name": "group1", "path": "group1", "kind": "group", "full_path": "group1", "parent_id": null, "avatar_url": null, "web_url": "http://gitlab.example.com/groups/group1" } }, { "id": 1, "description": "", "name": "project-a", "name_with_namespace": "group1 / project-a", "path": "project-a", "path_with_namespace": "group1/project-a", "created_at": "2019-11-16T13:44:20.849Z", "default_branch": null, "tag_list": [], "ssh_url_to_repo": "git@gitlab.example.com:group1/project-a.git", "http_url_to_repo": "http://gitlab.example.com/group1/project-a.git", "web_url": "http://gitlab.example.com/group1/project-a", "readme_url": null, "avatar_url": null, "star_count": 0, "forks_count": 0, "last_activity_at": "2019-11-16T13:44:20.849Z", "namespace": { "id": 5, "name": "group1", "path": "group1", "kind": "group", "full_path": "group1", "parent_id": null, "avatar_url": null, "web_url": "http://gitlab.example.com/groups/group1" } } ]
ここからさらにプロジェクトのメンバーを取得します。
GET http://gitlab.example.com/api/v4/projects/1/members?access_token=<access token>
[ { "id": 2, "name": "user1", "username": "user1", "state": "active", "avatar_url": "https://www.gravatar.com/avatar/111d68d06e2d317b5a59c2c6c5bad808?s=80&d=identicon", "web_url": "http://gitlab.example.com/user1", "access_level": 40, "expires_at": null } ]
この情報に、さらに上位のグループのメンバーの情報を付与することによって、プロジェクトにアクセス可能なユーザ一覧を作ることができます。
おわりに
今回調べた情報を元にツールを作成予定です。作成出来たら追記します。