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 --init
serait 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
path
etssh_url_to_repo
2.1. Si le répertoire
path
il existe, cd et appelergit pull
2.2. Si le répertoire
path
n'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