Utilisez gitlabApi pour ajouter en bloc des membres à plusieurs groupes dans gitlab

Tâche

Il est difficile d'ajouter manuellement un groupe gitlab à chaque fois qu'une nouvelle personne arrive

Solution

J'ai créé un programme à l'aide de l'API GitLab. Sur la base de ce qui suit, il est défini dans Lambda pour en faire une API.

Flux de processus

--Valider les valeurs d'entrée (utilisateur: nom d'utilisateur et niveau: autorisations)

Nous effectuons une validation à certains endroits, veuillez donc vous y référer.

programme

# coding: utf-8
import json, requests, re
import inspect

private_token = '[Veuillez sortir de l'écran de gestion de gitlab]'
url_prefix = 'https://[your_gitlab_domain]/api/v4/'

def main(params):
  success_group_list = {}
  try:
    check_empty(params)
    user_info = get_user_info(params['user'])
    success_group_list = add_group(user_info[0]['id'], params['level'])
  except AddGitLabException as e:
    info = e.get_info()
    return {'body': info['body'], 'code': info['code'], 'function': info['function']}
  return {
    'code': 200,
    'body': 'Success:' + str(success_group_list)
  }

#besoin de vérifier
def check_empty(params):
  if 'user' not in params or len(params['user']) == 0 or 'level' not in params or len(params['level']) == 0:
    raise AddGitLabException('Input require parameter.', 400, inspect.currentframe().f_code.co_name)

#Obtenir des informations utilisateur
def get_user_info(username):
  url = url_prefix + 'users?active=true&username=' + username
  headers = {'Private-Token': private_token}
  response = requests.get(url, headers=headers)

  if response.status_code != 200 and response.status_code != 201:
    raise AddGitLabException(response.content, response.status_code, inspect.currentframe().f_code.co_name)
  user_info = json.loads(response.content)
  if user_info[0:1] == False:
    #Erreur si l'utilisateur cible n'existe pas
    raise AddGitLabException('Nothing user.', 404, inspect.currentframe().f_code.co_name)
  return user_info

#Ajouter des membres cibles au groupe
def add_group(user_id, level):
  success_group = []
  for group_info in target_group_list():
    for group_name, group_id in group_info.items():
      url = url_prefix + 'groups/' + str(group_id) + '/members'
      headers = {'Private-Token': private_token}
      response = requests.post(url, headers=headers, data={'user_id': user_id, 'access_level': level})
  
      # 200/201:Inscription réussie, 409:Comme il est déjà enregistré, ne le lancez pas comme une exception
      if response.status_code != 200 and response.status_code != 201 and response.status_code != 409:
        raise AddGitLabException(response.content, response.status_code, inspect.currentframe().f_code.co_name + ' group_id:' + str(group_id))
      success_group.append(group_name + ':' + str(response.status_code))
  return success_group

#Obtenez le groupe cible
def target_group_list():
  return [
    {'[group_name1]' : [group_id1]},
    {'[group_name2]' : [group_id2]}
  ]

#Classe d'exception dédiée
class AddGitLabException(Exception):
  def __init__(self, body, code, function):
    self.body = body
    self.code = code
    self.function = function

  def get_info(self):
    return {'body':self.body,'code':self.code, 'function': self.function}

print(main({'user':'test_user', 'level':'30'}))

L'ID de groupe est obtenu manuellement à l'aide de l'API (voir ci-dessous).

gitlabAPI v4 groups

group_id utilise l'API groups pour obtenir group_id et fait de mon mieux pour le lister (car une fois que vous faites une liste, vous n'avez pas à changer grand-chose après cela) S'il vous plaît laissez-moi savoir s'il existe un bon moyen de se limiter à un groupe spécifique sans essayer de l'énumérer.

Quand gitlabApi est v3

Si vous travaillez toujours avec un ancien gitlab, vous n'avez peut-être activé que la v3.

Il y a un document ci-dessous, alors essayez de le réorganiser pour référence.

https://gitlab.com/gitlab-org/gitlab-foss/blob/8-16-stable/doc/api/README.md

Recommended Posts

Utilisez gitlabApi pour ajouter en bloc des membres à plusieurs groupes dans gitlab
Combinez plusieurs dictionnaires et ajoutez plusieurs éléments à la fois, en toute sécurité et de manière non destructive en Python
Enregistrer plusieurs styles personnalisés dans Word à la fois
[Laravel] Un alias qui crée un fichier de migration pour plusieurs tables à la fois.
Comment utiliser les classes dans Theano
Mock in python - Comment utiliser mox
Comment utiliser SQLite en Python
Comment utiliser Mysql avec python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Créez plusieurs utilisateurs avec des numéros de série à la fois dans Ansible Playbook: Partie 2
Ajouter des mots au dictionnaire utilisateur de MeCab sur Ubuntu pour une utilisation en Python