ใช้ Gitlab API ลบ user ใน groups, projects

Posted on
gitlab api

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:

  1. https://www.baeldung.com/java-converting-json-to-csv
  2. https://data.page/json/csv
  3. 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