Gérer votre GitHub avec PowerShell

Dans cet article nous allons voir comment gérer votre compte GitHub avec PowerShell.
Nous allons voir comment vous connecter, gérer vos repositories (lister, créer, supprimer), uploader des fichiers…

Le module PowerShell

Pour intéragir facilement avec GitHub depuis PowerShell un module super cool (disponible sur la PSGallery), réalisé par l’équipe PowerShell est disponible.

Install-Module PowerShellForGithub

Vous pouvez trouver davantage d’informations sur ce lien.
Maintenant nous allons voir quelques manières d’utiliser ce module.

Que faire avec le module ?

Lorque vous installez un module la première chose à faie est de voir les cmdlets disponibles.
Pour cela, nous allons utiliser le code ci-dessous:

Get-command -module PowerShellForGithub | out-gridview

Cela permettra de lister toutes les cmdlets:

Maintenant si vous souhaitez filtrer et voir uniquement les cmdlets pour un besoin spécifique, tel que la gestion des repositories nous allons procéder de la manière suivante:

Get-command -module PowerShellForGithub | Where {$_.Name -like "*repo*"} | out-gridview

Cela permettra donc de lister les cmdlets uniquement pour gérer les repositories:

Générer votre token

Avant de pouvoir utiliser le module la première étape consiste à générer un token depuis votre compte GitHub.
Celui sera à saisir dans vos scripts et permettra d’intéragir avec votre compte GitHub.
Pour cela nous allons procéder comme ci-dessous:

  1. Allez sur ce lien
  2. Sélectionner ce que vous souhaitez
  3. Dans mon cas j’ai tout coché pour mes tests
  4. Cliquez sur Generate a token
  5. Le token sera généré Notez le quelque part afin de pouvoir le réutiliser.

Connexion à GitHub depuis PowerShell

Maintenant que nous avons généré ce token, nous allons nous connecter à notre compte depuis PowerShell.

  1. Pour vous connectez, la cmdlet à utiliser est Set-GitHubAuthentication, comme ci-dessous:
Set-GitHubAuthentication -sessiononly

2. Le token vous sera demandé (vous pouvez saisir ce que vous voulez dans le champ user)

  1. Vous êtes maintenant connecté
  2. Vous pouvez également utiliser un objet creds pour la connexion:
$GitHub_SecureToken = Read-Host -assecurestring "Type your GitHub token"
$cred = New-Object System.Management.Automation.PSCredential "username is ignored", $GitHub_SecureToken
Set-GitHubAuthentication -Credential $cred -SessionOnly | out-null

Lister les repositories

Pour lister les repo, la cmdlet à utiliser est Get-GitHubRepository.
Vous pouvez lister tous les repos comme ci-dessous:

(Get-GitHubRepository | select name, full_name, description, html_url, owner, has_wiki) | out-gridview

Lister VOS repositories

Nous allons maintenant lister uniquement les repos dont nous sommes le propriétaire.
La première étape est de récupérer le nom du propriétaire.
Pour cela il faudra utiliser la cmdlet Get-GitHubUser, comme ci-dessous:

(Get-GitHubUser -Current).login)

Pour lister tous nos repos nous allons procéder comme ci-dessous:

(Get-GitHubRepository | select name, full_name, description, html_url, owner, has_wiki) | where {$_.owner.login -like "*$Get_UserName*"} 

Supprimer un repository

La cmldet pour supprimer un repository est Remove-GitHubRepository.
Deux paramètres sont à ajouter à cette cmdlet:

  • ownername: le propriétaire du repo
  • RepositoryName: le nom du repo

Ci-dessous la cmdlet permettant de supprimer un repo nommé test.

Remove-GitHubRepository -ownername damienvanrobaeysdev -RepositoryName test	

Supprimer tous vos repositories

Attention avec cette action car cela, comme son nom l’indique, supprimera tous vos repos.
Nous allons premièrement lister tous NOS repos pour ensuite les supprimer.
Comme vu précédemment pour lister tous nos repos, nous procéderons tel que ci-dessous:

$List_My_Repos = (Get-GitHubRepository | select name, full_name, description, html_url, owner, has_wiki) | where {$_.owner.login -like "*$Get_UserName*"} 
ForEach ($Repo in $List_My_Repos)
	{
		$Repo_Name = $Repo.name
		write-host "Removing the repository $Repo_Name"
		Remove-GitHubRepository -ownername damienvanrobaeysdev -RepositoryName $Repo_Name		
	}

Supprimer plusieurs repositories

