Gitlab มีเอกสารแนะนำการใช้งาน API เอาไว้ที่นี่ Gitlab API v4
เวลาเรียกใช้ API จะต้องส่ง token ไปด้วย แบบนี้
curl --header "Authorization: Bearer OAUTH-TOKEN" "https://gitlab.example.com/api/v4/projects"
เราจะต้องไปสร้าง Access Token เก็บเอาไว้ก่อน ไปที่ personal_access_tokens ให้สิทธิ์ api,read_user
endpoint ที่ใช้ดูว่ามี group ที่สนใจอยู่ไหม (myGroup)
curl --request GET --url 'https://gitlab.com/api/v4/groups?search=myGroup' --header 'authorization: Bearer <Persoanl Access Token>'
จะได้ผลลัพธ์เป็น json array ตัวอย่าง
[
{
"id": 1234567,
"web_url": "https://gitlab.com/groups/sample_group",
"name": "sample_group",
"path": "sample_group",
"description": "Sample Group 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,
"mentions_disabled": null,
"lfs_enabled": true,
"default_branch_protection": 2,
"avatar_url": "https://gitlab.com/uploads/-/system/group/avatar/8609943/icon-iworld-buttom.png",
"request_access_enabled": true,
"full_name": "sample_group",
"full_path": "sample_group",
"created_at": "2020-07-20T10:02:31.279Z",
"parent_id": null,
"ldap_cn": null,
"ldap_access": null
}
]
เราสนใจ group id จากผลลัพธ์ข้างต้น สมมติว่าคือ 1234567
เอามาหา projects ที่อยู่ใต้ group ดังกล่าว ด้วย command
https://gitlab.com/api/v4/groups/:groupId/projects
ดูเอกสาร official - list groups
curl --request GET --url 'https://gitlab.com/api/v4/groups/1234567/projects?order_by=name&simple=false' --header 'authorization: Bearer <Persoanl Access Token>'
[
{
"id": 22016909,
...
"namespace": {
...
},
"_links": {
"self": "https://gitlab.com/api/v4/projects/22016909",
...
},
...
},
{
"id": 22567993,
...
"namespace": {
...
},
"_links": {
"self": "https://gitlab.com/api/v4/projects/22567993",
...
},
...
},
...
จากผลลัพธ์ข้างต้น เราจะได้ projects ใต้ group นั้นๆ เราจะหาสมาชิก(members) ภายใต้ projects ต่างๆ ได้จาก URL _links.self
เอาผลลัพธ์ข้างต้นจับลงไฟล์ ด้วย command เราจะได้ json ของ projects ต่างๆ อยู่ในไฟล์ sample-projects.json
curl --request GET --url 'https://gitlab.com/api/v4/groups/1234567/projects?order_by=name&simple=false' --header 'authorization: Bearer <Persoanl Access Token>' -o sample-projects.json
มันมีหลาย project เลยใช้ shell scripts มาช่วย
script นี้จะวน loop เอา _links.self URl ไปเรียกอีก end point นึงเพื่อเอารายชื่อสมาชิกของ project ออกมา
#!/usr/bin/env sh
set -e
for url in $(jq -r '.[] | ._links.self' < sample-projects.json)
do
curl -H 'Authorization: Bearer <Persoanl Access Token>' --url https://gitlab.com/api/v4/groups/1234567/projects/members/all | jq -r '.[]'
done
ไปหาทางทำ json เป็น csv เพิ่อจะเอารายชื่อสมาชิกไปให้ทีม ทำการกาชื่อคนที่ต้องการตัดสิทธิการเข้าถึงออก เมื่อได้ user_id ของ account ที่ต้องการแล้ว เราสามารถใช้ API ในการลบ user_id นั้นออกจาก project ได้
Reference:
- https://www.baeldung.com/java-converting-json-to-csv
- https://data.page/json/csv
- https://www.npmjs.com/package/json2csv
end point นี้ใช้ลบ user ออกจาก project
curl --request DELETE -H 'Authorization: Bearer <Persoanl Access Token>' --url https://gitlab.com/api/v4/groups/1234567/projects/members/:user_id
เอามาใช้กับ bash script รับ arguments เป็น userId ที่ต้องการลบออกจากทุก projects ที่มีอยู่ใน sample-projects.json
#!/usr/bin/env sh
set -e
export userId=$1
for url in $(jq -r '.[] | ._links.self' < sample-projects.json)
do
curl --request DELETE -H 'Authorization: Bearer <Persoanl Access Token>' --url https://gitlab.com/api/v4/groups/1234567/projects/members/$userId
done