Comment cloner tous les projets d'un groupe à la fois dans GitLab?
6 réponses
Pas vraiment, sauf si:
vous avez une 21e projet qui fait référence à la autres 20 submodules.
(auquel cas un clone suivi d'ungit submodule update --initserait suffisant pour obtenir tous les 20 projets cloné et vérifié)ou vous en quelque sorte la liste des projets auxquels vous avez accès (GitLab API pour les projets de moins!--7-->), et boucle sur ce résultat pour cloner chacun d'eux (ce qui signifie que peut être scripté, puis exécuté comme " un" de commande)
voici un exemple en Python 3:
from urllib.request import urlopen
import json
import subprocess, shlex
allProjects = urlopen("http://[yourServer:port]/api/v3/projects/all?private_token=[yourPrivateTokenFromUserProfile]")
allProjectsDict = json.loads(allProjects.read().decode())
for thisProject in allProjectsDict:
try:
thisProjectURL = thisProject['ssh_url_to_repo']
command = shlex.split('git clone %s' % thisProjectURL)
resultCode = subprocess.Popen(command)
except Exception as e:
print("Error on %s: %s" % (thisProjectURL, e.strerror))
j'ai construit un script (curl, git, jq requis) juste pour ça. On l'utilise et il fonctionne très bien: https://gist.github.com/JonasGroeger/1b5155e461036b557d0fb4b3307e1e75
pour trouver votre espace de noms, il est préférable de vérifier rapidement L'API:
curl "https://domain.com/api/v3/projects?private_token=$GITLAB_PRIVATE_TOKEN"
là, utilisez " namespace.nom " comme NAMESPACE pour votre groupe.
Le script fait essentiellement:
- Obtenez tous les projets qui correspondent à votre
PROJECT_SEARCH_PARAM Obtenir leur
pathetssh_url_to_repo2.1. Si le répertoire
pathil existe, cd et appelergit pull2.2. Si le répertoire
pathn'existe pas, appelezgit clone
il y a un outil appelé myrepos, qui gère plusieurs versions contrôle les dépôts. La mise à jour de tous les dépôts exige simplement une commande:
mr update
afin d'enregistrer tous les projets gitlab auprès de mr, voici un petit script python. Il nécessite le paquet python-gitlab installé:
import os
from subprocess import call
from gitlab import Gitlab
# Register a connection to a gitlab instance, using its URL and a user private token
gl = Gitlab('http://192.168.123.107', 'JVNSESs8EwWRx5yDxM5q')
groupsToSkip = ['aGroupYouDontWantToBeAdded']
gl.auth() # Connect to get the current user
gitBasePathRelative = "git/"
gitBasePathRelativeAbsolut = os.path.expanduser("~/" + gitBasePathRelative)
os.makedirs(gitBasePathRelativeAbsolut,exist_ok=True)
for p in gl.Project():
if not any(p.namespace.path in s for s in groupsToSkip):
pathToFolder = gitBasePathRelative + p.namespace.name + "/" + p.name
commandArray = ["mr", "config", pathToFolder, "checkout=git clone '" + p.ssh_url_to_repo + "' '" + p.name + "'"]
call(commandArray)
os.chdir(gitBasePathRelativeAbsolut)
call(["mr", "update"])
voici un autre exemple de script bash pour cloner toutes les repos dans un groupe. La seule dépendance que vous devez installer est jq (https://stedolan.github.io/jq/). Placez simplement le script dans le répertoire dans lequel vous voulez cloner vos projets. Puis l'exécuter comme suit:
./myscript <group name> <private token> <gitlab url>
i.e.
./myscript group1 abc123tyn234 http://yourserver.git.com
Script:
#!/bin/bash
if command -v jq >/dev/null 2>&1; then
echo "jq parser found";
else
echo "this script requires the 'jq' json parser (https://stedolan.github.io/jq/).";
exit 1;
fi
if [ -z "" ]
then
echo "a group name arg is required"
exit 1;
fi
if [ -z "" ]
then
echo "an auth token arg is required. See /profile/account"
exit 1;
fi
if [ -z "" ]
then
echo "a gitlab URL is required."
exit 1;
fi
TOKEN="";
URL="/api/v3"
PREFIX="ssh_url_to_repo";
echo "Cloning all git projects in group ";
GROUP_ID=$(curl --header "PRIVATE-TOKEN: $TOKEN" $URL/groups?search= | jq '.[].id')
echo "group id was $GROUP_ID";
curl --header "PRIVATE-TOKEN: $TOKEN" $URL/groups/$GROUP_ID/projects?per_page=100 | jq --arg p "$PREFIX" '.[] | .[$p]' | xargs -L1 git clone
Vous pouvez vous référer à ce script ruby ici: https://gist.github.com/thegauraw/da2a3429f19f603cf1c9b3b09553728b
mais vous devez vous assurer que vous avez le lien vers l'url de l'organisation gitlab (qui ressemble à:https://gitlab.example.com/api/v3/ par exemple organisation) et le jeton privé (qui ressemble à: QALWKQFAGZDWQYDGHADS et vous pouvez entrer:https://gitlab.example.com/profile/account Une fois que vous êtes connecté). Aussi ne assurez-vous que vous avez httparty gem installé ou gem install httparty