Skip to content
Snippets Groups Projects
Commit 614b8878 authored by Adrien Lescourt's avatar Adrien Lescourt
Browse files

Update README

parent 0d2ee952
No related branches found
No related tags found
No related merge requests found
...@@ -5,208 +5,73 @@ Ce script permet d'automatiser de nombreuses tâches, notamment la création de ...@@ -5,208 +5,73 @@ Ce script permet d'automatiser de nombreuses tâches, notamment la création de
## Installation et configuration ## Installation et configuration
- Installation via pipx:
``` ```
pipx install git+https://gitedu.hesge.ch/isc/projects/practical-work-manager@refactor pipx install git+https://gitedu.hesge.ch/isc/projects/practical-work-manager@refactor
``` ```
Définir une variable d'environnement `GITEDU_TOKEN` qui contient votre personal token gitlab, ou mettre le token dans un fichier
`$HOME/.config/gitedu_token`. Si l'env var et le fichier gitedu_token sont les 2 présents, c'est l'env var qui est utilisé.
Vous pouvez générer le token: [sur cette page](https://gitedu.hesge.ch/-/user_settings/personal_access_tokens), en cochant la case "api".
## Utilisation ## Utilisation
- Créer un groupe et les repositories en une seule commande, avec un repository "image" optionnel et un fichier d'emails (voir [Syntaxe du fichier YAML (REPOS_FILE)](#syntaxe-du-fichier-yaml-repos_file) : - Créer un groupe et les repositories en une seule commande, avec un repository "image" optionnel et un fichier [(REPOS_FILE)](#syntaxe-du-fichier-yaml-repos_file):
```bash ```bash
pwm -t TOKEN group_repos GROUP_NAME REPOS_FILE [-i IMPORT_URL] pwm group_repos GROUP_NAME REPOS_FILE [-i IMPORT_URL]
``` ```
- Créer, au sein d'un groupe existant, les repositories en une seule commande, avec un repository "image" optionnel et un fichier d'emails (voir [Syntaxe du fichier YAML (REPOS_FILE)](#syntaxe-du-fichier-yaml-repos_file) : - Clone tous les projets des étudiants d'un groupe gitlab (`GROUP_ID`) dans un répertoire créé à la volée:
```bash ```bash
pwm -t TOKEN repos GROUP_ID REPOS_FILE [-i IMPORT_URL] pwm clone GROUP_ID DIRECTORY
``` ```
- Clone tous les projets des étudiants d'un groupe gitlab (`ID`) dans un répertoire créé à la volée : - Liste les noms des repository dans un groupe :
```bash ```bash
pwm -t TOKEN clone ID DIRECTORY pwm list_projects GROUP_ID
``` ```
- Liste les noms des projets dans un groupe : - Liste les noms des users dans un repository :
```bash ```bash
pwm list ID pwm list_users PROJECT_ID
``` ```
- [Practical Work Manager (pwm)](#practical-work-manager-pwm)
- [Utilisation](#utilisation)
- [Workflow d'utilisation](#workflow-dutilisation)
- [Utilisation de pwm](#utilisation-de-pwm)
- [Création d'un groupe et des projets](#création-dun-groupe-et-des-projets)
- [Création des projets au sein d'un groupe existant](#création-des-projets-au-sein-dun-groupe-existant)
- [Création d'un groupe seulement](#création-dun-groupe-seulement)
- [Création d'un sous-projet dans le groupe](#création-dun-sous-projet-dans-le-groupe)
- [Clone de tous les repositories](#clone-de-tous-les-repositories)
- [Liste des projets d'un groupe ou des membres d'un projet](#liste-des-projets-dun-groupe-ou-des-membres-dun-projet)
- [Syntaxe du fichier YAML (REPOS_FILE)](#syntaxe-du-fichier-yaml-repos_file)
- [Noms et emails](#noms-et-emails)
- [Emails seulement](#emails-seulement)
## Workflow d'utilisation
Pour expliquer la démarche d'utilisation, prenons le scénario suivant :
- L'enseignant Michel Albuquerque prépare un nouveau travail pratique (TP). Il souhaite forcer les étudiants à utiliser git et gitedu pour qu'ils versionnent leur code et pour qu'il puisse visualiser et recevoir leur rendus.
- Les TPs sont à faire par groupe ou de manière individuelle.
- Pour transmettre son énoncé et des fichiers (exemples, squelette de code, librairies, binaires, etc.) aux étudiants, Michel Albuquerque crée un repository git accessible publiquement, nommé "super-tp".
- Grâce à ce repository "super-tp", il peut mettre à jour le contenu distribué aux étudiants, en leur offrant la possibilité de visualiser les changements incrémentaux survenus.
Le moment est venu de créer les dépôts git pour chaque groupe/étudiant suivant le cours et devant réaliser le TP. Sur la base d'une liste de groupes ou d'étudiants, Michel Albuquerque pourra utiliser le programme pour :
1. Créer le groupe (namespace) dédié au cours/TP, contenant tous les repositories des étudiants.
1. Créer chaque repository pour chaque groupe/étudiant avec les contraintes nécessaires (privé, accessible à (aux) l'étudiant(s) concerné(s), aux enseignants, etc.)
1. Récupérer (clone) sur sa machine tous les repositories d'un seul coup, dans des répertoires séparés, au moment du rendu par exemple.
## Utilisation de pwm
Ce programme est écrit en python et testé avec les versions 3.6, 3.7, 3.8 et 3.9, avec les dépendances suivantes (voir `requirements.txt`) :
```
requests
pyyaml
```
Pour rappel, pour ne pas à avoir à installer ces deux dépendances au niveau système, les commandes suivantes génèrent un environnement virtuel :
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
pwm se présente sous la forme d'une CLI. Il nécessite un `token` gitlab, pouvant être généré [sur cette page](https://gitedu.hesge.ch/-/profile/personal_access_tokens), en cochant la case "api".
**Attention** : une fois crée, le token est affiché une fois seulement sur la page et ne sera ensuite plus jamais visible.
Le `token` peut ensuite être utilisé de trois manières :
1. Écrit dans le fichier `~/.gitedu_token` (conseil : réaliser ensuite un `chmod 600 ~/.gitedu_token` pour en protéger l'accès)
2. Placé dans la variable d'environnement `GITEDU_TOKEN`
3. Donné en argument de `pwm` avec l'option `-t` ou `--token`
Selon les commandes, un `project_id` ou `group_id` est également nécessaire, il correspond à celui affiché sur la page du groupe / projet :
![image](project_id.png)
L'exécution du programme sans arguments affiche l'aide et le détail pour chaque sous-commande.
### Création d'un groupe et des projets
```bash
python pwm group_repos GROUP_NAME REPOS_FILE [-h] [--visibility VISIBILITY] [-i IMPORT_URL] [-x EXPIRES_AT]
```
Exécute les opérations de création de groupe et de repositories à partir d'un fichier YAML (voir [Syntaxe du fichier YAML (REPOS_FILE)](#syntaxe-du-fichier-yaml-repos_file)). Voir les sous-sections suivantes pour les détails des sous-commandes.
### Création des projets au sein d'un groupe existant
```bash
python pwm repos GROUP_ID REPOS_FILE [-h] [-i IMPORT_URL] [-x EXPIRES_AT]
```
Exécute les opérations de création de repositories à partir d'un fichier YAML (voir [Syntaxe du fichier YAML (REPOS_FILE)](#syntaxe-du-fichier-yaml-repos_file)). Voir les sous-sections suivantes pour les détails des sous-commandes.
#### Exemple d'utilisation
Soit le fichier `psa_groups.yml` qui defini les 3 groupes d'étudiants ci-dessous :
```
- name: group1
emails:
- prenom.nom11@hesge.ch
- prenom.nom12@hesge.ch
- name: group2
emails:
- prenom.nom21@hesge.ch
- prenom.nom22@hesge.ch
- name: group3
emails:
- prenom.nom31@hesge.ch
- prenom.nom32@hesge.ch
```
On commence par activer l'environnement python :
```
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
Ensuite, on exécute le script qui va créer les groupes définis dans le fichier yml ci-dessus dans le groupe gitlab 1458 existant et populer chaque repository avec la repo passé en argument (ici une repo vide sur github) :
```
python3 pwm repos 1458 psa_2022.yml -i https://github.com/florentgluck/empty.git
```
Comme aucun token n'est spécifié, le script utilise celui se trouvant dans le fichier `~/.gitedu_token`.
A noter qu'on pourrait également ajouter l'argument `-t <token>` avant l'argument `repos` pour spécifier le token sur la ligne de commande.
### Création d'un groupe seulement
```bash
python pwm group [-h] [--visibility VISIBILITY] GROUP_NAME
```
Crée un groupe au sens gitlab du terme, nommé `GROUP_NAME`, avec la visibilité optionnelle `VISIBILITY` (`private`, `internal` ou `public`), par défaut privée. Si le groupe existe déjà, ne fait rien. Retourne le `group_id` du groupe créé, nécessaire pour la création des sous-projets par exemple.
### Création d'un sous-projet dans le groupe
```bash
python pwm repo [-h] [-n NAME] [-i IMPORT_URL] [-x EXPIRES_AT] GROUP_ID EMAILS
```
Crée un dépôt git (projet) au sein d'un groupe à partir de l'URL d'un projet existant pour une liste d'emails d'étudiants. Détail des arguments :
- `NAME` : optionnel, le nom du nouveau repository à créer pour le ou les étudiants concernés. Si non renseigné, prend la première partie du premier email dans `EMAILS`.
- `IMPORT_URL` : optionnel, l'URL (http) du projet (repository) existant. Ce projet doit être public.
- `EXPIRES_AT`: optionnel, au format `YYYY-MM-DD`, supprime les étudiants ajoutés à la date donnée (ils ne peuvent plus `push`).
- `GROUP_ID` : l'identifiant du groupe dédié au cours/TP, créé précédemment.
- `EMAILS` : une liste d'emails des étudiants. Les emails sont séparés par une virgule. Peut contenir un seul email.
### Clone de tous les repositories
```bash
python pwm clone [-h] [-g | -f] [-u UNTIL_DATE] ID DIRECTORY
```
Clone tous les repositories d'un groupe (`-g`) ou tous les forks d'un projet (`-f`) selon l'id (`ID`) donné dans un répertoire nommé `DIRECTORY`. Si une date `UNTIL_DATE` (au format `YYYY-MM-DD hh:mm`) est donnée, exécute un `git checkout` sur le premier commit précédant cette date. Affiche sur la sortie standard les membres du groupe (avec un droit d'accès supérieur à *Reporter*), l'url web du repo et dans quel sous-répertoire se trouvent les fichiers.
### Liste des projets d'un groupe ou des membres d'un projet
```bash
python pwm list [-h] [-p | -m] [-s SHOW] ID
```
Liste les projets d'un groupe ou les membres d'un projet selon l'id `ID`. L'argument `--show` (ou `-s`) permet de choisir quelles informations à afficher (par défaut le nom) : `[all | name | url | ssh]`.
## Syntaxe du fichier YAML (REPOS_FILE) ## Syntaxe du fichier YAML (REPOS_FILE)
Le fichier YAML doit respecter une des deux syntaxes suivantes. Le fichier YAML doit respecter une des deux syntaxes suivantes.
### Noms et emails ### Noms et login aai
Pour chaque projet créé, un nom et une liste d'emails doivent être renseignés : Pour chaque projet créé, un nom et une liste d'identifiants AAI (sans suffix) doivent être renseignés:
```yaml ```yaml
- name: group1 - name: group1
emails: users_login_aai:
- prenom.nom11@hesge.ch - login.aai_11
- prenom.nom12@hesge.ch - login.aai_12
- name: group2 - name: group2
emails: users_login_aai:
- prenom.nom21@hesge.ch - login.aai_21
- prenom.nom22@hesge.ch - login.aai_22
- login.aai_23
- name: group3 - name: group3
emails: users_login_aai:
- prenom.nom31@hesge.ch - login.aai_31
- prenom.nom32@hesge.ch - login.aai_32
``` ```
### Emails seulement ### Login aai seulement
Si uniquement les emails sont fournis, prend le premier nom de chaque email pour nom de projet : Si uniquement les users_login_aai sont fournis, prend le premier pour le nom du projet :
```yaml ```yaml
- emails: - users_login_aai:
- prenom.nom11@hesge.ch # project_name = prenom.nom11 - login.aai_11 # project_name = login.aai_11
- prenom.nom12@hesge.ch - login.aai_12
- emails: - users_login_aai:
- prenom.nom21@hesge.ch # project_name = prenom.nom21 - login.aai_21 # project_name = login.aai_21
- prenom.nom22@hesge.ch - login.aai_22
- emails: - login.aai_23
- prenom.nom31@hesge.ch # project_name = prenom.nom31 - users_login_aai:
- prenom.nom32@hesge.ch - login.aai_31 # project_name = login.aai_31
- login.aai_32
``` ```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment