Obteniendo la última versión del módulo de PowerShell de Azure

Nota: El script ha sufrido modificaciones, te recomiendo consultar la última versión en su repositorio de GitHub :)

El ritmo de evolución que tienen las soluciones en la nube es abrumador, en cuanto te despistas por un momento nuevos productos y funcionalidades están disponibles. Esto es algo que a los que estamos acostumbrados a trabajar con Azure nos pasa, sólo hay que ver los últimos cambios en el portal de actualizaciones de los diferentes servicios.

Estas nuevas funcionalidades y servicios obligan a actualizar al mismo tiempo las herramientas de gestión. En mi caso, suelo trabajar con Azure a través de PowerShell. Si vosotros queréis trabajar con lo mismo, es posible instalar el módulo de dos formas diferentes: haciendo uso del Web Platform Installer o descargándote el instalador en un fichero .msi. Aunque el WebPI es muy útil para poner a punto tu equipo con todas las herramientas necesarias si trabajas con entornos web, yo prefiero gestionar directamente la instalación del módulo de PowerShell y no tener un programa intermedio que lo haga.

La forma manual de obtener la última versión es la siguiente:

  1. Acceder al portal de GitHub del equipo de Azure donde se encuentra el repositorio de las herramientas de PowerShell
  2. Localizar la opción de ver las últimas versiones públicas
  3. Seleccionar la instalación “Windows Standalone” y descargar el fichero
  4. Lanzar la instalación desde el fichero .msi

El proceso es siempre el mismo por lo que nos da juego a que lo automaticemos con un pequeño script de PowerShell para que lo haga por nosotros. Para obtener los datos necesarios haremos uso de la API que GitHub tiene disponible de forma pública. En particular, haremos uso de la opción de listar las versiones disponibles en un repositorio.

Vamos a ver cómo realizarlo de forma automática

En primer lugar necesitaremos saber cuál es la versión que tenemos disponible del módulo en nuestro PC; en el caso de que no haya ninguna finalizaremos el script ya que no tendremos versión con la que comparar para actualizarlo o no. Otra opción sería ofrecer directamente la descarga aunque no está implementado.

# Check the actual version of the Azure Powershell module if its available
$azureModule = Get-Module -ListAvailable | Where { $_.Name -eq "Azure"}
if ($azureModule -eq $null )
{
    Write-Output "Microsoft Azure PowerShell module is not available on your computer"
    Return
}
$azureInstalledVersion = $azureModule.Version

Tras conocer cuál es la versión que tenemos instalada el siguiente paso es conocer cuál es la última que está disponible en el repositorio de GitHub. Realizaremos la consulta contra la API y en el caso de que esta no devuelva la información esperada finalizaremos la ejecución. Otra posible comprobación a añadir es que la llamada a la API se establece correctamente.

# Check the latest version of the Azure Powershell module released on GitHub
$gitHubData = Invoke-RestMethod -Method Get -Uri "https://api.github.com/repos/Azure/azure-powershell/releases" 
$latestRelease = $gitHubData | Select -First 1
 
if (![System.Version]::TryParse($latestRelease[0].name, [ref]$latestReleaseVersion) )
{
    Write-Error "Information about the latest version cannot be retrieved." -Category ConnectionError -CategoryReason "The connection to GitHub API has not been established properly and the information has not been retrieved"
    Return
}

Si ya estamos con la versión más reciente no necesitaremos continuar.

if ($azureInstalledVersion -ge $latestReleaseVersion)
{
    Write-Output "Your Microsoft Azure Powershell module version ($azureInstalledVersion) is greater or equal to the latest version ($latestReleaseVersion)."
    Return
}

Sin embargo, si tenemos una versión anterior ofreceremos la opción de actualizarse a la última descargando el fichero .msi disponible en la descripción de la release.

# Check if the user wants to update the module
Write-Output "Your Microsoft Azure Powershell module version ($azureInstalledVersion) is not the latest ($latestReleaseVersion)."
$updateModule = Read-Host "Do you want to update it? (Y/N)"
 
if ($updateModule -ne "Y")
{
    Return
}
Updating Azure PowerShell Module
Confirmación de actualización

Si aceptamos, automáticamente nos descargará el instalador y lo ejecutará por lo que nos encontraremos con la página de inicio del asistente para completar nuestra actualización:

$installerUrl = $latestRelease.body | Select-String -Pattern "\[Windows Standalone]\((http://.*)\)" | %{ ($_.Matches.Groups)[1].Value }
$savedFilePath = "$env:HOMEDRIVE$env:HOMEPATH\Downloads\azure-powershell.$($latestRelease.name).msi"
Invoke-WebRequest -Uri $installerUrl -OutFile $savedFilePath
 
Write-Output "Launching installer"
Invoke-Item $savedFilePath
Updating Azure PowerShell Module
Asistente de instalación del módulo de Azure

Si continuamos con el asistente tendremos actualizado finalmente nuestro módulo de Azure en el equipo.