mind.

学んだことの記録

GitLabのProjectに所属しているメンバーの一覧を取得するスクリプト

なぜ

Emails on push機能で送信したいメールアドレスの一覧を取得したかったからです。
送信先は各Projectの「Integration Settings」の「Recipients」で設定することができます。
f:id:cm_kenji:20200317193634p:plain

職場ではProjectのメンバー全員にpush時のメールを送信するというルールになっているため、その一覧を取得できればコピペで設定できます。

スクリプト

get_member_list.py

import os
import sys
import json
import requests


def get_all_user_email_dict():
    headers = {
        'Private-Token': os.environ['ACCESS_TOKEN'],
    }
    params = (
        ('page', '1'),
        ('per_page', '1000'),
    )

    response = requests.get('http://XXXXX/api/v4/users', headers=headers, params=params)
    data = response.json()
    path_dict = dict()
    for row in data:
        username = json.dumps(row["username"], indent=4).replace("\"", "")
        path_dict[username] = json.dumps(row["email"], indent=4).replace("\"", "")

    return path_dict

def get_username_list_by_project(project_id):
    headers = {
        'Private-Token': os.environ['ACCESS_TOKEN'],
    }

    response = requests.get('http://XXXXX/api/v4/projects/{}/users'.format(project_id), headers=headers)
    data = response.json()
    path_list = list()
    for row in data:
        path_list.append(json.dumps(row["username"], indent=4).replace("\"", ""))

    return path_list

args = sys.argv
project_id = args[1]
email_dict = get_all_user_email_dict()
username_list = get_username_list_by_project(project_id)
for username in username_list:
    if username in email_dict.keys() and username != "root":
        print(email_dict[username])

XXXXXはGitLabのホスト名です。環境に応じたものを入力してください。

import requestsは下記コマンドでインストールできます。

pip3 install requests

解説

get_all_user_email_dict()

すべてのユーザーのusernameをキー、emailを値とするディクショナリを返す関数です。

get_username_list_by_project()

引数で指定したProjectに所属しているメンバーのusernameのリストを返す関数です。

get_username_list_by_project()で取得したユーザーのusernameに一致するディクショナリのメンバからメールアドレスを取得する、といった流れです。

使い方

python3 get_member_list.py [Project_id]

Project_idはメンバー一覧を取得したいProjectのIDに置き換えてください。
ProjectのIDはProjectのトップページに表示されています。

Project_id例

f:id:cm_kenji:20200317195127p:plain

感想

メーリングリストを作ろう。