Nous allons maintenant supprimer certains repos au lieu de tous les supprimer.
Pour cela nous procèderons tel que ci-dessous:

  1. Lister tous nos repos dans un fichier texte
  2. Ouvrir ce fichier et ne garder que les repos qui doivent être supprimés
  3. Nous allons utiliser le script suivant:
$List_repo_to_remove = Get-Content "c:\test\repos_to_remove.txt"
ForEach ($Repo_To_Remove in $List_repo_to_remove)
	{
		write-host "Removing the repository $Repo_To_Remove"
		Remove-GitHubRepository -ownername damienvanrobaeysdev -RepositoryName $Repo_To_Remove		
	}

Créer un repository

Pour cela la cmdlet à utiliser est New-GitHubRepository.
Il suffira d’ajouter le paramètre RepositoryName avec le nom du répertoire à créer.

New-GitHubRepository  -RepositoryName "test2"

Créer plusieurs repositories

Nous allons procéder comme pour la suppression multiple mais en faisant l’inverse: créer au lieu de supprimer.

$List_repo_to_create = Get-Content "c:\test\repos_to_remove.txt"
ForEach ($Repo_To_Create in $List_repo_to_create)
	{
		write-host "Creating the repository $Repo_To_Create"
		New-GitHubRepository -RepositoryName $Repo_To_Create		
	}

Charger un fichier dans un repo

Pour l’instant il n’y a pas de cmdlet permettant de le faire.
Nous allons donc utiliser la cmldet Invoke-GHRestMethod, qui permet de créer ses propres requêtes.
Jetons un oeil à l’API GitHub pour compendre comment cette action fonctionne.
Le lien est disponible ici.
La doc indique que l’ajout de fichier se fait tel que ci-dessous:
PUT /repos/:owner/:repo/contents/:path
On note donc que la méthode à utiliser est PUT.
La requête peut se traduire tel que ci-dessous:
Votre repo + contents + le fichier à uploader
Par exemple, si vous souhaitez uploader le fichier Backup_TechNet_Gallery_Contributions.ps1 dans le repo test, le lien sera le suivant:

  1. Repo: https://api.github.com/repos/damienvanrobaeysdev/test
  2. Ajouter ensuite au lien le mot contents
  3. Ajouter Backup_TechNet_Gallery_Contributions.ps1

Ci-dessous le lien complet:

"https://api.github.com/repos/damienvanrobaeysdev/test/contents/Backup_TechNet_Gallery_Contributions.ps1"

La documentation indique également qu nous devons ajouter l’application via du JSON, tel que ci-dessous:

{
  "message": "",
  "content": "$Encoded_File"
}
"@

Cette application devrau être au préalable encodée au format base 64.
La prochaine étape consistera donc à cet encodage
Pour cela, utilisez le code suivant:

$File_To_Upload = Read-Host "Type the path of the file to upload"
$Get_File_Name = (Get-ChildItem $File_To_Upload).name					
$Encoded_File = [System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes("$File_To_Upload"));	

Nous avons maintenant notre fichier encodé au format base 64.
Le JSON sera le suivant:

$MyFile_JSON = @"
{
  "message": "",
  "content": "$Encoded_File"
}
"@

Ci-dessous le script complet:

$File_To_Upload = Read-Host "Type the path of the file to upload"
$Get_File_Name = (Get-ChildItem $File_To_Upload).name					
$Encoded_File = [System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes("$File_To_Upload"));							

$MyFile_JSON = @"
{
  "message": "",
  "content": "$Encoded_File"
}
"@

Invoke-GHRestMethod -UriFragment "https://api.github.com/repos/damienvanrobaeysdev/test/contents/$Get_File_Name" -Method PUT -Body $MyFile_JSON

Vous pouvez faire de même pour différents types de fichiers: zip, rar, exe, ps1…

Bien entendu ce module permet de faire bien plus.
Je vous en parlerais prochainement lors d’une conférence pour le French PowerShell User Group, en ligne.
La date sera indiquée prochainement.

A propos de l'auteur

Damien VAN ROBAEYS

Ingénieur Systèmes travaillant principalement sur ce qui tourne autour du poste de travail (MDT, SCCM, Intune) et l’automatisation avec PowerShell. MVP Microsoft et auteur pour ENI, il publie régulièrement sur son blog et gère différents groupes Facebook, PowerShell et WPF (~4000 membres), Windows Autopilot (~3000 membres).

2 réponses sur “Gérer votre GitHub avec PowerShell”

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *