Búsqueda de sitios web

Crear un repositorio de GitHub desde PowerShell


Seguí trabajando con la API de GitHub en PowerShell. Hoy tengo una función que puedes usar para crear un nuevo repositorio de GitHub. Por supuesto, necesitarás tener una cuenta de GitHub y otra información crítica, pero después de eso es bastante fácil crear nuevos repositorios. Esto le facilita la automatización del aprovisionamiento de nuevos proyectos, que es otra cosa en la que estoy trabajando. Pero por ahora, ¡creemos algunos repositorios!

La primera información que necesitará es un token de acceso personal de GitHub. Si no tiene uno guardado, deberá crear uno. Vaya a la configuración de su perfil de GitHub y haga clic en el enlace "Tokens de acceso personal". Es posible que veas una lista de tokens existentes, pero no podrás ver el valor real. Pero puede crear fácilmente un nuevo token para usarlo con sus scripts de PowerShell.

Haga clic en el enlace "Generar nuevo token" y confirme su contraseña. Introduzca una descripción y luego seleccione los ámbitos. Debido a que puede usar esto con otros scripts de PowerShell, elegiría todos los ámbitos de repositorio, esencia y usuario. Haga clic en "Generar token", copie la cadena de 40 dígitos y guárdela en un lugar seguro. Este es el token de Git que necesitarás para autenticarte. En mi perfil de PowerShell lo tengo almacenado en una variable, $gitToken. Deberías proteger este token.

Ahora estás listo para empezar a trabajar con tu cuenta de GitHub.

Aquí está la función de PowerShell en la que he estado trabajando.

