msawady’s learning memo

フルスタックエンジニアを目指して、学んだことをログっていくところ

【GitLab】【Python】GitLabにユーザーを一括で登録、グループ参加

GitLab API を使ってユーザー一括登録

必要なもの

  • Python3
  • GitLabのAdminユーザーのprivate access token

python-gitlab のセットアップ

  • pip を利用してpython-gitlab のインストール
pip install python-gitlab 
  • 以下のような設定ファイル(python-gitlab.cfg)を用意
[default]
url = https://gitlab.somewhere.com/
private_token = AdminAccessToken
timeout = 5
ssl_verify = True
api_version = 4

ソースコード

#!/usr/bin/env python3

import argparse
import csv
import gitlab


def add_user(api, csvfile):
    with open(csvfile, 'r') as cf:
        csvreader = csv.reader(cf, delimiter=',', quotechar='|')
        for row in csvreader:
            params = {}
            params['email'] = row[0]
            params['username'] = row[1]
            params['name'] = row[2]
            params['reset_password'] = True
            user = api.users.create(params)
            print('User:{} has created'.format(user))


def add_user_to_group(api, csvfile):
    all_group = api.groups.list()
    with open(csvfile, 'r') as cf:
        csvreader = csv.reader(cf, delimiter=',', quotechar='|')
        for row in csvreader:
            user = api.users.list(username=row[0])[0]
            for i in range(1, len(row)):
                group = [g for g in all_group if g.full_path == row[i]][0]
                params = {}
                params['user_id'] = user.id
                params['access_level'] = gitlab.DEVELOPER_ACCESS
                group.members.create(params)
                print('User:{0} has joined in {1}'.format(user.name, group.name))


if __name__ == "__main__":
    parser=argparse.ArgumentParser()
    parser.add_argument('--csvfile')
    parser.add_argument('--group', action='store_true')
    args=parser.parse_args()

    api=gitlab.Gitlab.from_config(config_files=['./python-gitlab.cfg'])
    gl.session.proxies = {
          'http': 'http://yourproxy.com:9090',
          'https': 'https://yourproxy.com:8443'
    }

    if args.group:
        add_user_to_group(api=api, csvfile=args.csvfile)
    else:
        add_user(api=api, csvfile=args.csvfile)

補足と解説

  • 設定ファイルを読み込んでGitLabのAPIを初期化して、そのapiを利用してユーザー登録/グループ参加 を行います
  • Proxy環境で使いたいときは、apiにproxy設定をいれます
    api=gitlab.Gitlab.from_config(config_files=['./python-gitlab.cfg'])
    gl.session.proxies = {
          'http': 'http://yourproxy.com:9090',
          'https': 'https://yourproxy.com:8443'
    }
  • ユーザー登録時にパスワードを設定させるメールを送るようにしています
            params['reset_password'] = True

決まった初期パスワードを設定したいときは以下のようにします

            params['password'] = 'secret_p@ssw0rd'
  • Group に追加するときはDeveloper として登録されます
                params['access_level'] = gitlab.DEVELOPER_ACCESS

使い方

ユーザー登録

  • 以下のようなcsvファイルを用意する。左からメールアドレス、ログインID、表示名です。
tom.brady@patriots.com,tom.brady,Tom Brady
david.andrews@patriots.com,david.andrews,David Andrews
patrick.chung@patriots.com,patrick.chung,Patrick Chung
./add-user --csvfile filename.csv

ユーザーのグループ参加

  • 以下のようなcsvファイルを用意する。一番左にユーザーのログインID、右に登録したいグループをフルパスで並べます。
tom.brady,offence
david.andrews,offence,offence/lines
patrick.chung,defence
./add-user --group --csvfile filename.csv

終わりに

  • やっつけでつくったものですが、それなりに綺麗にかけたかなと。
  • グループ登録時の権限指定はファイルに書くようにしたいですね。
  • コードやサンプルファイルはGitHubに置きました。よろしければご利用ください。

github.com

業務ではPythonを使うことが多くなってきました。こういうことをパッと出来ると成長を感じますね。 AWSのLambdaなども書く機会が増えてきたので、Python繋がりでそういう記事も書きたいです。