Cada vez es más frecuente los perfiles denominados DevOps, según la Wikipedia es un acrónimo inglés de development (desarrollo) y operations (operaciones), que se refiere a una metodología de desarrollo de software que se centra en la comunicación, colaboración e integración entre desarrolladores de software y los profesionales de operaciones en las tecnologías de la información (IT). DevOps es una respuesta a la interdependencia del desarrollo de software y las operaciones IT. Su objetivo es ayudar a una organización a producir productos y servicios software rápidamente. Este tipo de perfiles son muy comunes dentro del mundo de SharePoint debido a que para poder desarrollar de forma correcta debes de conocer sus limites y aspectos para administrar nuestro servidor favorito.
PowerShell es la herramienta/lenguaje de programación para unificar a los administradores de sistemas y a los desarrolladores. PowerShell ha ido cogiendo fuerza dentro de SharePoint, hasta tal punto que ha substituido a la acciones realizadas mediante la Interfaz de Usuario, y ha dejado en obsoleto el anterior comando.
Motivos
- Mayor velocidad de acceso
- No hace falta instalar nada sobre la granja
- Herramienta para chequear el estado de la granja
- Extensible con la potencia que da el lenguaje
- Despliegue de soluciones
De todos estos puntos, vamos a centrarnos en el último motivo: el despliegue de soluciones. El ciclo de vida del desarrollo dentro de SharePoint es un tanto peculiar y se puede hacer de muchas formas. Correctamente en mi opinión hay dos:
- Mediante Features: todo artefacto (columnas de sitio, tipos de contenido, webparts, masterpages,etc..) que se haga sobre nuestro site-colection tiene una feature (bien a nivel de site,farm,web) que lo despliega sobre la granja.
- Mezclando PowerShell + Features: Mediante PowerShell desplegamos los artefactos de infraestructura de la granja (columnas de sitio, tipos de contenido, site), activamos las características que correspondan y realizamos la configuración de los servicios que toque. E implementamos Features donde estarán los elementos de diseño(css, master-page, pageLayouts, display-templates) y los webparts desarrollados.
La principal diferencia entre ambas radica en el proceso de actualización de la solución, en el primer caso si vamos a realizar una modificación sobre un nuevo tipo de contenido debemos de crear una feature para volver a añadir, generar otro wsp e instalar un elemento más sobre la granja (algo que a la larga va penalizando la vida de la granja). En cambio en PowerShell no realizamos ninguna modificación en el wsp, mediante el lanzamiento de un script podemos realizar esta modificación y de esta forma no añadimos ninguna carga extra a la granja.
El motivo de que PowerShell no es solamente una herramienta para administradores de sistema, es que en visual Studio tenemos extensiones para poder utilizar PowerShell desde el propio IDE. Dentro de estas extensiones en mi opinión la que mejor funciona es Power Shell Tolls
Algunas operaciones básicas haciendo uso de PowerShell
Crear Lista
$ListName = "Aplicaciones" $ListDescription = "Listado de Aplicaciones" $SPWeb = Get-SPWeb $SiteURL $ListTemplate = $SPWeb.ListTemplates["Custom List"] if($ListTemplate -eq $null) { $ListTemplate = $SPWeb.ListTemplates["Lista personalizada"] } write-host "Adding list" $ListName -foregroundcolor Yellow $listUrl = $SPWeb.ServerRelativeUrl + "Lists/" + $ListName; $myCustomList = $SPWeb.Lists[$ListName]
Despliegue de Soluciones
Param ( [Parameter(Mandatory=$false)] [string]$UrlWebApplication = "", [Parameter(Mandatory=$true)] [string]$Path, [Parameter(Mandatory=$true)] [string]$SolutionName, [Switch] $AllWebApplications, [Switch] $GACDeployment, [Switch] $Force, [Parameter(Mandatory=$false)] [string]$UrlWebApplicationFeatures = "", [Parameter(Mandatory=$false)] [string]$Features = "" ) Process { $snapin = Get-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction SilentlyContinue if ($snapin -eq $null) { Add-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction SilentlyContinue } Function Add-Solution() { Write-Host "Adding solution $SolutionName " -ForegroundColor Green -NoNewline Add-SPSolution $Path$SolutionName Write-Host "done" Write-Host "Installing solution $SolutionName " -ForegroundColor Green -NoNewline if(($AllWebApplications.IsPresent) -and ($GACDeployment.IsPresent)) { Write-Host "AllWebApplications and GACDeployment - " -NoNewline; Install-SPSolution -Identity $SolutionName -AllWebApplications -GACDeployment -Force -Confirm:$false } if(($AllWebApplications.IsPresent) -and (!$GACDeployment.IsPresent)) { Write-Host "AllWebApplications - " -NoNewline; Install-SPSolution -Identity $SolutionName -AllWebApplications -Force -Confirm:$false } if((!$AllWebApplications.IsPresent) -and ($GACDeployment.IsPresent) -and ($UrlWebApplication -eq "")) { Write-Host "GACDeployment - " -NoNewline; Install-SPSolution -Identity $SolutionName -GACDeployment -Force -Confirm:$false } if((!$AllWebApplications.IsPresent) -and (!$GACDeployment.IsPresent)-and ($UrlWebApplication -eq "")) { Install-SPSolution -Identity $SolutionName -Force -Confirm:$false } if((!$AllWebApplications.IsPresent) -and ($GACDeployment.IsPresent) -and ($UrlWebApplication -ne "")) { Write-Host "GACDeployment and one WebApplication - " -NoNewline; Install-SPSolution -Identity $SolutionName -GACDeployment -WebApplication $UrlWebApplication -Force -Confirm:$false } if((!$AllWebApplications.IsPresent) -and (!$GACDeployment.IsPresent)-and ($UrlWebApplication -ne "")) { Write-Host "One WebApplication - " -NoNewline;Install-SPSolution -Identity $SolutionName -WebApplication $UrlWebApplication -Force -Confirm:$false } Write-Host "done" if(($Features -ne "") -and ($UrlWebApplicationFeatures -ne "")) { Write-Host "Found features $Features" -ForegroundColor Green $Features.Split(';') | ForEach-Object { $Feature = $_.ToString() Write-Host "Enabling feature $Feature " -ForegroundColor Green -NoNewline Enable-SPFeature -Identity $Feature -Url $UrlWebApplicationFeatures/ -Force Write-Host "done" } } else { Write-Host "(No features to enable)" -ForegroundColor Green } } Write-Host "Preparing to add solution $SolutionName" if((Get-SPSolution | Where-Object { $_.Name -eq $SolutionName }) -ne $null) { Write-Host "Solution $SolutionName found already deployed" -ForegroundColor Green if($Force.IsPresent) { Write-Host "Removing solution $SolutionName " -ForegroundColor Green -NoNewline Remove-SPSolution -Identity $SolutionName -Force -Confirm:$false Write-Host "done" Add-Solution } else { Write-Host "Skipping" } } else { Add-Solution } return $true }
Conclusión
PowerShell es una herramienta que nos ofrece multitud de posibilidades, para hacer nuestros desarrollos más escalables y sobre todo mucho más sencillo, facilitando el ciclo de vida de la propia solución. Desde ENCAMINA disponemos de un framework para agilizar nuestros desarollos propios llamado ENMARCHA que en su parte para PowerShell facilita mucho esta labor al equipo de desarrollo.