Function New-GitHubRepository {
[cmdletbinding(SupportsShouldProcess)]

Param(
[Parameter(Position = 0, Mandatory, HelpMessage = "Enter the new repository name")]
[ValidateNotNullorEmpty()]
[string]$Name,

[string]$Description,

[switch]$Private,
[switch]$NoWiki,
[switch]$NoIssues,
[switch]$NoDownloads,
[switch]$AutoInitialize,

#license templates found at https://github.com/github/choosealicense.com/tree/gh-pages/_licenses
[ValidateSet("MIT","apache-2.0","gpl-3.0","ms-pl","unlicense")]
[string]$LicenseTemplate,

[Alias("token")]
[ValidateNotNullorEmpty()]
[string]$UserToken = $gitToken,

#write full native response to the pipeline
[switch]$Raw
)

Write-Verbose "[BEGIN  ] Starting: $($MyInvocation.Mycommand)"
#display PSBoundparameters formatted nicely for Verbose output  
[string]$pb = ($PSBoundParameters | Format-Table -AutoSize | Out-String).TrimEnd()
Write-Verbose "[BEGIN  ] PSBoundparameters: `n$($pb.split("`n").Foreach({"$("`t"*2)$_"}) | Out-String) `n" 

#create the header
$head = @{
Authorization = 'Basic ' + $UserToken
}

#create a hashtable from properties
$hash = @{
 name = $Name
 description = $Description
 private = $Private -as [boolean]
 has_wiki = (-Not $NoWiki)
 has_issues = (-Not $NoIssues)
 has_downloads = (-Not $NoDownloads)
 auto_init = $AutoInitialize -as [boolean]
}

if ($LicenseTemplate) {
    $hash.add("license_template",$LicenseTemplate)
}

$body = $hash | ConvertTo-Json

Write-Verbose "[PROCESS] Sending json"
Write-Verbose $body

#define parameter hashtable for Invoke-RestMethod
$paramHash = @{
Uri = "https://api.github.com/user/repos" 
Method = "Post"
body = $body 
ContentType = "application/json"
Headers = $head
UseBasicParsing = $True
DisableKeepAlive = $True
}

#should process
if ($PSCmdlet.ShouldProcess("$name [$description]")) {
   $r = Invoke-RestMethod @paramHash

    if ($r.id -AND $Raw) {
        Write-Verbose "[PROCESS] Raw result"
        $r

    } elseif ($r.id) {
        write-Verbose "[PROCESS] Formatted results"

        $r | Select-Object @{Name = "Name";Expression = {$_.name}},
        @{Name = "Description";Expression = {$_.description}},
        @{Name = "Private";Expression = {$_.private}},
        @{Name = "Issues";Expression = {$_.has_issues}},
        @{Name = "Wiki";Expression = {$_.has_wiki}},
        @{Name = "URL";Expression = {$_.html_url}},
        @{Name = "Clone";Expression = {$_.clone_url}}
    } else {
        
        Write-Warning "Something went wrong with this process"
    }

    if ($r.clone_url) {
      $msg = @"

To push an existing local repository to Github run these commands:
-> git remote add origin $($r.clone_url)"
-> git push -u origin master

"@
    Write-Host $msg -ForegroundColor Green

    }
}

Write-Verbose "[END    ] Ending: $($MyInvocation.Mycommand)"

}

Permítanme señalar algunas cosas.

Los únicos parámetros realmente necesarios son el nombre y el token de GitHub. Establecí el valor predeterminado de este último en la variable de mi perfil, por lo que el parámetro no está marcado como obligatorio. También puede especificar una descripción del repositorio.

Cuando creas un nuevo repositorio, por defecto es público. Pero si tienes una cuenta paga, puedes optar por hacerla privada. Todos los repositorios también obtienen una wiki, problemas y la opción de realizar descargas, pero puedes crear un repositorio sin ninguna de estas cosas con los parámetros correspondientes.

Tiendo a crear repositorios después de haber iniciado un proyecto localmente, así que manejo cosas como una licencia y README.md por mi cuenta. Cuando creas un nuevo repositorio con mi función, puedes elegir incluir una licencia (agregué un conjunto de validación para las elecciones más comunes que creo que harías), así como un parámetro para Inicializar automáticamente. Esto creará un archivo README.md predeterminado.

La magia de todo esto es crear un cuerpo de directivas con formato json.

#create a hashtable from properties
$hash = @{
 name = $Name
 description = $Description
 private = $Private -as [boolean]
 has_wiki = (-Not $NoWiki)
 has_issues = (-Not $NoIssues)
 has_downloads = (-Not $NoDownloads)
 auto_init = $AutoInitialize -as [boolean]
}

if ($LicenseTemplate) {
    $hash.add("license_template",$LicenseTemplate)
}

$body = $hash | ConvertTo-Json

Este cuerpo se convierte en parte de los parámetros que incluiré en Invoke-Restmethod.

$paramHash = @{
Uri = "https://api.github.com/user/repos" 
Method = "Post"
body = $body 
ContentType = "application/json"
Headers = $head
UseBasicParsing = $True
DisableKeepAlive = $True
}

El encabezado se construye a partir de su token de usuario.

$head = @{
Authorization = 'Basic ' + $UserToken
}

El resultado de GitHub es un documento json pero Invoke-RestMethod lo convierte automáticamente en un objeto. De forma predeterminada, construyo un objeto de salida personalizado a partir de estos datos.

$r | Select-Object @{Name = "Name";Expression = {$_.name}},
        @{Name = "Description";Expression = {$_.description}},
        @{Name = "Private";Expression = {$_.private}},
        @{Name = "Issues";Expression = {$_.has_issues}},
        @{Name = "Wiki";Expression = {$_.has_wiki}},
        @{Name = "URL";Expression = {$_.html_url}},
        @{Name = "Clone";Expression = {$_.clone_url}}

O puedes usar -Raw para ver todo.

La última parte de la función es algo que obtienes en GitHub cuando creas un repositorio vacío y es un consejo sobre cómo configurar un repositorio local.

if ($r.clone_url) {
      $msg = @"

To push an existing local repository to Github run these commands:
-> git remote add origin $($r.clone_url)"
-> git push -u origin master

"@
    Write-Host $msg -ForegroundColor Green

    }

Parece que nunca puedo recordar la sintaxis, así que este es un buen toque para mí.

Mi función utiliza Write-Verbose y admite -Whatif.

Ahora de verdad y dejaré -Detallado.

¡Hecho! Puedes ver los comandos de git al final en verde. Aquí está el repositorio en GitHub.

Todavía no tiene nada y lo eliminaré en breve, pero funciona.

Con suerte, esta función eventualmente se convertirá en parte de un conjunto de herramientas más amplio. Pero siéntete libre de usarlo ahora y cuéntame cómo funciona para ti.

Disfruta y ten un buen fin de semana.

Artículos relacionados